易语言远程x64位汇编call技术

易语言x64位调用call函数与 分析64位call技术

上两篇易语言对x64位进程操作的技术贴发出后,因为得知我们 Game-Ec 驱动模块8.5.3里
开发了对x64程序进程里的模块,API取地址,内存读写,内存搜索,函数hook,call函数调用等诸多命令功能后,很多写64位游戏辅助的学员激动不已。

因为这些功能预示着写64位游戏辅助不用换其他语言来写了,有了这次版本里加入的各种x64功能,易语言可以完美的开发64位游戏内存辅助了,因为可以读写内存数据,可以HOOK,可以内存搜索,最关键的是还可以远程调用x64程序进程里的指定call执行x64汇编代码。

今天就来示范讲解下这次我开发加入的 调用64位程序进程里的call的命令:
x64进程_调用函数()
这个命令有两个参数,
进程ID //目标x64位进程ID
x64汇编 //执行call的x64汇编代码

这个命令,之前一直不够稳定,所以一直测试,后来经过黑,色,衬,衣他的改良修改指点,现在完美了
({:101_195:}都怪黑色,衬,衣他太忙,不然这篇帖子能早出,哈哈)。

写法和我们已经出版的系列辅助视频教程啊教的写32位程序CALL一样简单。

首先我用vs2020写了个64位程序(mfcapplication1.exe),来作为示范用(当做64位的游戏)
布局:
在这里插入图片描述
程序源代码:
在这里插入图片描述

这个64位程序,主要功能就是构建了一个call功能:add ( ) 加法函数
然后计算出2个数的和
首先我们要来逆向分析下我写的这个X64位程序,找出我们要调用的CALL,
既然是64位程序,当然就需要个64位DUG调试工具(类似我们的OD)
我用的是 x64dbg.exe

附加我的64位程序:mfcapplication1.exe 后
我们在x64dbg.exe 工具命令栏目输入 bp MessageBoxA 来对 信息框API进行函数断点,因为方便定位,我就在源码里加了 MessageBoxA 信息框
这样我们单击 确定 按钮时候 就会断下来,然后好快速分析到 我们这个64位示范程序的 确定 按钮call函数
找到了这里:
在这里插入图片描述

从上面反汇编代码 右边的注释来看,有我们信息框的标题和内容字符,可以肯定现在我们断在了 MessageBoxA 调用位置。
但是我们要找的是 确定 按钮CALL,所以应该在这个call的上一层,所以返回上一层看看
来到了:
在这里插入图片描述

经过F2设置断点后,运行示范程序mfcapplication1.exe,点击确定按钮会被断下来,而且测试几次所mov的几个寄存器的值也是固定的不改变
所以这个应该就是我们要找的 确定 按钮call,
梳理这个call的代码为:
mov rax,000000013F8DAB90
mov rcx,000000000028F020
mov rax,000000013F8DAB90
call 13F8E7EF8
接下来就是写调用它的易语言代码了
因为我们的辅助是用易语言写,代码很简单
如下:
在这里插入图片描述

调用call的:
在这里插入图片描述

sub rsp,38
。。。。。。。
。。。。。。。

add rsp,38
ret
上面代码中的这开头和结尾这3句必须要写,因为x64汇编是必须写上的噢,否则会奔溃。

下面我们来看调用效果:
在这里插入图片描述
可以完美的调用64位程序(mfcapplication1.exe)进程里的指定CALL,好了,这节 就到这里。
更多易语言X64进程操作的技术到:http://bbs.dult.cn/forum.php?mod=viewthread&tid=24053 学习

