首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >培训师的问题(为了教育目的)

培训师的问题(为了教育目的)
EN

Stack Overflow用户
提问于 2010-01-15 22:35:59
回答 2查看 304关注 0票数 1

为了教育目的,我正在为“冰塔1.4”设计一个培训师。

我编写了一个函数,它可以这样缩短WriteProcessMemory函数:

代码语言:javascript
复制
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);
}

这就是阻止冰塔钟的功能:

代码语言:javascript
复制
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,它工作得很好。

有人知道为什么吗?谢谢。

顺便说一句:这是为了的教育目的,只有

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-01-15 22:45:58

不能将数组传递给这样的函数。拥有byte[]参数与byte *参数相同,sizeof(data)只会给出指针的大小。而且,您不应该使用&data,因为它已经是一个指针。

所以您的函数应该如下所示:

代码语言:javascript
复制
void WPM(HWND hWnd,int address, byte *data, int dataSize)
{
    //....
    WriteProcessMemory(hProcess,(LPVOID)address,data,dataSize,NULL);
    //...
}
票数 2
EN

Stack Overflow用户

发布于 2010-01-15 22:59:32

当数组被传递到函数中时,它总是通过引用传递,因此byte[]与字节*相同,并且只编写代码的第一个sizeof(byte*)字节。或者X86平台上的4个字节。

而且,看起来您正在编写的是对象代码,如果没有,则忽略这个答案的其余部分。

那么,假设您正在写入正确的位置,并且您所写的内容是正确的,那么您仍然会遇到问题--对于在目标进程中运行的线程,WriteProcessMemory不一定是原子的。

您需要确保目标线程被挂起,而不是在代码的这一部分中执行。我不知道你(可能)需要做什么样的事情来冲洗指令解码管道和或L1缓存。

编辑:现在我已经想了更多。我认为使用互斥锁来保护这段代码在执行过程中不被覆盖比挂起线程更好。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2075231

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档