共有回帖数 0 个
-
前些天刚好有个需求,某32bit应用,需要读写某进程的内存,而目标进程可能是64bit(x64系统)的,即目标地址可能超过32bit可表示范围,则使用32bit api无法访问(无法送入64bit地址)。当然,为解决此问题,将编译为x64版本即可,但如此一来,则需要提供至少两个版本的应用(也可如process explorer,提供32bit版本,识别平台,动态释放x64版本),稍显麻烦。于是想到了很久前看到的一篇文章《Mixing x86 with x64 code》(blo**rewolf点pl斜杠blog斜杠?p=102)。文中介绍了一种在WoW64应用中使用x64代码的方法,也同时介绍了WoW64应用使用64bit ntdll导出接口的方法。这样即可满足我的需求
WoW64(Windows 32-bit on Windows 64-bit)是64bit windows系统中提供32bit应用兼容执行的子系统,他大体上包含两个组成部分,桥接层和32bit win32 api库。桥接层以32bit ntdll.dll为最上层,向上提供与32bit ntdll完全一致的接口,此ntdll不同于32bit windows系统中的ntdll,他仅将调用请求通过Wow64.dll,Wow64win.dll,Wow64cpu.dll向下转至64bit ntdll,完成桥接任务。32bit win32 api库则可基本无变化(未一一确认)。当一个32bit应用在64bit windows系统中被载入时,系统会将SysWOW64目录映射成System32,并载入WoW64子系统与64bit ntdll,且64bit ntdll对此应用透明(无法通过常规方式查找到内存中的此image)
WoW64子系统在不同平台上的实现方式也存在差异。例如ia-64上,此子系统将开启cpu虚拟机模式执行WoW64应用,成本较高;而x64(intel 64 and amd64)上只需使用兼容模式即可运行。
x64的ia-32e模式,允许通过段描述符的L flag定义该段是否包含的是64bit代码。从反向工程看,x64 windows上的WoW64子系统的桥接层,在Wow64cpu.dll中实现的32bit代码到64bit代码的方式为:far jump到描述子0x33的代码段(已验证目前为止的win7之前的任何x64 windows系统),更加幸运的是,此段和32bit代码段,是逻辑地址重合的,由此可知,由32bit代码跳转到64bit代码,只需far jump/call即可(转回类似)
有了这个基础,离调用64bit ntdll只剩一步之遥。为了WoW64子系统自身调用需求的实现(32bit-64bit ntdll),64bit ntdll被映射在2g以内的地址空间,这也为WoW64应用直接访问提供了可能。前述方法引用的原贴提供了上述功能的包装库,位于code点google点com斜杠p斜杠rewolf-wow64ext。查找64bit ntdll的方式是通过peb64的pldr64链表
下图是俺的封装版本,因觉得搜索pldr64链表方式对内部结构依赖过高,故改为遍历内存(逐allocation边界)+分析pe结构方式。W32onW64Helper类以helper形式封装了基础call、ntdll定位和虚拟内存访问功能,此外,还提供了类似GetProcAddress的功能,方便获取其他ntdll的接口。PEFile类是简易的pe文件分析器,支持多种方式打开分析pe文件,其中第五中构造函数,需提供EvtDelegate3(相当于抽象reader),由于EvtDelegate3文件未贴出(链式依赖,需要贴很多七七八八的东西),编译可能存在问题,可自行注释与之相关函数和代码块,结构都是很清晰的
至此,完成标题提及目标

楼主 2016-06-23 12:16 回复
Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号
意见反馈 |
关于直线 |
版权声明 |
会员须知