远程线程注入(二)线程注入
这里我们要用到上篇中的那个 msg.dll
下面的代码还是使用的统一的宽字符版本,已经在VS2010下编译通过。
首先上代码,然后慢慢解释:
//关闭句柄 if (pszLibFileRemote != NULL) VirtualFreeEx(hProcess, (PVOID)pszLibFileRemote, 0, MEM_RELEASE); if (hThread != NULL) CloseHandle(hThread); if (hProcess != NULL) CloseHandle(hProcess);
运行一下,发现成功了!~~~
最后栋哥跟我提醒了几点:
1.关于进程令牌的代码,有时候不写也是可以通过的。这里还有待研究一下。
2.被注入的程序有时候要放在相对目录下才会产生效果。关于这点自己还没有实践过。有待验证。
3.像explorer.exe有时候会无法注入。换个简单的calc.exe完全可以。火狐,qq全部都可以。可能是explorer.exe有点特别。
4.第一次远程注入可以成功,第二次就不行了,就不能弹出对话框了,貌似进程打开之后马上就关闭了。个人以为原因可能处在dll的fdwReason。有时间尝试着调试一下。
自己改了一下,应该是这样的。上面的代码里面没有FreeLibrary,那么dll还是在远程地址空间里面。第二次想要注入的时候是不会发送DLL_PROCESS_ATTACH 消息的。
DLL_PROCESS_ATTACH消息的发送是这样的:
线程调用LoadLibrary --> Dll是否已经被映射到了进程的地址空间中 (如果是) --> 递增DLL的使用计数 --> 使用计数器是否等于1 (如果是) --> 调用DLL的DllMain并且传入DLL_PROCESS_ATTACH
所以说,在Dll已经被映射到了进程地址空间之后,只不过DLL的使用计数增加了,如果是2,那么很明显就不会调用DLL的DllMain并且传入DLL_PROCESS_ATTACH
但是如果我把dll改一下,把弹框代码写在DLL_THREAD_ATTACH里面,那么每次创建线程的时候就都会收到DLL_THREAD_ATTACH消息了。
关于远程线程注入就先讲到这里。当然这些都是最简单的最基本的东西。
自己有时间去看看核心编程,顺便进一步了解下操作系统。