让自己的dll注入到其他进程中运行
2014-11-20 12:44
148 查看
下面是一个简单的将mydll.dll注入到QQ中运行的例子:
上面完成了将dll注入进程,下面是要注入的dll的实现,其实就是一个普通的dll:
在dll入口函数中,case DLL_PROCESS_ATTACH分支即dll加载时执行处加入自己的代码,这里是弹出一个对话框。生成的mydll.dll放到system32下。
运行上面的dll注入程序,弹出了对话框,说明dll注入成功。
当然,参照注入的方法也可以在dll非入口函数中通过GetProcAddress获取要执行的函数的地址执行自己想要完成的功能。
#include <stdio.h> #include <stdlib.h> #include <windows.h> #include <tlhelp32.h> DWORD dwProcessID=0; HANDLE hProcessHandle=NULL; LPVOID pAddrStart=NULL; HANDLE hThreadHandle=NULL; HANDLE hDllHandle=NULL; /***************************** *函数名:GetProcessIdByName *功 能:根据进程名查找进程ID *入 参:const char*ProcessName,进程名 *出 参:无 *返回值:进程ID,失败返回-1 *****************************/ DWORD GetProcessIdByName(const char*ProcessName) { PROCESSENTRY32 stProcess; HWND hProcessShot; stProcess.dwSize=sizeof(PROCESSENTRY32); hProcessShot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); Process32First(hProcessShot,&stProcess); do { if(!strcmp(ProcessName,stProcess.szExeFile)) return stProcess.th32ProcessID; }while(Process32Next(hProcessShot,&stProcess)); CloseHandle(hProcessShot); return -1; } /***************************** *函数名:dll_inject *功 能:将dll注入到指定的进程中 *入 参:const char*ProcessName,进程名 const char *pDllName,dll名 *出 参:无 *返回值:成功返回0,失败返回-1 *****************************/ int dll_inject(const char *pProcessName, const char *pDllName) { //char *pProcessName="QQ.exe"; BOOL bSuccess = FALSE; //根据进程名获取进程ID dwProcessID = GetProcessIdByName(pProcessName); if(dwProcessID == -1) { printf("%s未运行", pProcessName); return -1; } printf("%s进程ID为%d", pProcessName,dwProcessID); //根据进程ID获取进程句柄 hProcessHandle = OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwProcessID); if(hProcessHandle == NULL) { printf("OpenProcess获取进程句柄失败\n"); return -1; } //用VirtualAllocEx在进程内申请内存 pAddrStart = VirtualAllocEx(hProcessHandle,0,1024,MEM_COMMIT,PAGE_EXECUTE_READWRITE); if (pAddrStart == NULL) { printf("进程内存申请失败!\n"); return; } printf("申请进程内存的首地址为0x%x\n",pAddrStart); //将需要运行的dll名写入申请的内存地址 bSuccess = WriteProcessMemory(hProcessHandle,pAddrStart,pDllName,1024,0); if(!bSuccess) { printf("WriteProcessMemory失败!\n"); return -1; } //printf("memory of pAddrStart is:%s",pAddrStart); //注入,即"LoadLibraryA"函数加载mydll.dll hThreadHandle = CreateRemoteThread(hProcessHandle, 0, 0, GetProcAddress(GetModuleHandle("kernel32.dll"),"LoadLibraryA"),//函数LoadLibraryA的地址 pAddrStart,//mydll.dll 0, 0); if(hThreadHandle == NULL) { printf("在进程%s中注入%s失败",pProcessName,pDllName); return -1; } WaitForSingleObject(hThreadHandle,INFINITE); //到这里已经完成dll的加载即注入了,通过dll函数执行我们要完成的任务 //释放 VirtualFreeEx(hProcessHandle,pAddrStart,0,MEM_RELEASE); CloseHandle(hThreadHandle); CloseHandle(hProcessHandle); printf("Hello world!\n"); return 0; } /***************************** *函数名:dll_free *功 能:卸载注入到进程中的dll *入 参:const char*ProcessName,进程名 const char *pDllName,dll名 *出 参:无 *返回值:成功返回0,失败返回-1 *****************************/ int dll_free(const char *pProcessName, const char *pDllName) { BOOL bSuccess = FALSE; //根据进程名获取进程ID dwProcessID = GetProcessIdByName(pProcessName); if(dwProcessID == -1) { printf("%s未运行", pProcessName); return -1; } printf("%s进程ID为%d", pProcessName,dwProcessID); //根据进程ID获取进程句柄 hProcessHandle = OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwProcessID); if(hProcessHandle == NULL) { printf("OpenProcess获取进程句柄失败\n"); return -1; } //用VirtualAllocEx在进程内申请内存 pAddrStart = VirtualAllocEx(hProcessHandle,0,1024,MEM_COMMIT,PAGE_EXECUTE_READWRITE); if (pAddrStart == NULL) { printf("进程内存申请失败!\n"); return; } printf("申请进程内存的首地址为0x%x\n",pAddrStart); //将需要运行的dll名写入申请的内存地址 bSuccess = WriteProcessMemory(hProcessHandle,pAddrStart,pDllName,1024,0); if(!bSuccess) { printf("WriteProcessMemory失败!\n"); return -1; } //注入,即GetModuleHandleA函数获取mydll.dll的实例,目的是为了后面的通过GetExitCodeThread获得mydll.dll的句柄,最后执行FreeLibrary hThreadHandle = CreateRemoteThread(hProcessHandle, 0, 0, GetProcAddress(GetModuleHandle("kernel32.dll"),"GetModuleHandleA"),//函数GetModuleHandleA的地址 pAddrStart,//mydll.dll 0, 0); //用GetExitCodeThread取出dll句柄 WaitForSingleObject(hThreadHandle,INFINITE); GetExitCodeThread(hThreadHandle,&hDllHandle); //把FreeLibrary注入到进程,释放注入的DLL hThreadHandle=CreateRemoteThread(hProcessHandle, 0, 0, GetProcAddress(GetModuleHandle("kernel32.dll"),"FreeLibrary"), hDllHandle, 0, 0); //释放 WaitForSingleObject(hThreadHandle,INFINITE); VirtualFreeEx(hProcessHandle,pAddrStart,0,MEM_RELEASE); CloseHandle(hThreadHandle); CloseHandle(hProcessHandle); return 0; } int main() { //将mydll.dll注入到QQ中 dll_inject("QQ.exe","mydll.dll"); //卸载注入的dll dll_free("QQ.exe","mydll.dll"); printf("Hello world!\n"); return 0; }
上面完成了将dll注入进程,下面是要注入的dll的实现,其实就是一个普通的dll:
#include "main.h" // a sample exported function void DLL_EXPORT SomeFunction(const LPCSTR sometext) { MessageBoxA(0, sometext, "DLL Message", MB_OK | MB_ICONINFORMATION); } extern "C" DLL_EXPORT BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { switch (fdwReason) { case DLL_PROCESS_ATTACH: // attach to process // return FALSE to fail DLL load MessageBoxA(0, "I am a dll!", "DLL Message", MB_OK | MB_ICONINFORMATION); break; case DLL_PROCESS_DETACH: // detach from process break; case DLL_THREAD_ATTACH: // attach to thread break; case DLL_THREAD_DETACH: // detach from thread break; } return TRUE; // succesful }
在dll入口函数中,case DLL_PROCESS_ATTACH分支即dll加载时执行处加入自己的代码,这里是弹出一个对话框。生成的mydll.dll放到system32下。
运行上面的dll注入程序,弹出了对话框,说明dll注入成功。
当然,参照注入的方法也可以在dll非入口函数中通过GetProcAddress获取要执行的函数的地址执行自己想要完成的功能。
相关文章推荐
- VC程序中如何结束系统正在运行的其他进程
- 《Windows程序设计》[第二版] - 第2章 Win32程序运行原理 - 其他进程内存修改器
- 请问HOOK自己进程API写函数头写到一半,其他线程执行该API时怎么办?
- Android程序杀死自己的进程和其他程序进程方法
- Linux 简单shell创建自己的守护进程,自动重启,纪录进程运行状态,日志切割压缩
- 向一个运行中的进程注入自己的代码
- 深入解析父子线程(父子线程相互独立,子线程使用自己的栈空间,进程要等到所有线程终止运行之后才终止运行)
- 防火墙 windows 错误1079 此服务的账户不同于运行于同一进程中的其他服务账户
- MFC 对于使用自己的线进行启动其他进程的虚拟地址映射问题
- 因为远程,电脑开启防火墙 错误1079 此服务的账户不同于运行于同一进程中的其他服务账户
- 重定向已经运行进程的标准输出到文件的办法(通过ptrace注入代码到其他进程并运行)
- 启动其他apk中的activity,使其运行在本进程中
- 如何解决win7系统错误1079:此服务的帐户不同于运行于同一进程上的其他服务的帐户
- Windows调用其他应用程序或者杀死正在运行或无法手动杀死的进程的方法
- windows sdk编程系列文章 ---- 利用APC实现向一个运行中的进程注入自己的代码
- WebBrowser.Navigate异步运行,使其与其他进程同步的方法
- VC程序中如何结束系统正在运行的其他进程 以及本程序自身
- 解决:windows无法启动windows audio服务{位于本地计算机上}错误1079,此服务的账户不同于运行同一进程上的其他服务的账户
- 实现HOOK其他进程的Messagebox(2) DLL注入工具(2)
- MFC 程序不依赖.NET的设置方法 使自己写的程序可以在其他上电脑运行