DLL注入其他进程技术
阅读本篇文章,需要有《线程注入其他进程技术》基础。
DLL注入技术才具有强大的功能和使用性,同时简单易用,因为DLL中可以实现复杂的功能和很多的技术。
技术要点:
1、宿主进程调用LoadLibrary,就可以完成DLL的远程注入。可以通过CreateRemoteThread将LoadLibrary作为宿主进程的一个线程来启动,就可以完成“控制目标进程调用LoadLibrary”的工作。
2、标准DLL中DllMain,是DLL执行的入口;使用MFC的DLL中InitInstance,是DLL执行的入口,但是没有消息循环。
注意:
a、如果是需要多线程,只能使用有DLLMain的标准DLL。因为使用MFC的DLL,在InitInstance中启动新的线程,会在启动线程的地方阻塞不继续执行。即说,使用带MFC的DLL只能单线程作业。
b、如果需要使用多线程和MFC。可以在标准DLL中先启动线程,再调用使用MFC的DLL。
实现步骤
1、将DLL的地址拷贝到宿主进程地址空间中
2、通过CreateRemoteThread将LoadLibrary作为宿主进程的一个线程来启动
可以正确运行的示例代码(拷贝后直接可以使用):
应用程序文件内容:
// #pragma once #include <windows.h> #include <TlHelp32.h> #include <iostream> #include <time.h> // 提升进程访问权限 bool enableDebugPriv() { HANDLE hToken; LUID sedebugnameValue; TOKEN_PRIVILEGES tkp; if ( !OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken) ) { return false; } if( !LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &sedebugnameValue) ) { CloseHandle(hToken); return false; } tkp.PrivilegeCount = 1; tkp.Privileges[0].Luid = sedebugnameValue; tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; if( !AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof(tkp), NULL, NULL) ) { CloseHandle(hToken); return false; } return true; } |