精易论坛

标题: eWOW64Ext v1.21 - 加载任意 32/64 模块|动态调用|64 位汇编|64 位进程读写 [打印本页]

作者: npzs    时间: 2019-5-2 20:19
标题: eWOW64Ext v1.21 - 加载任意 32/64 模块|动态调用|64 位汇编|64 位进程读写
本帖最后由 npzs 于 2019-5-2 22:26 编辑

版本更新:

没有任何实质性内容更新,仅内部架构调整,更易于派生模块使用;
首发于精易的 易语言全功能 SQLite3 数据库接口模块必须更新到本次版本后方可正常使用!下载:https://125.confly.eu.org/forum.php?mod=viewthread&tid=14361253


模块原理:

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

模块功能:



模块部分命令简述:
以下只是适用于 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,则进程和线程信息以及模块等一览无余了
GetNtdll64 ntdll.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
VirtualQueryEx64 cha询外部 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 中的平栈返回或者由易子程序返回



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

开源协yi:
本模块源代码核心来源于 rewolf-wow64ext,为尊重其劳动成果,沿用其 LGPL 3.0 开源许可证;
你可以将本模块源代码随意用于免费或商业软件;你也可以自由修改源代码,但公开发布应予以保留原作者署名;


关于赞助:
  • 本人近期希望可以有更多时间将近 15 年易语言学习中汇总的各类源代码重新整理优化,全部以开源、高效的易模块形式发布,为易语言略尽绵力;
  • 如果这份源码您用的上并且也给您带来部分利益,我接受任何形式的打赏与赞助(点击下方“ 赏” 按钮选择适合您的方式即可),以便我有更多时间和精力整理余下的源码;
  • 微信/zfb打赏的易友可私信索取我的联系方式,包括但不限于本模块范围之内我们可以互相交流帮助;
  • 当然如果您只希望无偿使用,或者您认为这没什么价值,随手能点个赞,我也倍感欣慰!
  • enjoy it!
npzs 2019-02-22 于大连



更新日志:
v1.21 - 2019.04.14
  • 没有任何功能上的更新,内部代码与结构调整优化,轻微提升效率与派生模块适配性;
v1.2 - 2019.03.12
  • 添加:添加了一个 X64CallArr 函数,使用数组方式调用 64 位函数,这样就相当于无限参数数量了,应易友 @开始学易语言 的需求;
  • 更新:极大优化了 X64Call 的代码,现在的通用调用性能损失几乎可忽略不计,实际上本模块的所有代码都是一句句汇编写出来的,本身比起依赖 VC 编译器自动优化的代码都要效率很多倍;
  • 更新:修正加载本模块后无法使用易语言 “运行” 命令的 BUG,实际还有 CreateProcess API 也一同修复,感谢易友 @scgs3178 发现的问题;
v1.1.1 - 2019.03.03
  • 没有任何功能上的更新,只是内部接口预留了空间,便于派生模块使用,后期我如果发布以本模块为基础的功能模块时,至少要更新到该版本!