模块原理: 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 汇编置入代码; 允许调用易程序 64 ntdll.dll 的所有函数,也就是你虽然开发的是 32 程序,但可以实现很多 64 函数所能实现的功能; 直接使用 64 函数ziyou读写(注入) 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 命令,这里就不列举了; 辅助函数 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 查询系统信息,可获取很多类别信息。这个 API 微软已不推荐使用并给出部分替代 API,但其个别功能十分好用且没用可替代品。查询系统进程也是最全面的 OpenProcess64 打开进程句柄,关闭进程句柄时使用 CloseHandle64;【v1.1新增】 HeapAlloc64 堆管理函数,同类还有 GetDefaultHeap64/HeapReAlloc64/HeapFree64/HeapSize64;【v1.1新增】 malloc64 简化版默认堆管理函数,同类还有 realloc64/free64 RtlUnicodeToAnsi64 内核实现的 Unicode、Ansi 结构(不是数据指针)管理函数,同类还有:RtlInitAnsiString64/RtlFreeAnsiString64、RtlInitUnicodeString64/RtlFreeUnicodeString64、RtlAnsiToUnicode
wow64_hook 源码历史更新 --------------------------------------------------------------- 2021/4/16  模块源码1.8.7 更新: 1:重新架构了穿插汇编指令,优化了一些代码和流程 2:在 远程hook64指令_安装()时新增可回调的3个自定义参数值,这些值在回调接口的[寄存器64.自定义值1;2;3]里可获取到该值 3:修复 寻找无效8字节指令地址()中一个重要BUG,此BUG极大可能导致之前版本在 远程hook64指令_安装()时即导致目标程序崩溃的现象 本次更新比较重要 建议使用者更新到此版本使用............ --------------------------------------------------------------- 2021/4/15  模块源码1.8.6 更新: 1:新增3组函数:X64_取模块代码区起始地址(),X64_取模块入口地址(),X64_取模块代码执行段大小() 2:自定义类型:模块信息64,的成员构成新增改动为 以下,在枚举模块中亦可直接取得 成员 模块基址, 长整数型, , , 模块映像的内存地址 也称为句柄 成员 模块长度, 整数型, , , 整个模块文件长度 成员 模块入口, 长整数型, , , 模块入口函数地址 如 Mian/DllMain 成员 模块代码入口, 长整数型, , , 模块代码执行区起始地址 成员 模块代码长度, 整数型, , , 模块代码执行区的长度 成员 模块名称, 文本型, , , 文件名称 成员 模块路径, 文本型, , , 完整的路径地址 3:新消息接口()远程返回_调用回调子程序()优化了代码严谨性,减少hook目标崩溃的可能性 4:寻找无效8字节指令地址()由之前的全模块查找 改动为 在模块代码执行区查找 5:改写模块实列为 一对多的模式 6:模块实列操作控件的方式由变量改为堆内存,避免引起多线程自身崩溃 7:模块实列 对 recv,recvfrom两个函数的hook方式由原先 在回调内 暂停recv-->recv_call-->恢复recv,的方式改为经过特殊改造的 recv_call,这个call经过特殊处理,在recv回调函数内调用,用来取得真实长度,这个调用会绕过hook置,所以不会触发 recv回调,详见源码 8:修改了一些已知可能出现的问题 --------------------------------------------------------------- 2021/4/12 模块源码 v1.8.2更新 1:修复 x64_远调用函数()在 易语言 主线程调用时造成消息无法回调,导致易语言主线程窗口卡死的问题。      感谢楼下易友发现的BUG,已经第一时间更新 --------------------------------------------------------------- 2021/4/12 模块源码 v1.8.1更新 1:修复 hook全部卸载时的流程写法的一个错误,由于句柄的提前关闭导致多个hook点卸载不干净的问题 2:改写了消息回调时线程传参的代码优化,优化了其他一些小问题 3:  鉴于很多朋友需要,改写了模块自带实列,对TCP,UDP的两组封包函数做了hook实列写法 4:列子中同样增加对x64_远调用函数()的应用写了几个列子,如使用套接字取得本地或远端IP端口API调用的的应用实列 5:本hook模块不支持非模块内存区hook,如申请的动态分配页等,不是不能支持,只是觉得没有任何意义,对这方面有需求的,自行改写模块源码使用 提醒:hook回调函数中尽量减少耗时代码,时间越长返回越慢,回调中谨慎操作控件,如必须要用到可参考源码中实列写法采用线程操作 --------------------------------------------------------------- 2021/3/1   模块源码v1.6更新: 1:修复  x64_远程调用函数()命令,在没有提供 寄存器 参数时,没有返回值的BUG。 --------------------------------------------------------------- 2021/2/28 模块源码v1.5更新: 一:修复win7 64系统下枚举模块 出现部分模块长度出现负数的问题,从而导致部分win7用户不能使用 二:强化 远程hook64指令_安装 的稳定性:        1,穿插代码中增加对标志的保护,避免hook置长度下一条指令为跳转时产生跳转错乱的问题,强化了hook任意置的定        2,因为穿插代码中会调用AP
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值