看流星社区

 找回密码
 注册账号
查看: 2025|回复: 0

C++ DLL远程注入与卸载函数

[复制链接]

该用户从未签到

发表于 2018-3-1 11:04:35 | 显示全部楼层 |阅读模式

代码是别处的
第一个函数是成功的,第二个函数运行发现会将目标程序挂死,也许是目标程序有保护机制
支持Unicode编码。


  1.     //-----------------------------------------------------------------------------------------------------------  
  2.     // 函数: InjectDll  
  3.     // 功能: 向目标进程中注入一个指定 Dll 模块文件.  
  4.     // 参数: [in] const TCHAR* ptszDllFile - Dll 文件名及路径  
  5.     //       [in] DWORD dwProcessId - 目标进程 ID  
  6.     // 返回: bool - 注入成功返回 true, 注入失败则返回 false.  
  7.     // 说明: 采用远程线程注入技术实现  
  8.     //-----------------------------------------------------------------------------------------------------------  
  9.     bool InjectDll(const TCHAR* ptszDllFile, DWORD dwProcessId)  
  10.     {  
  11.         // 参数无效  
  12.         if (NULL == ptszDllFile || 0 == ::_tcslen(ptszDllFile))  
  13.         {  
  14.             return false;  
  15.         }  
  16.         // 指定 Dll 文件不存在  
  17.         if (-1 == _taccess(ptszDllFile, 0))  
  18.         {  
  19.             return false;  
  20.         }  
  21.         HANDLE hProcess = NULL;  
  22.         HANDLE hThread = NULL;  
  23.         DWORD dwSize = 0;  
  24.         TCHAR* ptszRemoteBuf = NULL;  
  25.         LPTHREAD_START_ROUTINE lpThreadFun = NULL;  
  26.         // 获取目标进程句柄  
  27.         hProcess = ::OpenProcess(PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION | PROCESS_VM_WRITE, FALSE, dwProcessId);  
  28.         if (NULL == hProcess)  
  29.         {  
  30.             return false;  
  31.         }  
  32.         // 在目标进程中分配内存空间  
  33.         dwSize = (DWORD)::_tcslen(ptszDllFile) + 1;  
  34.         ptszRemoteBuf = (TCHAR*)::VirtualAllocEx(hProcess, NULL, dwSize * sizeof(TCHAR), MEM_COMMIT, PAGE_READWRITE);  
  35.         if (NULL == ptszRemoteBuf)  
  36.         {  
  37.             ::CloseHandle(hProcess);  
  38.             return false;  
  39.         }  
  40.         // 在目标进程的内存空间中写入所需参数(模块名)  
  41.         if (FALSE == ::WriteProcessMemory(hProcess, ptszRemoteBuf, (LPVOID)ptszDllFile, dwSize * sizeof(TCHAR), NULL))  
  42.         {  
  43.             ::VirtualFreeEx(hProcess, ptszRemoteBuf, dwSize, MEM_DECOMMIT);  
  44.             ::CloseHandle(hProcess);  
  45.             return false;  
  46.         }  
  47.         // 从 Kernel32.dll 中获取 LoadLibrary 函数地址  
  48.     #ifdef _UNICODE  
  49.         lpThreadFun = (PTHREAD_START_ROUTINE)::GetProcAddress(::GetModuleHandle(_T("Kernel32")), "LoadLibraryW");  
  50.     #else  
  51.         lpThreadFun = (PTHREAD_START_ROUTINE)::GetProcAddress(::GetModuleHandle(_T("Kernel32")), "LoadLibraryA");  
  52.     #endif  
  53.         if (NULL == lpThreadFun)  
  54.         {  
  55.             ::VirtualFreeEx(hProcess, ptszRemoteBuf, dwSize, MEM_DECOMMIT);  
  56.             ::CloseHandle(hProcess);  
  57.             return false;  
  58.         }  
  59.         // 创建远程线程调用 LoadLibrary  
  60.         hThread = ::CreateRemoteThread(hProcess, NULL, 0, lpThreadFun, ptszRemoteBuf, 0, NULL);  
  61.         if (NULL == hThread)  
  62.         {  
  63.             ::VirtualFreeEx(hProcess, ptszRemoteBuf, dwSize, MEM_DECOMMIT);  
  64.             ::CloseHandle(hProcess);  
  65.             return false;  
  66.         }  
  67.         // 等待远程线程结束  
  68.         ::WaitForSingleObject(hThread, INFINITE);  
  69.         // 清理  
  70.         ::VirtualFreeEx(hProcess, ptszRemoteBuf, dwSize, MEM_DECOMMIT);  
  71.         ::CloseHandle(hThread);  
  72.         ::CloseHandle(hProcess);  
  73.         return true;  
  74.     }  
  75.     //-----------------------------------------------------------------------------------------------------------  
  76.     // 函数: UnInjectDll  
  77.     // 功能: 从目标进程中卸载一个指定 Dll 模块文件.  
  78.     // 参数: [in] const TCHAR* ptszDllFile - Dll 文件名及路径  
  79.     //       [in] DWORD dwProcessId - 目标进程 ID  
  80.     // 返回: bool - 卸载成功返回 true, 卸载失败则返回 false.  
  81.     // 说明: 采用远程线程注入技术实现  
  82.     //-----------------------------------------------------------------------------------------------------------  
  83.     bool UnInjectDll(const TCHAR* ptszDllFile, DWORD dwProcessId)  
  84.     {  
  85.         // 参数无效  
  86.         if (NULL == ptszDllFile || 0 == ::_tcslen(ptszDllFile))  
  87.         {  
  88.             return false;  
  89.         }  
  90.         HANDLE hModuleSnap = INVALID_HANDLE_VALUE;  
  91.         HANDLE hProcess = NULL;  
  92.         HANDLE hThread = NULL;  
  93.         // 获取模块快照  
  94.         hModuleSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcessId);  
  95.         if (INVALID_HANDLE_VALUE == hModuleSnap)  
  96.         {  
  97.             return false;  
  98.         }  
  99.         MODULEENTRY32 me32;  
  100.         memset(&me32, 0, sizeof(MODULEENTRY32));  
  101.         me32.dwSize = sizeof(MODULEENTRY32);  
  102.         // 开始遍历  
  103.         if(FALSE == ::Module32First(hModuleSnap, &me32))  
  104.         {  
  105.             ::CloseHandle(hModuleSnap);  
  106.             return false;  
  107.         }  
  108.         // 遍历查找指定模块  
  109.         bool isFound = false;  
  110.         do  
  111.         {  
  112.             isFound = (0 == ::_tcsicmp(me32.szModule, ptszDllFile) || 0 == ::_tcsicmp(me32.szExePath, ptszDllFile));  
  113.             if (isFound) // 找到指定模块  
  114.             {  
  115.                 break;  
  116.             }  
  117.         } while (TRUE == ::Module32Next(hModuleSnap, &me32));  
  118.         ::CloseHandle(hModuleSnap);  
  119.         if (false == isFound)  
  120.         {  
  121.             return false;  
  122.         }  
  123.         // 获取目标进程句柄  
  124.         hProcess = ::OpenProcess(PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION, FALSE, dwProcessId);  
  125.         if (NULL == hProcess)  
  126.         {  
  127.             return false;  
  128.         }  
  129.         // 从 Kernel32.dll 中获取 FreeLibrary 函数地址  
  130.         LPTHREAD_START_ROUTINE lpThreadFun = (PTHREAD_START_ROUTINE)::GetProcAddress(::GetModuleHandle(_T("Kernel32")), "FreeLibrary");  
  131.         if (NULL == lpThreadFun)  
  132.         {  
  133.             ::CloseHandle(hProcess);  
  134.             return false;  
  135.         }  
  136.         // 创建远程线程调用 FreeLibrary  
  137.         hThread = ::CreateRemoteThread(hProcess, NULL, 0, lpThreadFun, me32.modBaseAddr /* 模块地址 */, 0, NULL);  
  138.         if (NULL == hThread)  
  139.         {  
  140.             ::CloseHandle(hProcess);  
  141.             return false;  
  142.         }  
  143.         // 等待远程线程结束  
  144.         ::WaitForSingleObject(hThread, INFINITE);  
  145.         // 清理  
  146.         ::CloseHandle(hThread);  
  147.         ::CloseHandle(hProcess);  
  148.         return true;  
  149.     }  
复制代码

点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-4-26 15:44

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表