v1.1 - 2019.03.01
  • 添加:ntdll 实现的 LoadLibraryEx64/FreeLibrary64 及其 32 位版本,从此开始你的易语言可以随意加载 64 位 DLL 啦(包括 64 位的 kernel32.dll),只要你会调用 ^_^,这应该是革命性的首创吧。(要是有前辈已经公布了算我孤陋寡闻了;64 位函数没多难,只要注意参数类型、堆栈对齐和结构对齐就可以了)
  • 添加:原创的内存 DLL 加载函数,集成在 LoadLibraryEx32/FreeLibrary32 之中,不要高兴的太早,只能加载内存中 32 位的 DLL(不管是字节集还是数据指针均可);64 位的短期内实现不了了,因为 WOW64 环境切换的 64 位环境实际上除了 ntdll 就没啥了,想手动实现 Peloader 处理 DLL 所有导入库难度太大了;其实意义也不大,能加载本地 64 位 DLL 够用了;该代码参考诸多前辈开源项目,由本人综合而成,与网上流传的诸多版本最大的不同是除了 DLL 存储空间外没有申请任何额外的内存;返回的基址就是标准的 PE 格式,当然没有zc到进程加载列表,所以 API 方式的 GetProcAddress 无法获取函数,只能用本模块提供的 GetProcAddressEx(也就是传递函数哈希值)的方法获取调用函数地址,其实这也是属于隐藏加载 DLL 了;
  • 添加:OpenProcess64/CloseHandle64 及其 32 位版本,用于打开关闭进程句柄;实际上通过进程标识符打开进程句柄时 32/64 位版本是通用的;
  • 添加:ntdll 实现的 GetDefaultHeap64/HeapAlloc64/HeapReAlloc64/HeapFree64/HeapSize64 及其 32 位版本,实话说从堆申请内存而言,64 位意义不大,只是随着 32 位版本一起提供了
  • 添加:ntdll 实现的简化版默认堆申请函数 malloc64/realloc64/free64 及其 32 位版本,省的每次都得获取默认堆句柄了
  • 添加:ntdll 实现的 RtlInitAnsiString64/RtlFreeAnsiString64、RtlInitUnicodeString64/RtlFreeUnicodeString64、RtlAnsiToUnicode64/RtlUnicodeToAnsi64 字符串处理函数及其 32 位版本,虽然这些函数重要程度不高,但较多 NT-API 均需使用,因此模块予以提供;
  • 添加:绝大部分函数模拟 Windwos 机制,在调用失败后会自动设置错误码,以便调用 GetLasterror 函数可以获得错误原因
  • 更新:修正 GetProcAddressEx 系列函数针对转向 DLL 函数地址获取错误的 BUG;
  • 更新:修正 VirtualQueryEx86 函数参数 4 的描述错误(仅仅是描述而已),结构长度应为 28 而不是 24;
  • 更新:优化模块共享机制,作为底层模块,即使再多扩展模块加载本模块也只会共享相同接口,而不会占用更多资源;
  • 更新:优化了部分代码,提升了几个时钟周期的效率(( ╯□╰ ),没办法,本就是底层的东西,效率提升不了多少了)

eWOW64Ext_v1.21.rar (75.79 KB, 下载次数: 3602)
作者: 1185384801    时间: 2019-5-2 20:20
建议加入远程创建线程,主要是shellcode比较麻烦
作者: ccok    时间: 2019-5-2 20:27
顶死顶死顶死顶死顶死顶死顶死顶死顶死顶死顶死顶死顶死顶死顶死顶死顶死顶死顶死顶死顶死顶死顶死顶死顶死顶死顶死顶死顶死顶死顶死顶死顶死顶死顶死顶死顶死顶死顶死顶死顶死顶死顶死顶死顶死顶死顶死顶死顶死顶死顶死顶死顶死顶死顶死顶死顶死顶死顶死顶死顶死顶死
作者: 372510145    时间: 2019-5-3 14:19
又又又 更新了。
作者: kyo9766    时间: 2019-5-3 15:28
新手懵懂进来,懵懂走了,感觉很厉害,感谢分享
作者: 56766876    时间: 2019-5-3 21:57
支持,膜拜了~
作者: 易展    时间: 2019-5-4 00:47
为什么为什么要过来一个个下
作者: ﹃路ゝ沉默    时间: 2019-5-4 09:53
支持一下!
作者: z博士    时间: 2019-5-4 10:19
大佬 牛逼。            
作者: 侠儒无踪    时间: 2019-5-4 10:48
默默的为大佬顶起!!!!!
作者: yystormfly    时间: 2019-5-4 16:17
先支持,感谢分享!
作者: hehz977    时间: 2019-5-4 20:24
很好!!!!!!
作者: z193347805    时间: 2019-5-5 08:15
大佬流劈。。。
作者: z193347805    时间: 2019-5-5 08:16
。。。。。。。。。。
作者: happily    时间: 2019-5-5 09:24
先支持,感谢分享!
作者: 2838036369    时间: 2019-5-5 16:08
不错的源码,谢谢
作者: 毛超    时间: 2019-5-5 17:23
感谢分享1!!!!!!
作者: 1983399346    时间: 2019-5-5 20:38
劳动光荣,感谢作者,感谢你们
作者: 1983399346    时间: 2019-5-5 20:43
下不了  怎么回事啊
作者: liuhuijie    时间: 2019-5-6 05:51
感谢奉献 !!!!!!!!!
作者: JunBW5858    时间: 2019-5-6 07:18
谢谢分享
作者: yzr3598    时间: 2019-5-6 10:07
eWOW64Ext 学习学习
作者: 三九敌敌畏    时间: 2019-5-6 19:13
谢谢分享。。。。
作者: 451601    时间: 2019-5-7 13:54
大碗大碗大碗大碗大碗
作者: sony09090    时间: 2019-5-7 20:29
简直是给易语言增添强劲的功能
作者: 1250450868    时间: 2019-5-8 22:44
感谢分享,支持支持支持。
作者: cx1    时间: 2019-5-9 13:42
谢谢分享谢谢分享谢谢分享谢谢分享谢谢分享谢谢分享谢谢分享
作者: qq793359277    时间: 2019-5-10 15:35
大佬 64位游戏进程 内置地址高达9位数 14XXXXXXX  能读取数据 但是却无法写入数据 这是为何?
作者: xiaotaoc    时间: 2019-5-11 12:19
感谢分享 试试看
作者: xiaotaoc    时间: 2019-5-11 12:19
感谢分享 试试看
作者: qq793359277    时间: 2019-5-11 22:02
大佬  有没有办法申请高位数内存? 应用地址太长 我想JMP 但是不行
作者: 54212    时间: 2019-5-12 20:59
感谢分享,玩玩
作者: snadong    时间: 2019-5-13 05:52
谢谢分享,支持开源
作者: 152878787    时间: 2019-5-17 21:10
1222222222222222222222222
作者: 453528889    时间: 2019-5-19 20:56
感谢分享!
作者: boxxie    时间: 2019-5-20 17:29

