〈新〉高级内存代码注入技术.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
高级内存代码注入技术 1、概述 ? 1.1 PE注入 ? 我们知道进程注入的方法分类主要有以下几种: ? DLL注入 利用注册表注入 利用Windows Hooks注入 利用远程线程注入 利用特洛伊DLL注入 不带DLL的注入 直接将代码写入目标进程,并启动远程线程 本文中的技术不同于以往的DLL注入和shellcode注入。通过此方法可将一个进程的完整镜像完全注入到另外一个进程的内存空间中,从而在一个进程空间中包含了两套不同的代码。与DLL注入相比,PE注入的主要优势是不需要很多文件,只需要MAIN.EXE注入到其他进程并唤起自身代码即可。 ? ? ? 1.2 影响 ? 利用该方法可以达到一下多个效果: ? 创建Socket及网络访问 访问文件系统?创建线程 访问系统库 访问普通运行时库 远控 键盘记录 ? ? 2、技术原理 ? 2.1 进程代码注入 ? 将代码写入进程的方法较简单,Windows提供了进程内存读取和写入的系统API。首先需要获取某个进程的PID号,然后打开该进程,可以利用Kernel32链接库中的OpenProcess函数实现。 ? 注:远程打开进程是受限的,从Vista起,就存在了类似UAC之类的防护措施。其中主要的进程内存保护机制是Mandatory Integrity Control(MIC)。MIC是基于“完整性级别”的对象访问控制保护方法。完整性级别包括如下四个级别: ? 低级别:被限制访问大部分系统资源(如IE); 中级别:开启UAC时非特权用户和管理员组用户启动的进程; 高级别:以管理员权限启动的进程 系统级别:SYSTEM用户启动的进程,如系统服务。 根据以上完整性级别要求,我们的进程注入将只允许注入低级别或同等级别的进程。 ? 本文将利用explorer.exe来举例,远程打开进程后利用VirtualAllocEx函数申请一段可保存本进程镜像的内存段,为了计算需要的内存大小我们可以通过读取PE头信息来获取。 ? ? 1 2 3 4 5 6 7 8 9 10 11 /*获取进程模块镜像*/ ? module = GetModuleHandle(NULL); ? /*获取PE头信息*/ ? PIMAGE_NT_HEADERS headers = (PIMAGE_NT_HEADERS)((LPBYTE)module +((PIMAGE_DOS_HEADER)module)-e_lfanew); ? /*获取代码长度*/ ? DWORD moduleSize = headers-OptionalHeader.SizeOfImage; ? ? 2.2 获取二进制地址 ? 代码注入中遇到的一个常见问题是模块的基地址会不断变化的问题。通常情况下,当进程启动时,MAIN函数的基地址是0当我们将代码注入到其他进程中时,新的基地址将产生在虚拟地址中不可预测的位置。 ? ? ? 在一个EXE文件中,编译和链接后,所有的代码和数据地址都是固定的,并建立在虚拟内存基址。对于PE注入,需要使用完整地址指针来修改数据的基地址,并且使用进程的重定位节。 ? 当系统正常加载一个文件时,如果其基地址不可用,系统将为其重新设置一个基地址,同时系统加载器会修改代码中的重定位节。于是,在该PE注入过程中,我们可以模仿系统的加载方式,我们定义变量delta来计算新地址,于是可以访问到代码中的完整地址甚至修改它们。 ? ? 1 2 3 4 5 6 7 /*在目标进程中新申请内存的偏移*/ ? delta = (DWORD_PTR)((LPBYTE)distantModuleMemorySpace – headers-OptionalHeader.ImageBase); ? /* 当前进程的镜像偏移量 */ ? olddelta = (DWORD_PTR)((LPBYTE)module – headers-OptionalHeader.ImageBase); ? 1 2 3 4 5 6 7 typedef struct _IMAGE_BASE_RELOCATION { ? ULONG? VirtualAddress; ? ULONG? SizeOfBlock; ? } IMAGE_BASE_RELOCATION, *PIMAGE_BASE_RELOCATION; ? ? ? ? 2.3 执行代码 ? 代码被注入后,可以尝试执行其中的函数。首先需要解决的是要计算函数在远程进程中的的地址。 ? ? 1 2 3 4 5 LPTHREAD_START_ROUTINE remoteThread = (LPTHREAD_START_ROUTINE)((LPBYTE)injectedModule + ? (DWORD_PTR

文档评论(0)

xiaofei2001128 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档