好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

[精品]远程线程嵌入技术.doc

4页
  • 卖家[上传人]:gg****m
  • 文档编号:204076380
  • 上传时间:2021-10-24
  • 文档格式:DOC
  • 文档大小:73KB
  • / 4 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 是指远线程吗?前两天在这儿看到的, 现在发给你什么是远线稈?我们知道用CreateThread可以在当前进稈里建立一个线程,远线稈与此类 似,只不过是在其他进程中建立一个线程,用API函数CreateRemoteThread0这个远线程建 立后就与建立它的进程无关了,而是进入了另外一个进程举例说,进程A可以在进程B中 建立一个远线程,这个远线程就是进程B中的线程了,而此时如果进程A结束了,也不会影 响到那个远线程的运行,除非进程B也结束了,那个远线程才会结束怎么样,是不是很神 奇啊?现在我们来看看怎么建立远线程最简单的远线程技术是DLL注入好,先从这个讲起所谓DLL注入就是将一个 DLL放进某个进程的地址空间里,让它成为那个进程的一部分要实现DLL注入,首先需要 打开目标进程hRemoteProcess = OpenProcess ( PROCESS_CREATE_TIIREAD | //允许远程创建线程PROCESS_VM_OPERATION | //允许远程 VM 操作PROCESS VM WRITE, //允许远程 VM 写FALSE, dwRemot eProces s T d )由于我们示瓯需要写入远程进程的内存地址空间并建立远程线程,所以需要申请足够的权 限(PROCESS_CREATE_THREAD、 VM_OPERATION> VM_WRITE)如果进稈打不开,以后的操作就别想了。

      进稈打开后,就可以建立远线稈了,不过别急, 先想想这个远线程的线程函数是什么?我们的目的是注入一个DLLo而且我们知道用 LoadLibrary可以加载一个DLL到木进程的地址空间于是,自然会想到如果可以在目标进 程中调用LoadLibrary,不就可以把DLL加载到目标进程的地址空间了吗?对!就是这样 远线程就在这儿用了一次,建立的远线程的线程函数就是LoadLibrary,而参数就是要注入 的DLL的文件名这里需要白己想一想,注意到了吗,线稈函数ThreadProc和LoadLibrary 函数非常相似,返冋值,参数个数都一样)还有一个问题,iQadLibrary这个函数的地址 在哪儿?也许你会说,这个简单,GetProcAddress就可以得出于是代码就出来了char *pszLibFileRemote=,,my. dll";PTHREAD_START_ROUTTNE pfnStartAddr =(PTHREAD_START_ROUTINE)GetProcAddress(GetModulellandle(〃Kernel32〃), /zLoadLibraryA/z);CreateRemoteThread( hRemoteProcess, NULL, 0, pfnStartAddr,pszLibFileRemote, 0, NULL);但是不对!不要忘了,这是远线程,不是在你的进程里,而pszLibFileRemote 指向的是你的进程里的数据,到了目标进程,这个指针部不知道指向哪儿去了,同样 pfnStartAddr这个地址上的代码到了目标进稈里也不知道是什么了,不知道是不是你想要的 LoadLibraryA To但是,问题总是可以解决的,Windows有些很强大的API函数,他们可以 在目标进程里分配内存,可以将你的讲程中的数据拷贝到目标进程中。

      因此 pszLibFileRemote的问题可以解决了char *pszLibF订eNjime二"my. dll";//注意,这个一定要是全路径文件名,除非它在系统目录里;原因大家自己想想〃计算DLL路径名需要的内存空间int cb = (1 + lstrlenA(pszLibF订eNeune)) * sizeof (char);//使用VirtualAllocEx函数在远稈进稈的内存地址空间分配DLL文件名缓冲区 pszLibFileRemote = (char *) VirtualAllocEx( hRemoteProcess, NULL, cb, MEM_COMMIT, PAGE_READWRITE);//使用WriteProcessMemory函数将DLL的路径名复制到远程进稈的内存空间 iReturnCocle - WriteProcessMemory(hRemoteProcess, pszLibFileRemote,(PVOID) pszLibF订eNtunc, cb, NULL);OK,现在目标进稈•也认识pszLibFileRemote 了,但是pfnStartAddr好像不好办, 我怎么可能知道LoadLibraryA在目标进程中的地址呢?其实Windows为我们解决了这个问 题,LoadLibraryA这个函数是在Kernel32. dll这个核心DLL里的,而这个DLL很特殊,不 管对于哪个进程,Windows总是把它加载到相同的地址上去。

      因此你的进程中LoadLibraryA 的地址和目标进稈中LoadLibraryA的地址是相同的(其实,这个DLL里的所有函数都是如此) 至此,DI」,注入结朿了程线程嵌入技术远程线程技术指的是通过在另一个进程中创建远程线程的方法进入那个进程的内存地 址空间我们知道,在进程中,可以通过CreeiteThread函数创建线稈,被创建的新线程与主 线程(就是进程启动时被同时『I动建立的那个线程)共享地址空间以及其他的资源但是很 少有人知道,通过CrcatcRcmoteThread也同样可以在另一个进稈内创建新线稈,被创建的远 程线稈同样可以共享远稈进稈(是远稈进稈耶!)的地址空间,所以,实际上,我们通过一个 远程线程,进入了远程进程的内存地址空间,也就拥有了那个远程进程相当的权限例如在 远程进程内部启动一个DLL木马(与进入进程内部相比,启动一个DLL木马是小意思,实际 上我们可以随意篡改那个远稈进稈的数据)首先,我们通过OpenProcess 来打开我们试图嵌入的进程(如果远稈进稈不允许打 开,那么嵌入就无法进行了,这往往是由于权限不足引起的,解决方法是通过种种途径提升 本地进程的权限)hRemoteProcess = OpenProcess ( PROCESS CREATE THREAD | f订e://允许远程创建线程PROCESS_VM_OPERATION | f订e: //允许远程 VM操作PROCESS_VMJVRITE, 〃允许远程 VM 写FALSE, dwRemoteProcessId )由于我们示面需耍写入远程进程的内存地址空间并建立远程线程,所以需要申请足够 的权限(PROCESS_CREATE_THREAD、VM_OPERATION、VM_WRITE)O然后,我们可以建立LoadLibraryW函数这个线程来启动我们的DLL木^,LoadLibraryW 函数是在kernel32.dll中定义的,用來加载DLL文件,它只有一个参数,就是DLL文件的绝 对路径名pszLibFileName,(也就是木马DLL的全路径文件名),但是由于木马DLL是在远程 进程内调用的,所以我们首先还需要将这个文件名复制到远程地址空间:(否则远程线程是无 法读到这个参数的)file:〃计算DLL路径名需要的内存空间int cb = (1 + IstrlenWfpszLibF订eNeune)) * sizeof (WCHAR);f订e://使用VirtualAllocEx函数在远程进程的内存地址空间分配DLL文件名缓冲区 pszLibFileRemote = (PWSTR) VirtualAllocEx( hRemoteProcess, NULL, cb,MEM_C0MMIT, PAGE_READWRITE);file://使丿I] WriteProcessMemory函数将DLL的路径名复制到远穆进程的内存空间 iReturnCode 二 WriteProcessMemory(hRemoteProcess,pszLibFileRemote, (PVO1D) pszLibFileName, cb, NULL);f订e://计算LoadLibraryW的入口地址PTHREAD_START_ROUTINE pfnStartAddr = (PTHREAD_START_ROUTINE)GetProcAddress (GetModuleHandle (TEXT (,zKernel32,z)), "LoadLibraryW");OK,万事倶备,我们通过建立远程线程时的地址pfnStartAddr (实际上就是 LoadLibraryW的入口地址)和传递的参数pszLibFileRemote (实际上是我们复制过去的木马 DLL的全路径文件名)在远程进程内启动我们的木马DLL:file://启动远稈线程LoadLibraryW,通过远稈线稈调用用户的DLL文件hRemoteThread = CreateRemoteThread( hRemoteProcess, NULL, 0,pfnStartAddr, pszLibFileRemote, 0, NULL);至此,远程嵌入顺利完成,为了试验我们的DLL是不是已经正常的在远程线稈运行, 我编写了以下的测试DLL:BOOL APIENTRY DI IMain (HANDLE hMoclule, DWORD reason, LPVOID IpReserved){char szProcessId[64] ;switch ( reason ){case DLL_PROCESS_ATTACH:{f订e://获収当前进程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: 1208C:\WTNNT\Explorer. exe (0x00400000)C:\TestDLL. dll (0x100000000)这证明TestDLL. dl 1己经在Explorer, exe进程内正确地运行了。

      无论是使用特洛伊DLL还是使用远程线程,部是让木马的核心代码运行于别的进程的 内存空间,这样不仅能很好地隐藏自己,也能更好的保护自己。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.