天马阁

 找回密码
 立即注册
                                        →→→→→→→→→→→→ 1点击查看所有VIP教程目录长列表(总教程数269个) 2办理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实现原理及防护思路 30课完结
64驱?封? 9 64反驱? 10 64位V? 11 绝? 12 ???课?
13 64透 ? 14 64U ? 15 64Q ? 16 64功 ?
17 64U ? 18 64模 ? 19 64多 ? 20 64网 ?
21 64注 ? 22 64火 ? 23 64棋 ? 24 64自二链L?
25 64破 ? VIP会员办理QQ: 89986068   
【请先加好友,然后到好友列表双击联系客服办理,不然可能无法接受到信息。】
27 加入2000人交流群637034024 3 28 免责声明?
查看: 5002|回复: 0

VC++远程线程注入类x86 + x64 (NtCreateThreadEx + LdrLoadDll)

[复制链接]

14

主题

0

回帖

17

积分

编程入门

Rank: 1

天马币
28
发表于 2024-3-6 09:12:43 | 显示全部楼层 |阅读模式

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. }  


  37. //在目标进程中创建线程并注入dll  
  38. BOOL Cx64Inject::InjectDll(DWORD dwProcessId,LPCWSTR lpcwDllPath)  
  39. {  
  40.         BOOL bRet = FALSE;  
  41.         HANDLE hProcess = NULL, hThread = NULL;  
  42.         LPVOID pCode = NULL;  
  43.         LPVOID pThreadData = NULL;  
  44.         __try  
  45.         {  
  46.                 if(!EnableDebugPrivilege())  
  47.                 {  
  48.                         MyOutputDebugStringA("InjectDll() : EnableDebugPrivilege() 调用失败!错误代码: [%d]", GetLastError());  
  49.                         return -1;  
  50.                 }  
  51.                 //打开目标进程;  
  52.                 hProcess = OpenProcess(PROCESS_ALL_ACCESS, TRUE, dwProcessId);  
  53.                 DWORD dwError = GetLastError();  
  54.                 if (hProcess == NULL)  
  55.                         __leave;  
  56.                 //申请空间,把我们的代码和数据写入目标进程空间里;  
  57.                 //写入数据;  
  58.                 THREAD_DATA data;  
  59.                 HMODULE hNtdll = GetModuleHandleW(L"ntdll.dll");  
  60.                 data.fnRtlInitUnicodeString = (pRtlInitUnicodeString)GetProcAddress(hNtdll,"RtlInitUnicodeString");  
  61.                 data.fnLdrLoadDll = (pLdrLoadDll)GetProcAddress(hNtdll,"LdrLoadDll");  
  62.                 memcpy(data.DllName, lpcwDllPath, (wcslen(lpcwDllPath) + 1)*sizeof(WCHAR));  
  63.                 data.DllPath = NULL;  
  64.                 data.Flags = 0;  
  65.                 data.ModuleHandle = INVALID_HANDLE_VALUE;  
  66.                 pThreadData = VirtualAllocEx(hProcess, NULL, 4096, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);  
  67.                 if (pThreadData == NULL)  
  68.                         __leave;  
  69.                 BOOL bWriteOK = WriteProcessMemory(hProcess, pThreadData,&data,sizeof(data), NULL);  
  70.                 if (!bWriteOK)  
  71.                         __leave;  
  72.                 MyOutputDebugStringA("pThreadData = 0x%p", pThreadData);  
  73.                 //写入代码;  
  74.                 DWORD SizeOfCode = (DWORD)ThreadProcEnd - (DWORD)ThreadProc;  
  75.                 pCode = VirtualAllocEx(hProcess, NULL, SizeOfCode, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);  
  76.                 if (pCode == NULL)  
  77.                 {  
  78.                         MyOutputDebugStringA("InjectDll() : pCode = VirtualAllocEx() 调用失败!错误代码: [%d]", GetLastError());  
  79.                         __leave;  
  80.                 }                  
  81.                 bWriteOK = WriteProcessMemory(hProcess, pCode, (PVOID)ThreadProc, SizeOfCode, NULL);  
  82.                 if (!bWriteOK)  
  83.                         __leave;  
  84.                 MyOutputDebugStringA("pCode = 0x%p", pCode);  
  85.                 //创建远程线程,把ThreadProc作为线程起始函数,pThreadData作为参数;  
  86.                 hThread = MyCreateRemoteThread(hProcess, (LPTHREAD_START_ROUTINE)pCode, pThreadData);  
  87.                 if (hThread == NULL)  
  88.                         __leave;  
  89.                 //等待完成;  
  90.                 WaitForSingleObject(hThread, INFINITE);  
  91.                 bRet = TRUE;  
  92.         }  
  93.         __finally  
  94.         {  
  95.                 if (pThreadData != NULL)  
  96.                         VirtualFreeEx(hProcess, pThreadData, 0, MEM_RELEASE);  
  97.                 if (pCode != NULL)  
  98.                         VirtualFreeEx(hProcess, pCode, 0, MEM_RELEASE);  
  99.                 if (hThread != NULL)  
  100.                         CloseHandle(hThread);  
  101.                 if (hProcess != NULL)  
  102.                         CloseHandle(hProcess);  
  103.         }  
  104.    
  105.         return bRet;  
  106. }  
复制代码
以上是远程线程注入类的两个核心函数,下面是调用实例:
  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© 2010-2021 All Right Reserved.
快速回复 返回顶部 返回列表