破解另一个库的内存
Posted
技术标签:
【中文标题】破解另一个库的内存【英文标题】:Hacking the memory of another library 【发布时间】:2012-01-11 20:56:30 【问题描述】:我正在尝试启动或访问一个扫雷器实例来挂钩并按需调用它的函数以进行一些操作并创建一个求解器。我尝试了两种方法:使用它启动一个进程,并使用在线找到的方法将我的 dll 注入其中。两者最终都遇到了同样的问题:当我从我的程序或注入的库中访问扫雷库的内存时,我收到错误 998。你建议我做什么?我不太了解 Windows API,所以我不知道问题是出在我正在使用的方法上,还是我需要做一些额外的函数调用或更改一些设置。
【问题讨论】:
如果您的目标是模拟扫雷,那么最好自己编写类似扫雷的游戏模型。 我的目标是触发扫雷功能并钩住它们。我没有问题,因为我已经这样做了,但是库驻留在我的内存空间中(不知道正确的说法)。我的意思是:我对黑客的部分没有问题,只是在内存权限的部分。其余的对我来说很容易。 你写的哪些代码不起作用? 没有人能用如此稀疏的信息很好地回答。如果你想调用函数,那么你需要在进程中。但是你认为这些函数调用如何被调用呢?这不是你的过程。你不负责。 您应该将代码直接粘贴到您的问题中。 【参考方案1】:您的问题很可能是您试图在不更改页面保护的情况下写入目标内存。可执行页面通常是只读的(并且是可执行的)。您需要使用VirtualProtect 更改此保护。通常会执行这样的代码:
DWORD flOldProtect;
VirtualProtect((LPVOID)from, 5, PAGE_EXECUTE_READWRITE, &flOldProtect);
...
VirtualProtect((LPVOID)from, 5, flOldProtect, &flOldProtect);
此代码更改了保护,因此您可以对其进行写入。您将在...
中执行您的挂钩代码等,然后恢复页面保护。 Here 是我不久前为某人编写的一个非常基础的培训师,它通过 DLL 注入工作。
【讨论】:
:D 不幸的是,我在调用 VirtualProtect(或仅通过访问内存)时遇到了这些错误。 顺便说一句,知道 Minesweeper 在内存中保存一个字节数组来记录地雷的位置可能会对您有所帮助。这意味着您可以直接读取它,并在注入 DLL 后立即知道哪些单元格包含炸弹。 迈克·夸恩,pastebin.com/y4gktDVA。显示“返回 0 错误代码 998”。注意:dll编译为64位。 您在调用VirtualProtect
时指定oldProtection
的位置应该是&oldProtection
。此外,您真的不应该在DllMain
中执行您的工作,因为这应该会立即返回。常见的做法(即使它在技术上被忽视)是在DllMain
创建一个线程。 正确的方法是从注入器调用的DLL中导出init
函数。
这是个问题。 API 接受oldProtection
并将其视为一个指针并尝试在那里写入一个值。由于您将 NULL
分配给它,它会尝试写入地址 0。作为一个单独的问题,我相信 JMP 在 x86-64 上不是 5 个字节。以上是关于破解另一个库的内存的主要内容,如果未能解决你的问题,请参考以下文章