简单DLL注入
简单的dll注入:DLL注入就是将一个DLL放进某个进程的地址空间里,让它成为那个进程的一部分。
dll注入的步骤:
- 附加目标进程
- 在目标进程中申请一个空间
- 把dll的路径写入到目标进程的内存空间
- 创建一个远程线程,让目标进程调用句柄
- 释放空间
注入dll的代码:
#include "stdlib.h" #include#include #include //注入dll函数的实现 bool Inject(DWORD dwId, //目标进程PID WCHAR *szPath)//DLL路径 { HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,//获取进程权限 FALSE,//表示所得的进程是否可以被继承 dwId);//被打开进程的PID //执行成功分配内存单元的首地址,不成功就为NULL LPVOID pRemoteAddress = VirtualAllocEx(hProcess,//目标句柄 NULL,//保留页面的内存地址,一般NULL自动分配 1,//预分配的内存大小,字节单位 MEM_COMMIT,//为特定的页面区域分配内存中或磁盘的页面文件中的物理存储 PAGE_READWRITE);//区域可被应用程序读写 DWORD dwWriteSize = 0; WriteProcessMemory(hProcess,//OpenProcess返回来的句柄 pRemoteAddress, //准备写入的内存地址 szPath, wcslen(szPath)*2+2, //要写入的字节数 &dwWriteSize); //返回值,返回写入的字节 HANDLE hThread = CreateRemoteThread(hProcess, //该远程线程属进程的句柄 NULL, //一个指向SECURITY_ATTRIBUTES结构体的指针,该结构体指定线程的安全属性 0, //线程栈初始化大小,如果为0,那么使用系统默认的大小 (LPTHREAD_START_ROUTINE)LoadLibrary, //在远程进程地址空间中,该线程的起始位置 pRemoteAddress, //传给线程函数的参数(刚才在内存中写入的东西) NULL, //控制线程创建标志,NULL表示线程正在运行 NULL);//指向接收线程标识符的变量指针,如果为NULL,则不返回标识符 //返回线程句柄 WaitForSingleObject(hThread, -1);//当句柄所指定的线程有信号的时候,才会返回 VirtualFreeEx(hProcess,//目标进程句柄 pRemoteAddress,//只想要释放的空间 1, //虚拟内存空间的字节数 MEM_COMMIT);//MEM_COMMIT仅标示内存空间不可用 return 0; } int _tmain(int argc, _TCHAR *argv[]) { wchar_t szPath[] = L"D:\\myhack.dll"; //要注入的dll DWORD dwId = 0; HWND hCalc = FindWindow(NULL,L"QQ"); if(hCalc == NULL) { MessageBox(NULL,L"获取窗口句柄失败!",L"提示",MB_OK); } DWORD dwPid = 0; DWORD dwRub = GetWindowThreadProcessId(hCalc, &dwPid); if(dwPid == NULL) { MessageBox(NULL,L"获取目标进程pid失败!",L"提示",MB_OK); } Inject(dwPid, szPath); //注入dll函数 //system("pause"); return 0; }
基本dll编写代码:
#includeBOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, //调用DllMain时赋值为DLL_PROCESS_ATTACH LPVOID lpReservd) { switch(ul_reason_for_call) { case DLL_PROCESS_ATTACH: MessageBoxA(NULL,"hello word!","你好呀!",MB_OK|MB_TOPMOST); break; } return TRUE; }