详细的注入代码实现可参考链接中的第二部分:
http://www.codeproject.com/Articles/4610/Three-Ways-to-Inject-Your-Code-into-Another-Proces
网上大多数用CreateRemoteThread LoadLibrary 这种方式注入DLL的博文最终都参考这个链接。我修改了部分代码,输入pid注入对应的进程,本文仅记录注入过程中遇到意外和解决途径
1.调用OpenProcess会失败,加入以下提升进程权限的代码
#pragma comment(lib,"Advapi32.lib")
LUID luidTmp;
HANDLE hToken;
TOKEN_PRIVILEGES tokenP;
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luidTmp);
tokenP.PrivilegeCount = 1;
tokenP.Privileges[0].Luid = luidTmp;
tokenP.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tokenP, sizeof(tokenP), NULL, NULL);
可能能解决一部分问题;
2.要想成功注入,最重要的一点是新创建一台虚拟机,所有的测试全在那完成,当然能免杀就随便了
3.调用VirtualAllocEx和WriteProcessMemory后,如何查看dll名字是否成功写进指定进程?这时祭出windbg,attach进将要被注入的进程,查看VirtualAllocEx的返回值所指向的地址(da 0xXXXXXXXX)
4.再然后,虽然ThreadRemoteThread创建线程成功,但是dll运行出错怎么调试?在dll的入口处加入_asm int 3,在注入前依然用windbg attach目标进程,重新注入-运行这时windbg会触发断点异常,就可以调试了~
下面是我的dll的例子:
注入代码后,线程遇到MessageBox,弹出对话框,此时,windbg附加到目标进程。然后MessageBox返回,就能遇到int 0x03了