这是来源的一部分:
#include <stdio.h>
#include <Windows.h>
#include <iostream>
#include <ctime>
#include <cstdlib>
#define WPM(x,y,z,l) WriteProcessMemory((HANDLE)x, (LPVOID)y, (LPCVOID)z, l, NULL)
#define WNOP(x,y,l) for(int n=0; n<l; n++)WriteProcessMemory((HANDLE)((char*)x + n), (LPVOID)y, "\x90", 1);
bool salir = false;
void DisableACI(const HANDLE hProcess = NULL)
{
WNOP(hProcess, 0x1000DDC4, 0x49);
WPM(hProcess, 0x10004D20, "\xB0\x00\xC3", 3);
WNOP(hProcess, 0x1000DDCB, 7);
WPM(hProcess, 0x420AB0, "\xB8\x58\x10\x00\x00", 5);
WPM(hProcess, 0x10004FF0, "\xC3", 1);
WNOP(hProcess, 0x4AFF59, 6);
}
我得到了这个错误:
智能感知:函数调用中少数参数
&#39; WriteProcessMemory的&#39; :function不接受 4 参数。
答案 0 :(得分:2)
如果你得到错误“函数调用中的参数太少”,解决这个问题的方法是将更多参数传递给你的函数调用。
参数的类型应该与函数调用所期望的参数匹配。
如果代码正在做什么被宏遮挡,请尝试将标志传递给编译器以扩展所述宏并编译生成的源,或者只是手动展开它们并检查生成的源。
编写使用这种宏的代码并不是一个好主意。删除宏,直接调用该函数。然后检查签名到WriteProcessMemory
。
在宏中放置一个非平凡的for
循环是一个可怕的想法。它使您的代码难以调试或理解。停止。
如果需要对函数进行一些处理,请编写一个包装函数。在99%以上的情况下,包装函数将更易于阅读,更容易理解错误消息,并且如果您使用inline
和/或在调用时可以看到定义,则不会让您获得任何性能站点。
所以删除这两个宏:
#define WPM(x,y,z,l) WriteProcessMemory((HANDLE)x, (LPVOID)y, (LPCVOID)z, l, NULL)
#define WNOP(x,y,l) for(int n=0; n<l; n++)WriteProcessMemory((HANDLE)((char*)x + n), (LPVOID)y, "\x90", 1);
并编写一些函数:
BOOL WPM(HANDLE x, void* y, void const* z, SIZE_T l) {
return WriteProcessMemory(x, y, z, l, NULL);
}
BOOL WNOP(HANDLE x,void* y, SIZE_T l) {
BOOL all_worked = TRUE;
for(int n=0; n<l; n++) {
all_worked = WriteProcessMemory((HANDLE)((char*)x + n), y, "\x90", 1) && all_worked;
}
return all_worked;
}
此时错误的位置变得明显。您可能必须对您的值进行强制转换,因为它们与它们应该匹配的类型不匹配,但强制转换不应隐藏在宏后面。
完成这些演员表后,修复变得显而易见:
BOOL WNOP(HANDLE x,void* y, SIZE_T l) {
BOOL all_worked = TRUE;
for(int n=0; n<l; n++) {
all_worked = WriteProcessMemory((HANDLE)((char*)x + n), y, "\x90", 1, NULL) && all_worked;
}
return all_worked;
}
虽然这个编译,但它仍然充满了问题。除了快速阅读其文档及其名称之外,我对WriteProcessMemory
不熟悉。它的名字表明,如果你是一位经验丰富的程序员,那么你应该只是打电话给他们。#34;没有足够的论据&#34;不是你在Stack Overflow上问的问题:在你理解基本的C ++之前不要写其他进程。网页表明你的论点非常奇怪,至少据我所知。
句柄应该是PROCESS的句柄,指针值y
应该是来自其空间的值。 WNOP似乎没有做任何合理的事情。
WNOP
除了'\x90'
之外什么都没有写,这看起来很奇怪。
修复了您的函数版本:
// Intended to be called with `"a string"` in `string_to_write`:
template<unsigned N>
BOOL WPM(HANDLE process, void* address_in_process, char const(&string_to_write)[N]) {
// -1 to skip the `'\0'`.
ASSERT( string_to_write[N-1] == '\0' );
return WriteProcessMemory(process, address_in_process, &string_to_write[0], N-1, NULL);
}
// does something!
BOOL WNOP(HANDLE process,void* address_in_process, char char_to_write, SIZE_T copies_to_write) {
BOOL all_worked = TRUE;
for(int n=0; n<l; n++) {
char* write_target = reinterpret_cast<char*>(address_in_process) + n;
all_worked = WriteProcessMemory(process, write_target, &char_to_write, 1) && all_worked;
}
return all_worked;
}
void DisableACI(const HANDLE hProcess)
{
WNOP(hProcess, (void*)0x1000DDC4, '\x90', 0x49);
WPM (hProcess, (void*)0x10004D20, "\xB0\x00\xC3");
WNOP(hProcess, (void*)0x1000DDCB, '\x90', 7);
WPM (hProcess, (void*)0x00420AB0, "\xB8\x58\x10\x00\x00");
WPM (hProcess, (void*)0x10004FF0, "\xC3" );
WNOP(hProcess, (void*)0x004AFF59, '\x90', 6);
}
请注意,将hProcess
设为默认值NULL
似乎也是一个可怕的想法?
答案 1 :(得分:0)
你错过了最后一个参数(NULL):
WriteProcessMemory((HANDLE)((char*)x + n), (LPVOID)y, "\x90", 1);