3

我正在阅读有关 DLL 注入技术的信息,我想到了这个问题。

假设我们想将一个 DLL 注入到 Windows 7 中的目标进程中,该进程为 kernel32.dll 启用了 ASLR

因此,任何注入代码都不能使用任何 winapi 或任何系统调用,因为假设注入器代码中的 loadLibrary 函数的地址将与目标进程中的地址 loadLibrary 不同,不是吗?

所以这样的调用是CreateRemoteThread行不通的:

CreateRemoteThread(hProcess,
                   NULL,
                   0,
                   (LPTHREAD_START_ROUTINE) ::GetProcAddress(hKernel32,
                                                             "LoadLibraryA" ),
                   pLibRemote,
                   0,
                   NULL );

::WaitForSingleObject( hThread, INFINITE );

如果我在这个推理中错了,请纠正我。

4

2 回答 2

8

不,我认为这是不正确的。当机器启动时,模块的地址kernel32.dll是随机的,但对于所有进程都是相同的。

于 2011-12-19T23:34:32.160 回答
-3

他可以从 INJECTOR 的 IMPORT TABLE 中直接使用 GetModuleHandle(和 GetProcAddress),这将重定向到对 KERNEL32 上的 GetModuleHandle 的调用,以获取 KERNEL32 上 LoadLibraryA 的地址,该地址可用于任何进程

如果他直接传递硬编码的 LoadLibraryA 的地址,他将在 INJECTOR 的 IMPORT TABLE 上传递 LoadLibraryA 的地址,这在目标进程上是不一样的

有人可能会问:“为什么它不翻译导入表而不是调用 GetModuleHandle 和 GetProcAddress?”。导入表只是可执行加载器使用 THE SAME GetModuleHandle 和 GetProcAddress 获得的指针表(实际上不一样,但相似)

于 2012-06-30T17:44:08.013 回答