为编程爱好者分享易语言教程源码的资源网
好用的代理IP,游戏必备 ____广告位招租____ 服务器99/年 ____广告位招租____ ____广告位招租____ 挂机,建站服务器
好用的代理IP,游戏必备 ____广告位招租____ 服务器低至38/年 ____广告位招租____ ____广告位招租____ 挂机,建站服务器

网站首页 > 易语言相关 > 易语言模块源码 正文

易写 64 位子程序|易读写 64 位进程 - eWOW64Ext 模块纯源码

三叶资源网 2019-02-23 13:39:41 易语言模块源码 4319 ℃ 14 评论

本模块的核心作用简单描述是:允许你在一个易语言子程序内进入 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,请提供错误重现代码及执行环境,如非不可抗因素我都会及时更新的;


模块部分命令简述:

辅助函数:

.版本 2

.子程序 fn_WOW64Enabled, 逻辑型, , 如果你在代码中需要使用 64 位汇编或者操作 64 位进程,则初始化时应确保本函数返回真。实际只要是 64 位操作系统,均应返回 真;



.子程序 fn_ProcessIsX64, 逻辑型, , 检测指定进程是否为 64 位进程



.子程序 fn_CalcModOrFuncHash, 整数型, , 使用过动态调用DLL的都清楚取模块基址和函数指针,微软默认使用字符串对比,本模块可使用哈希对比效率和易用上相对提升,本函数用于计算模块或函数哈希

易内部命令:

.版本 2

.子程序 X64Call, 长整数型, , 调用 64 位函数,进程内外均可;实际我在项目中均是针对单独功能单独编写调用以提升效率,本函数仅供缺乏汇编知识的用户通用



.子程序 X64MemCopy, , , 同类还有 X64MemCmp 函数;从 64 地址复制数据或 64 位地址与 32 位地址数据对比,但仅限进程内部



.子程序 X64GetLong64, 长整数型, , 获取 64 位地址数值,同类函数还有:X64GetLong32、X64GetWord、X64GetByte



.子程序 X64GetTEB, 长整数型, , 取当前易程序 64 位 TEB,通过 TEB 再取 PEB,则进程和线程信息以及模块等一览无余了



.子程序 GetNtdll64, 长整数型, , ntdll.dll 在 64 位环境下的内存基址,其实在易中进行 64 位编程主要就靠它的函数了,因为 kernel32 是获取不到的



.子程序 GetModuleHandleEx64, 长整数型, , 通过模块哈希值获取其 64 位地址空间的内存基址(易进程而不是外部进程哦);同类还有 GetModuleHandle64、GetProcAddress64、GetProcAddressEx64



.子程序 NtQuerySystemInformation64, 整数型, , cha询系统信息,可获取很多类别信息。这个 API 微软已不推荐使用并给出部分替代 API,但其个别功能十分好用且没用可替代品。cha询系统进程也是最全面的

外部进程命令:

.版本 2

.子程序 NtQueryProcessPEB64, 长整数型, , 获取外部 64 位进程PEB



.子程序 VirtualAllocEx64, 长整数型, , 在外部 64 位进程分配内存,释放函数为 VirtualFreeEx64



.子程序 VirtualQueryEx64, 整数型, , cha询外部 64 位进程指定内存区域的状态



.子程序 VirtualProtectEx64, 逻辑型, , 更改外部 64 位进程指定内存区域的保护属性



.子程序 ReadProcessMemory64, 逻辑型, , 读取外部 64 位进程指定区域的内存数据



.子程序 WriteProcessMemory64, 逻辑型, , 向外部 64 位进程指定内存区域写入数据



.子程序 NtQueryInformationProcess64, 整数型, , cha询外部 64 位进程信息



.子程序 GetThreadContext64, 逻辑型, , 获取线程上下文,多用于 SEH,仅供高级用户使用;相应设置函数为 SetThreadContext64

以上只是适用于 64 位的部分函数,同样我在模块中也实现了大多数命令相同形式的 32 位命令,用于操作 32 位进程,合计公开函数有 50 多个,这里就不列举了;

.版本 2

.子程序 编写x64汇编框架, , , 返回值不限制,同 x86 相同

' 如果本子程序中需要调用 64 位函数,则此时应保存 fs 寄存器及对齐栈顶,可参考源码中的 #X64_SaveFs

置入代码 (#X64_Start)
' 在此区域内可使用 64 位纯汇编代码

置入代码 (#X64_End)  ' #X64_End 与 #X64_Start 必须在同一个子程序中成对使用

' 如果本子程序中需要调用 64 位函数,则此时应恢复 ss/fs 寄存器,可参考源码中的 #X64_RestoreFs
' 然后就是 x86 中的平栈返回或者由易子程序返回

@shier2817

文件下载

来源:三叶资源网,欢迎分享,公众号:iisanye,(三叶资源网⑤群:21414575

已有14位网友发表了看法:

  • yiyuyan

    yiyuyan  评论于 [2019-06-01 17:07:23]  回复

    易语言 VirtualQueryEx

  • 易语言

    易语言  评论于 [2020-03-28 13:42:04]  回复

    易语言获取64线程上下文

  • 易语言

    易语言  评论于 [2020-05-08 23:01:19]  回复

    读写64位进程eWOW64Ext模块

  • 易语言

    易语言  评论于 [2020-08-18 16:17:21]  回复

    易语言x64汇编

  • 易语言

    易语言  评论于 [2020-09-08 09:35:03]  回复

    64位进程读写内存api

欢迎 发表评论:

百度站内搜索
关注微信公众号
三叶资源网⑤群:三叶资源网⑤群

网站分类
随机tag
标签浏览器GDI+API源码抖音二值化新浪股吧键盘钩子皮肤制作倒计时EXCEL导入导出s5代理集群windows 98风格易语言IDE界面空格房天下js加密源码趣约会算法易语言纯画板格式化json文本对比两块内存系统服务优化向导
最新评论