脚本开发,脚本学习,辅助软件,各种工具软件

亿林纸业 发表于 2020-5-28 09:29:05

eWOW64Ext v1.2 - 加载任意 32/64 模块


块原理:
wow64 是在 64 位操作系统上允许 32 位程序(比如易编译的程序)执行的模拟器子系统;在 64 位操作系统中,不管你的程序是 32 还是 64 位的,其实都存在两个地址空间,正常情况下 32 位程序访问的自然是 32 位的地址空间,而 64 位程序访问其 64 位地址空间。但是这两个空间是同时存在且可以切换的,本模块就是通过该原理切换到 64 位地址空间获取 ntdll.dll 相关函数进行调用(注:此基址是 64 位的,与平常获取的 32 位模块基址截然不同);也就是:wow 环境 -> 进入 x64 环境 -> x64 函数调用 或 x64 汇编代码 -> 退出 x64 环境 -> wow 环境,以上必须在一个子程序内完成;
模块功能:

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

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

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

易内部命令
X64Call调用 64 位函数通用版本
X64CallArr调用 64 位函数通用版本,数组方式传参,支持无限个数参数;【v1.2新增】
X64MemCopy同类还有 X64MemCmp 函数;从 64 地址复制数据或 64 位地址与 32 位地址数据对比,但仅限进程内部
X64GetLong64获取 64 位地址数值,同类函数还有:X64GetLong32、X64GetWord、X64GetByte
X64GetTEB取当前易程序 64 位 TEB,通过 TEB 再取 PEB,则进程和线程信息以及模块等一览无余了
GetNtdll64ntdll.dll 在 64 位环境下的内存基址
GetModuleHandleEx64通过模块哈希值获取其 64 位地址空间的内存基址(易进程而不是外部进程哦);同类还有 GetModuleHandle64
GetProcAddressEx64通过函数哈希值或函数索引序号获取其 64 位调用地址;同类还有 GetProcAddress64
NtQuerySystemInformation64cha询系统信息,可获取很多类别信息。这个 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
VirtualQueryEx64cha询外部 64 位进程指定内存区域的状态,一个地址是否能写入最好先测试一下,禁止写的话要更改内存属性才能开始写入
VirtualProtectEx64更改外部 64 位进程指定内存区域的保护属性
ReadProcessMemory64读取外部 64 位进程指定区域的内存数据
WriteProcessMemory64向外部 64 位进程指定内存区域写入数据
NtQueryInformationProcess64cha询外部 64 位进程信息
GetThreadContext64获取线程上下文,多用于 SEH,仅供高级用户使用;相应设置函数为 SetThreadContext64

编写 64 位汇编(供汇编爱好者使用):
模块公开了几个 汇编代码 常量:
#X64_Start - 进入 x64 环境
#X64_End - 退出 x64 环境

子程序名返回值类型公开备 注
编写x64汇编框架 返回值不限制,同 x86 相同
' 如果本子程序中需要调用 64 位函数,则此时应保存 fs 寄存器及对齐栈顶,可参考源码中的 #X64_SaveFs
置入代码 ( #X64_Start )' 在此区域内可使用 64 位纯汇编代码
置入代码 ( #X64_End )' #X64_End 与 #X64_Start 必须在同一个子程序中成对使用
' 如果本子程序中需要调用 64 位函数,则此时应恢复 ss/fs 寄存器,可参考源码中的 #X64_RestoreFs
' 然后就是 x86 中的平栈返回或者由易子程序返回
更新日志:

添加:添加了一个 X64CallArr 函数,使用数组方式调用 64 位函数,这样就相当于无限参数数量了,应易友 @开始学易语言 的需求;更新:极大优化了 X64Call 的代码,现在的通用调用性能损失几乎可忽略不计,实际上本模块的所有代码都是一句句汇编写出来的,本身比起依赖 VC 编译器自动优化的代码都要效率很多倍;更新:修正加载本模块后无法使用易语言 “运行” 命令的 BUG,实际还有 CreateProcess API 也一同修复
https://www.eyuyan.la/data/attachment/forum/201904/10/152851su6h6y69k7hhuz9o.png



下载链接:https://t00y.com/file/20110282-445770994
页: [1]
查看完整版本: eWOW64Ext v1.2 - 加载任意 32/64 模块