6

首先,我不想注入 dll。我想使用 WriteProcessMemory() 注入代码(如果这可能的话)。我已经使用了 ReadProcessMemory(),所以我认为写作没什么大不了的。
好吧,假设 TargetProgram.exe+D78C612 有一个函数,
假设它可以这样调用:

push eax
push [esp+08]
push edx
push 00
push TargetProgram.exe+AF76235
push 04
call TargetProgram.exe+D78C612

我将如何使用 WriteProcessMemory() 完成此操作?
我的意思是我在哪里可以找到可以在不覆盖重要内容的情况下注入代码的部分。最重要的是,我将如何调用该函数?
只需在活动例程中跳转到我的代码,然后跳转回来并删除它?但我怎么能找到例行公事呢?
这么多问题,我不知道如何开始......我希望你能帮助我。:)
如果你有时间,我真的很想看一个函数调用注入的示例代码。

4

2 回答 2

4

您可以使用VirtualAllocEx在远程进程中分配内存,然后将您的过程复制到此内存中。

以下是进行注射的步骤:

SuspendThread(hThread); // Suspend the remote thread
remote_address = VirtualAllocEx(hProcess, ...) // allocate memory for your code
WriteProcessMemory(hProcess, remote_address, local_address, length, NULL)  // copy your code to remote process
WriteProcessMemory(hProcess, remote_fixup, ...) // insert a jump to your code 
ResumeThread(hThread); // Resume the remote thread
于 2013-10-30T20:32:41.623 回答
1

正如 Max 的回答所提到的,VirtualAllocEx是在远程进程中分配内存页的一种方法,假设您具有相关进程的PROCESS_VM_OPERATION访问权限。您还需要确保在写入期间将新页面标记为PAGE_EXECUTE_READWRITE以获取其保护级别,然后稍后将其更改为PAGE_EXECUTE_READ使用VirtualProtectEx

请注意,x86 中的分支和一些调用指令是 IP 相关的。这意味着它们的编码取决于它们在内存中的位置,因为它们使用指令末尾的有符号相对位移。因此,如果您打算从新代码中调用现有函数,请确保在使用相对调用指令时考虑到这一点,或者改用间接/立即形式。

但是,如果不确切知道您要在这里完成什么,就很难推荐一种执行新目标代码的技术。有了新代码,您只需使用CreateRemoteThread注入一个远程线程即可执行它,而无需中断任何现有线程。这将是执行新代码的最简单的解决方案,但要求您调用的代码是线程安全的。至少可以说,选择一个已经在运行的线程、暂停它、修改 EIP 或引入一个弯路,然后在没有副作用的情况下恢复它(在注入的调用中正确保存上下文)是非常棘手的。

个人说明:作为 Visual Studio 2012 中代码覆盖工具的作者,该工具使用一系列技巧动态重写第三方 x86/x86-64 代码以收集覆盖数据,这东西非常有趣破解并思考:)

于 2013-10-30T21:32:11.950 回答