龙马谷

 找回密码
 立即注册

QQ登录

只需一步,快速开始

龙马谷VIP会员办理客服QQ:82926983(如果临时会话没有收到回复,请先加QQ好友再发。)
1 [已完结] GG修改器新手入门与实战教程 31课 2 [已完结] GG修改器美化修改教程 6课 3 [已完结] GG修改器Lua脚本新手入门教程 12课
4 [已完结] 触动精灵脚本新手入门必学教程 22课 5 [已完结] 手游自动化脚本入门实战教程 9课 6 [已完结] C++射击游戏方框骨骼透视与自瞄教程 27课
7 [已完结] C++零基础UE4逆向开发FPS透视自瞄教程 29课 8 [已完结] C++零基础大漠模拟器手游自动化辅助教程 22课 9 [已完结] C++零基础开发DXF内存脚本辅助教程 32课
以下是天马阁VIP教程,本站与天马阁合作,赞助VIP可以获得天马阁对应VIP会员,名额有限! 点击进入天马阁论坛
1 [已完结] x64CE与x64dbg入门基础教程 7课 2 [已完结] x64汇编语言基础教程 16课 3 [已完结] x64辅助入门基础教程 9课
4 [已完结] C++x64内存辅助实战技术教程 149课 5 [已完结] C++x64内存检测与过检测技术教程 10课 6 [已完结] C+x64二叉树分析遍历与LUA自动登陆教程 19课
7 [已完结] C++BT功能原理与x64实战教程 29课 8 [已完结] C+FPS框透视与自瞄x64实现原理及防护思路
查看: 5859|回复: 0

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

[复制链接]

31

主题

1

回帖

39

积分

编程入门

Rank: 1

龙马币
72


第一个函数是成功的,第二个函数运行发现会将目标程序挂死,也许是目标程序有保护机制

支持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.     }  
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

龙马谷| C/C++辅助教程| 安卓逆向安全| 论坛导航| 免责申明|Archiver|
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表龙马谷立场!
任何人不得以任何方式翻录、盗版或出售本站视频,一经发现我们将追究其相关责任!
我们一直在努力成为最好的编程论坛!
Copyright© 2018-2021 All Right Reserved.
在线客服
快速回复 返回顶部 返回列表