龙马谷

 找回密码
 立即注册

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课
以下是天马阁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实现原理及防护思路
查看: 1632|回复: 0

开源Ring3下的DLL注入x86 x64源码

[复制链接]

8

主题

2

回帖

14

积分

编程入门

Rank: 1

龙马币
36
(开源) Ring3下的DLL注入工具 x86&x64(NtCreateThreadEx + LdrLoadDll方式实现,可以注入系统进程)

使用NtCreateThreadEx + LdrLoadDll方式实现远程线程注入的特色在于比一般的远程线程注入稳定,可以注入系统进程,服务进程等。

核心源代码如下


  1. //OD跟踪,发现最后调用的是NtCreateThreadEx,所以这里手动调用
  2. HANDLE Cx64Inject::MyCreateRemoteThread(HANDLE hProcess, LPTHREAD_START_ROUTINE pThreadProc, LPVOID pRemoteBuf)
  3. {
  4.         HANDLE hThread = NULL;
  5.         FARPROC pFunc = NULL;
  6.         if( IsVistaOrLater())// Vista, 7, Server2008
  7.         {
  8.                 pFunc = GetProcAddress(GetModuleHandleW(L"ntdll.dll"), "NtCreateThreadEx");
  9.                 if( pFunc == NULL )
  10.                 {
  11.                         MyOutputDebugStringA("MyCreateRemoteThread() : GetProcAddress("NtCreateThreadEx") 调用失败!错误代码: [%d]", GetLastError());
  12.                         return NULL;
  13.                 }
  14.                 ((_NtCreateThreadEx64)pFunc)(&hThread,0x1FFFFF,NULL,hProcess,pThreadProc,pRemoteBuf,FALSE,NULL,NULL,NULL,NULL);
  15.                 if( hThread == NULL )
  16.                 {
  17.                         MyOutputDebugStringA("MyCreateRemoteThread() : NtCreateThreadEx() 调用失败!错误代码: [%d]", GetLastError());
  18.                         return NULL;
  19.                 }
  20.         }
  21.         else// 2000, XP, Server2003
  22.         {
  23.                 hThread = CreateRemoteThread(hProcess,NULL,0,pThreadProc,pRemoteBuf,0,NULL);
  24.                 if( hThread == NULL )
  25.                 {
  26.                         MyOutputDebugStringA("MyCreateRemoteThread() : CreateRemoteThread() 调用失败!错误代码: [%d]", GetLastError());
  27.                         return NULL;
  28.                 }
  29.         }
  30.         if( WAIT_FAILED == WaitForSingleObject(hThread, INFINITE) )
  31.         {
  32.                 MyOutputDebugStringA("MyCreateRemoteThread() : WaitForSingleObject() 调用失败!错误代码: [%d]", GetLastError());
  33.                 return NULL;
  34.         }
  35.         return hThread;
  36. }
复制代码


  1. //在目标进程中创建线程并注入dll
  2. BOOL Cx64Inject::InjectDll(DWORD dwProcessId,LPCWSTR lpcwDllPath)
  3. {
  4.         BOOL bRet = FALSE;
  5.         HANDLE hProcess = NULL, hThread = NULL;
  6.         LPVOID pCode = NULL;
  7.         LPVOID pThreadData = NULL;
  8.         __try
  9.         {
  10.                 if(!EnableDebugPrivilege())
  11.                 {
  12.                         MyOutputDebugStringA("InjectDll() : EnableDebugPrivilege() 调用失败!错误代码: [%d]", GetLastError());
  13.                         return -1;
  14.                 }
  15.                 //打开目标进程;
  16.                 hProcess = OpenProcess(PROCESS_ALL_ACCESS, TRUE, dwProcessId);
  17.                 DWORD dwError = GetLastError();
  18.                 if (hProcess == NULL)
  19.                         __leave;
  20.                 //申请空间,把我们的代码和数据写入目标进程空间里;
  21.                 //写入数据;
  22.                 THREAD_DATA data;
  23.                 HMODULE hNtdll = GetModuleHandleW(L"ntdll.dll");
  24.                 data.fnRtlInitUnicodeString = (pRtlInitUnicodeString)GetProcAddress(hNtdll,"RtlInitUnicodeString");
  25.                 data.fnLdrLoadDll = (pLdrLoadDll)GetProcAddress(hNtdll,"LdrLoadDll");
  26.                 memcpy(data.DllName, lpcwDllPath, (wcslen(lpcwDllPath) + 1)*sizeof(WCHAR));
  27.                 data.DllPath = NULL;
  28.                 data.Flags = 0;
  29.                 data.ModuleHandle = INVALID_HANDLE_VALUE;
  30.                 pThreadData = VirtualAllocEx(hProcess, NULL, 4096, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
  31.                 if (pThreadData == NULL)
  32.                         __leave;
  33.                 BOOL bWriteOK = WriteProcessMemory(hProcess, pThreadData,&data,sizeof(data), NULL);
  34.                 if (!bWriteOK)
  35.                         __leave;
  36.                 MyOutputDebugStringA("pThreadData = 0x%p", pThreadData);
  37.                 //写入代码;
  38.                 DWORD SizeOfCode = (DWORD)ThreadProcEnd - (DWORD)ThreadProc;
  39.                 pCode = VirtualAllocEx(hProcess, NULL, SizeOfCode, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
  40.                 if (pCode == NULL)
  41.                 {
  42.                         MyOutputDebugStringA("InjectDll() : pCode = VirtualAllocEx() 调用失败!错误代码: [%d]", GetLastError());
  43.                         __leave;
  44.                 }               
  45.                 bWriteOK = WriteProcessMemory(hProcess, pCode, (PVOID)ThreadProc, SizeOfCode, NULL);
  46.                 if (!bWriteOK)
  47.                         __leave;
  48.                 MyOutputDebugStringA("pCode = 0x%p", pCode);
  49.                 //创建远程线程,把ThreadProc作为线程起始函数,pThreadData作为参数;
  50.                 hThread = MyCreateRemoteThread(hProcess, (LPTHREAD_START_ROUTINE)pCode, pThreadData);
  51.                 if (hThread == NULL)
  52.                         __leave;
  53.                 //等待完成;
  54.                 WaitForSingleObject(hThread, INFINITE);
  55.                 bRet = TRUE;
  56.         }
  57.         __finally
  58.         {
  59.                 if (pThreadData != NULL)
  60.                         VirtualFreeEx(hProcess, pThreadData, 0, MEM_RELEASE);
  61.                 if (pCode != NULL)
  62.                         VirtualFreeEx(hProcess, pCode, 0, MEM_RELEASE);
  63.                 if (hThread != NULL)
  64.                         CloseHandle(hThread);
  65.                 if (hProcess != NULL)
  66.                         CloseHandle(hProcess);
  67.         }

  68.         return bRet;
  69. }
复制代码


以上是远程线程注入类的两个核心函数,下面是调用实例:
  1. Cx64Inject inject;  
  2. if (inject.InjectDll(g_dwPID,g_szDllPath))  
  3. {  
  4.         ::MessageBox(NULL,L"注入成功",L":)",MB_ICONINFORMATION);  
  5. }  
  6. else  
  7. {  
  8.         ::MessageBox(NULL,L"注入失败!",L"失败",MB_ICONERROR);  
  9. }  
复制代码


封装成类了,使用起来很简单的。
有一点需要注意的是x64注入的意思是只能将64位dll注入64位进程。
x86注入的意思是32位dll注入32位进程。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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