Kev*_*ose 1 c++ dll winapi ipc
好吧,我正在使用CreateRemoteThread/LoadLibrary "技巧" 将一些代码注入另一个进程.
我最终得到了一个线程ID,并且我选择了一个带有我选择的DLL的进程.至少在理论上,DLL目前什么都不做,因此验证这有点棘手.暂时我愿意仅靠信仰接受它.此外,在我朝这个方向努力之前,需要回答这个问题.
基本上,你不能阻止DllMain.但是,所有我必须与远程线程进行通信的是它的id.这实际上是为了阻止PostThreadMessage/GetMessage的恶作剧.我可以在DllMain中启动另一个线程,但我无法将其id传回给创建线程,也无法将另一个线程的id传递给远程线程.
简而言之,如果我在一个过程中创建一个远程线程,我该如何与原始进程通信?
步骤零; 注入DLL应该有一个切入点,让我们把它Init()
接受一个LPCWSTR
作为其唯一的参数,返回一个int
; 即相同的签名LoadLibrary()
,因此与线程启动函数地址同等有效...
第一步; 使用加载库和远程线程注入.注入的DLL中没有任何巧妙之处DLLMain()
.存储HMODULE
作为注入线程的退出代码返回的,这是HMODULE
注入的DLL和返回值LoadLibrary()
.
请注意,如果/DYNAMICBASE
启用ASLR(地址空间布局随机化)并且ASLR(地址空间布局随机化)被启用,这不再是x64上的可靠方法,因为HMODULE
on x64大于DWORD
返回的值,GetThreadExitCode()
并且地址空间更改意味着它不再像该HMODULE
值那样可能小到足以适应DWORD
.有关使用共享内存进行通信的工作,请参阅下面的注释和链接的问题(此处)HMODULE
第二步; 使用LoadLibrary将注入的DLL加载到正在执行注入的进程中.然后Init()
在地址空间中找到入口点的偏移量,并从地址空间中减去已HMODULE
注入的DLL的值.您现在拥有该Init()
函数的相对偏移量.获取HMODULE
目标进程中注入的DLL(即您在第一步中保存的值)并添加相对地址Init()
.您现在拥有Init()
目标流程中的地址.
第三步; Init()
使用您以前调用的相同"远程线程"方法调用目标进程LoadLibrary()
.你可以将一个字符串传递给Init()调用,这可以是你想要的任何东西.
我倾向于传递一个唯一的字符串键,我将其用作命名管道名称的一部分.Injected DLL和注入过程现在都知道命名管道的名称,您可以在它们之间进行通信.该Init()
函数不会DLLMain()
也不会受到影响的限制DLLMain()
(因为它不是从内部调用LoadLibrary
等),因此您可以在其中执行常规操作.一旦注入的DLL和注入过程通过命名管道连接,您就可以根据需要来回传递命令和数据结果.由于您将Init()
函数传递给字符串,因此您可以确保命名管道对于此注入过程的特定实例是唯一的,并且此特定注入的DLL意味着您可以同时运行注入过程的多个实例,并且每个过程都可以注入进入多个目标流程,所有这些沟通渠道都是独特和可控的.
归档时间: |
|
查看次数: |
5351 次 |
最近记录: |