读写64位进程eWOW64Ext模块

易语言 2020-02-26 17:20:40

读写64位进程eWOW64Ext模块

本模块的核心作用简单描述是:允许你在一个易语言子程序内进入 64 位环境!
也就是:wow 环境 -> 进入 x64 环境 -> x64 函数调用 或 x64 汇编代码 -> 退出 x64 环境 -> wow 环境,以上必须在一个子程序内完成;
简述:其实这种技术多年前就有,易语言上也有类似的模块,个别模块是有误的,还有的长期未更新或优化,也有可用但总有与处理器优化手册上规则相悖的代码,总之都不能令我满意,因此自己从头编写了这样一个模块,部分实现代码借鉴 wow64ext,在此感谢 rewolf。
原理:wow64 是在 64 位操作系统上允许 32 位程序(比如易编译的程序)执行的模拟器子系统,在 64 位操作系统中,不管你的程序是 32 还是 64 位的,其实都存在两个地址空间,正常情况下 32 位程序访问的自然是 32 位的地址空间,而 64 位程序访问其 64 位地址空间。
但是这两个空间是同时存在且可以切换的,本模块就是通过该原理切换到 64 位地址空间获取 ntdll.dll 相关函数进行调用(注:此基址是 64 位的,与平常获取的 32 位模块基址截然不同);

扩展延申功能:


1、可以直接使用 64 位函数自由读写(注入) 64 位进程,与很多模块调用 NtWow64xxx 系列函数实现的方式有本质不同;
2、正是由于其原理本模块允许你的易程序使用 64 位 ntdll.dll 的所有函数,也就是你虽然开发的是 32 位程序,但可以实现很多 64 位函数所能实现的功能;
3、我公开了部分常用函数可直接调用,其余函数获取地址后,使用 X64Call 这个通用函数调用即可;
4、通过本模块的框架代码,可以轻松在易语言中实现 x64 汇编的置入代码;与很多语言不同,易的置入代码接受的是硬编码(即编译后的 opcode)而不是汇编助记符,虽然直观性没有了,但可以使我们更灵活的在一段子程序中使用 x86/x64 混编,也就是你可以使用 64 位的通用寄存器来编写 x64 汇编而不必使用 REX 前缀;
5、后续会考虑增加必要的功能,根据易友的反馈;
6、本模块按使用难易度划分的话,属于中高级用户群,如果 Win32 API 都用不明白的怕是意义不大;
7、稍后会开发个给初中级用户便捷使用的中文版 x86/x64 通用进程读写模块,如果需要的人多的话;
8、如有 BUG,请提供错误重现代码及执行环境,如非不可抗因素我都会及时更新的;