楼主,可以调用64的DLL吗?
作者: nxz699    时间: 2019-5-21 02:00
感谢发布原创作品,一定好好学习,天天向上
作者: nxz699    时间: 2019-5-21 02:01
感谢发布原创作品,一定好好学习,天天向上
作者: alanwoo    时间: 2019-5-21 13:10
看上去很强大的样子
作者: 南极886    时间: 2019-5-23 21:47
不错学习了
作者: 453528889    时间: 2019-5-27 11:21
赠人玫瑰,手留余香
作者: km深度    时间: 2019-5-27 15:13
一定好好学习,天天向上
作者: lenvon2012    时间: 2019-6-1 16:42
支持,膜拜了~
作者: 懒人定制软件    时间: 2019-6-2 08:15
大神,请收下我的膝盖  
作者: wgqxj    时间: 2019-6-3 16:38
谢谢分享 学习了
作者: 皮皮驴    时间: 2019-6-5 14:31
支持,膜拜了~
作者: xmm    时间: 2019-6-6 09:30
感谢发布原创作品,一定好好学习,天天向上
作者: 好好他爸    时间: 2019-6-7 14:09
不知道有什么用啊
作者: SLJY    时间: 2019-6-8 12:33
谢谢分享!!!!!
作者: 星痕彡    时间: 2019-6-13 20:07
谢谢分享{:3_41:}{:3_41:}{:3_41:}
作者: 落寞23333    时间: 2019-6-15 23:11
汇编大佬膜拜了
作者: Peerless    时间: 2019-6-17 02:54
谢谢分享,学习 了
作者: 云韵    时间: 2019-6-17 18:12
支持下用的到Dev
作者: 659656hkl    时间: 2019-6-18 16:38
支持,膜拜了~
作者: 不苦小和尚    时间: 2019-6-18 20:11
win7 64位下不起作用
作者: lei45627    时间: 2019-6-20 09:24
感谢你的付出与分享
作者: 江洪滨    时间: 2019-7-5 09:19
不兼容啊,直接就程序停止了win7 32
作者: LSXAN    时间: 2019-7-12 23:53
谢谢分享,。
作者: 630879085    时间: 2019-7-21 13:01
感谢分享!
作者: SaWar    时间: 2019-8-2 15:28
感谢楼主!
作者: ColdCharm    时间: 2019-8-8 13:49
谢谢楼主的分享!
作者: wmt666    时间: 2019-9-2 20:45
66666666666
作者: qsmoon    时间: 2019-9-15 14:30
枚举到的进程模块,怎么卸载或者删除这个模块
作者: asd1907    时间: 2019-10-19 13:42
哈哈哈哈哈哈哈哈哈哈哈哈
作者: 开始学易语言    时间: 2019-10-20 07:27
大佬能否把你的ejson和ehash模块开源
作者: gaoqing    时间: 2019-11-1 11:54
必须支持啊
作者: sunmoonstar    时间: 2019-11-4 14:55
支持,膜拜了
作者: xl970525    时间: 2019-11-8 16:06
更新:优化了部分代码,提升了几个时钟周期的效率(( ╯□╰ ),没办法,本就是底层的东西,效率提升不了多少了)
作者: 开始学易语言    时间: 2019-11-8 22:56
win10不能申请64内存,申请结果0
作者: huchaoold    时间: 2019-11-14 01:22
反馈一个BUG,载入此模块后,HttpSendRequestA函数异常。不载入模块正常调用,一载入模块就会返回假,GetLastError:126,找不到模块。
我想应该在模块初始化时
.子程序 eWOW64ExtInit, 整数型
置入代码 (#X86_Init)
置入代码 (#X64_Init)
置入代码 ({ 102, 140, 217, 102, 142, 209, 139, 77, 252, 102, 142, 225, 139, 229, 93, 195 })
这个子程序导至了某个链表被定义到了x64模式,这只是猜测。
看看能不能初始化之后,反初始化呢?
另外本人目前急需您修复这个问题,有偿,希望您看到后联系我,QQ:543737295
作者: 黑色№    时间: 2019-11-18 13:52
支持下,下载来看看
作者: xy1002    时间: 2019-11-22 14:10
支持                  
作者: wangshen2019    时间: 2019-12-22 14:15
66666666666666666
作者: MrDeng    时间: 2019-12-23 03:43
支持,膜拜了~
作者: yy750446    时间: 2019-12-23 12:31
赠人玫瑰,手留余香
作者: 莫泽才    时间: 2020-1-3 00:43
虽然用不到,也算是激励。
作者: 13804061190    时间: 2020-1-7 21:07
支持,膜拜了~
作者: htpand29    时间: 2020-2-19 01:06
厉害了,作者
作者: 630879085    时间: 2020-2-27 00:55
感谢分享!
作者: 恶魔の佐翼    时间: 2020-3-1 12:51
已测试,WIN7,远程读取无效。。。。。

QQ截图20200301124955.png (27.29 KB, 下载次数: 0)

QQ截图20200301124955.png

作者: zh5257    时间: 2020-3-3 23:39
谢谢你提供
作者: zspmhzx    时间: 2020-3-4 14:06
恶魔の佐翼 发表于 2020-3-1 12:51
已测试,WIN7,远程读取无效。。。。。

A应该要长整数把
作者: 恶魔の佐翼    时间: 2020-3-4 14:37
zspmhzx 发表于 2020-3-4 14:06
A应该要长整数把

A是进程句柄,不需要长整数吧
作者: 一点看客    时间: 2020-3-4 19:56
牛人!!!!!!!!!!!1
作者: awuming    时间: 2020-3-11 17:54
666666666666666666
作者: 小飞爱精易    时间: 2020-3-13 23:04
支持,膜拜了~
作者: ujff77    时间: 2020-3-18 11:20
谢谢你提供
作者: Easylanguage666    时间: 2020-3-20 11:29
66666哈哈哈哈哈
作者: woaini12351    时间: 2020-3-29 22:19
#在这里快速回复#不懂别用麻烦来代替,作者不是由个X64CALL供你参考吗
作者: qq444255022    时间: 2020-4-3 11:42
测试加载X64DLL无效
作者: Masterヽ    时间: 2020-4-6 20:05
劳动人民最可爱!~
作者: 小兮gg    时间: 2020-5-15 09:29
反馈:
X64的DLL无法使用user32.dll命令,带user32.dll命令,加载DLL直接崩溃
作者: 1032214947    时间: 2020-6-12 10:51
GetProcAddress64 (GetModuleHandle64 (“Kernel32.dll”), “WinExec”)   取不到    NT的可以  有什么解决方法么
作者: 胖虎O    时间: 2020-6-17 10:48
从sqlite模块过来的,感谢
作者: 奋斗的心    时间: 2020-7-9 21:46
提示: 作者被禁止或删除 内容自动屏蔽
作者: 莫泽才    时间: 2020-7-12 03:03
支持,膜拜了~
作者: Hawk    时间: 2020-7-23 14:48
调用第三方的64位DLL,有例子吗.
作者: 843120    时间: 2020-7-24 03:43
支持作者 好东西啊
作者: 洛溪希    时间: 2020-7-24 11:16
支持,膜拜了~
作者: 赤小瞳    时间: 2020-8-5 01:36
为什么要保存FS寄存器啊  我想问一下·.·




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4