eWOW64Ext加载任意32/64模块/动态调用汇编/进程读写

易语言 2020-02-28 21:19:58

eWOW64Ext加载任意32/64模块/动态调用汇编/进程读写

模块部分命令简述:
以下只是适用于 64 位的部分函数,模块中以相同命令形式实现的 32 位命令,这里就不列举了;

这两个空间是同时存在且可以切换的,本模块就是通过该原理切换到 64 位地址空间获取 ntdll.dll 相关函数进行调用(注:此基址是 64 位的,与平常获取的 32 位模块基址截然不同)

也就是:wow 环境 -> 进入 x64 环境 -> x64 函数调用 或 x64 汇编代码 -> 退出 x64 环境 -> wow 环境,以上必须在一个子程序内完成;

部分实现代码借鉴 c++ 开源代码:wow64ext,在此感谢作者 rewolf。

模块功能:

1.实现易语言纯 64 位汇编置入代码;
2.允许调用易程序 64 位 ntdll.dll 的所有函数,也就是你虽然开发的是 32 位程序,但可以实现很多 64 位函数所能实现的功能;
3.直接使用 64 位函数自由读写(注入) 64 位进程,与很多模块调用 NtWow64xxx 系列函数实现的方式有本质不同;
4.部分常用 ntdll.dll 函数已在模块直接提供,或以模拟 kernel32 函数的调用形式提供,v1.1 新增多个函数;
5.未提供函数获取地址后,可使用 X64Call 这个通用函数调用即可;
6.大部分提供的 64 位功能也同时提供了 32 位版本,以便兼容不同需求(模块在 32 位系统中不会开启 64 位功能引起异常,但 32 位功能依然可用);
7.支持加载任意 32/64 位 DLL,从此易语言可以调用外部 64 位 DLL 了(包括加载 kernel32.dll),v1.1 新增功能;
8.除了动态加载外,还支持 32 位 DLL 的内存加载,但 64 位只能加载本地 DLL 文件,v1.1 新增功能;
9.如有 BUG,请提供错误重现代码及执行环境,如非不可抗因素我都会及时更新的;

辅助函数
fn_WOW64Enabled 如果你在代码中需要使用 64 位汇编或者操作 64 位进程,则初始化时应确保本函数返回真。实际只要是 64 位操作系统,均应返回 真
fn_ProcessIsX64 检测指定进程是否为 64 位进程
fn_CalcModOrFuncHash 使用过动态调用DLL的都清楚取模块基址和函数指针,微软默认使用字符串对比,本模块可使用哈希对比效率和易用上相对提升,本函数用于计算模块或函数哈希

易内部命令
X64Call 调用 64 位函数通用版本
X64MemCopy 同类还有 X64MemCmp 函数;从 64 地址复制数据或 64 位地址与 32 位地址数据对比,但仅限进程内部
X64GetLong64 获取 64 位地址数值,同类函数还有:X64GetLong32、X64GetWord、X64GetByte
X64GetTEB 取当前易程序 64 位 TEB,通过 TEB 再取 PEB,则进程和线程信息以及模块等一览无余了
GetNtdll64 ntdll.dll 在 64 位环境下的内存基址
GetModuleHandleEx64 通过模块哈希值获取其 64 位地址空间的内存基址(易进程而不是外部进程哦);同类还有 GetModuleHandle64
GetProcAddressEx64 通过函数哈希值或函数索引序号获取其 64 位调用地址;同类还有 GetProcAddress64
NtQuerySystemInformation64 cha询系统信息,可获取很多类别信息。这个 API 微软已不推荐使用并给出部分替代 API,但其个别功能十分好用且没用可替代品。cha询系统进程也是最全面的
OpenProcess64 打开进程句柄,关闭进程句柄时使用 CloseHandle64;【v1.1新增】
HeapAlloc64 堆管理函数,同类还有 GetDefaultHeap64/HeapReAlloc64/HeapFree64/HeapSize64;【v1.1新增】
malloc64 简化版默认堆管理函数,同类还有 realloc64/free64
RtlUnicodeToAnsi64 内核实现的 Unicode、Ansi 结构(不是数据指针)管理函数,同类还有:RtlInitAnsiString64/RtlFreeAnsiString64、RtlInitUnicodeString64/RtlFreeUnicodeString64、RtlAnsiToUnicode64;【v1.1新增】
LoadLibraryEx64 可加载任意 64 位 DLL 到当前进程,获取基址及函数地址后进行调用即可;其释放函数为:FreeLibrary64
另,本函数 32 位版本 LoadLibraryEx86/FreeLibrary86 还支持加载 32 位的内存 DLL;【v1.1新增】

外部进程命令
NtQueryProcessPEB64 获取外部 64 位进程PEB
VirtualAllocEx64 在外部 64 位进程分配内存,释放函数为 VirtualFreeEx64
VirtualQueryEx64 cha询外部 64 位进程指定内存区域的状态,一个地址是否能写入最好先测试一下,禁止写的话要更改内存属性才能开始写入
VirtualProtectEx64 更改外部 64 位进程指定内存区域的保护属性
ReadProcessMemory64 读取外部 64 位进程指定区域的内存数据
WriteProcessMemory64 向外部 64 位进程指定内存区域写入数据
NtQueryInformationProcess64 cha询外部 64 位进程信息
GetThreadContext64 获取线程上下文,多用于 SEH,仅供高级用户使用;相应设置函数为 SetThreadContext64

其他:
由于本模块并非提供给初级用户使用,因此没有写太详尽的 demo,只提供了一份编写测试时用于测试的 test,参考其代码可获得模块使用方法;