为了教育目的,我正在为“冰塔1.4”设计一个培训师。
我编写了一个函数,它可以这样缩短WriteProcessMemory函数:
void WPM(HWND hWnd,int address,byte data[])
{
DWORD proc_id;
GetWindowThreadProcessId(hWnd, &proc_id);
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, proc_id);
if(!hProcess)
return;
DWORD dataSize = sizeof(data);
WriteProcessMemory(hProcess,(LPVOID)address,&data,dataSize,NULL);
CloseHandle(hProcess);
}这就是阻止冰塔钟的功能:
void ClockHack(int status)
{
if(status==1)//enable
{
//crashes the game
byte data[]={0xc7,0x05,0x04,0x11,0x45,0x00,0x00,0x00,0x00,0x00};
WPM(FindIcyTower(),0x00415E19,data);
}
else if(status==0)//disable
{
byte data[]={0xA3,0x04,0x11,0x45,0x00};
}
}在there语句中,有Opcode的原始AOB。当我调用状态参数设置为1的ClockHack函数时,游戏就会崩溃。
在欺骗引擎中,我为这个脚本编写了一个脚本,它不完全写到同一个地址,因为我写了Code,它工作得很好。
有人知道为什么吗?谢谢。
顺便说一句:这是为了的教育目的,只有。
发布于 2010-01-15 22:45:58
不能将数组传递给这样的函数。拥有byte[]参数与byte *参数相同,sizeof(data)只会给出指针的大小。而且,您不应该使用&data,因为它已经是一个指针。
所以您的函数应该如下所示:
void WPM(HWND hWnd,int address, byte *data, int dataSize)
{
//....
WriteProcessMemory(hProcess,(LPVOID)address,data,dataSize,NULL);
//...
}发布于 2010-01-15 22:59:32
当数组被传递到函数中时,它总是通过引用传递,因此byte[]与字节*相同,并且只编写代码的第一个sizeof(byte*)字节。或者X86平台上的4个字节。
而且,看起来您正在编写的是对象代码,如果没有,则忽略这个答案的其余部分。
那么,假设您正在写入正确的位置,并且您所写的内容是正确的,那么您仍然会遇到问题--对于在目标进程中运行的线程,WriteProcessMemory不一定是原子的。
您需要确保目标线程被挂起,而不是在代码的这一部分中执行。我不知道你(可能)需要做什么样的事情来冲洗指令解码管道和或L1缓存。
编辑:现在我已经想了更多。我认为使用互斥锁来保护这段代码在执行过程中不被覆盖比挂起线程更好。
https://stackoverflow.com/questions/2075231
复制相似问题