开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 36362|回复: 416
收起左侧

[易语言纯源码] x64_远程hook,x64_veh硬断hook 模块源码更新V2.6:2021/10/3

    [复制链接]
发表于 2021-10-3 22:29:12 | 显示全部楼层 |阅读模式   浙江省绍兴市
分享源码
界面截图:
是否带模块: 纯源码
备注说明: -
本帖最后由 树上的鱼儿 于 2021-10-3 22:31 编辑

我又来了朋友们,首先祝愿进帖子的兄弟姐妹们国庆愉快,都都发财!废话不啰嗦 x64_远程hook 这个模块继续在精益开源并更新V2.6首发 QQ图片20211003221238.png

---------------------------------------------------------------本次更新内容
2021/10/3  模块源码2.6 更新:
1:增加 drx硬件断点hook VehDrx_hook64_安装() 每个进程限4个hook位置 VehDrx_hook64_恢复() VehDrx_hook64_卸载() VehDrx_hook64_暂停()
             r3层 硬件断点hook  硬断不会改写目标进程执行代码 不会引发crc检测机制 但是会被检测drx机制检测 由于易语言的特殊性 数据之间依然存在通讯 实际应该称为x64远程硬件断点hook 这种方式只建议特殊情况使用 在效率和稳定性上不如 远程hook64指令_安装() 在安装时对进程目标所有线程有效 后创建的新线程不会引发断点 除非再次安装
2:增加 x64_进程句柄到进程ID()成功返回对应进程的PID,失败返回-1


2021/9/30  模块源码2.5 更新:
1:修正 内存64_读字节集() 一个写法错误,修正为一次性读取指定长度的字节集
2:增加 本地加载64位dll演示() 的一个参考代码
3:增加 X64_查线程信息() ntdll.dll->ZwQueryInformationThread 实现
4:增加 X64_打开线程() ntdll.dll->ZwOpenThread
5:增加 X64_枚举进程() 全面的枚举系统进程信息,返回比较详细的进程信息结构,成功返回当前枚举到的进程个数,失败为0
        参数 进程信息, 进程信息64, 数组, 从这个参数返回枚举到进程信息结构体数组
              成员 线程数目, 整数型
              成员 创建时间, 长整数型 可用 FileTime转为时间格式()转换为北京时间
              成员 用户时间, 长整数型
              成员 内核时间, 长整数型
              成员 进程名, 文本型
              成员 基本优先级, 长整数型
              成员 进程PID, 长整数型
              成员 父进程PID, 长整数型
              成员 句柄数目, 整数型
              成员 虚拟内存统计
              成员 IO操作统计
6:增加 X64_枚举线程() 枚举进程线程信息,返回比较详细的线程信息结构,成功返回指定进程枚举到的线程个数,失败为0
        参数 进程PID, 整数型, , 必须是一个目前正在运行的进程PID
        参数 线程信息, 线程信息64, 数组, 从这个参数返回枚举到线程信息结构体数组
              成员 内核时间, 长整数型
              成员 用户时间, 长整数型
              成员 创建时间, 长整数型 可用 FileTime转为时间格式()转换为北京时间
              成员 等待时间, 长整数型
              成员 启动地址, 长整数型, 线程在R3层第一条指令地址,一般是RtlUserThreadStart函数线程进程安全入口.如需获得真实线程入口 使用 X64_取线程入口()
              成员 进程ID, 长整数型
              成员 线程ID, 长整数型
              成员 线程优先级, 整数型
              成员 基本优先级, 整数型
              成员 切换计数, 整数型
              成员 线程状态, 整数型
              成员 等待原因, 整数型
7:增加 X64_取线程TEB() 返回指定线程句柄对应的线程TEB结构所在内存地址 返回结果到参数二
        参数 线程句柄, 整数型, , 提供目标线程句柄, -2=易语言执行线程句柄
        参数 线程TEB, 长整数型, 参考, 返回TEB构所在内存地址
8:修改 原WoW64模块的 X64_取线程上下文() ntdll.dll->ZwGetContextThread 相当于 GetThreadContext函数 需要获得线程上下文必须先挂起线程 并根据CONTEXT64结构ContextFlags成员获得相应信息 wow64环境下有很大几率调用失败,不建议使用本接口 以供参考或临时使用
9:修改 原WoW64模块的 X64_置线程上下文() ntdll.dll->ZwSetContextThread 相当于 SetThreadContext函数 置上下文成员必须先挂起线程 并根据CONTEXT64结构ContextFlags成员决定重置项 wow64环境下有很大几率调用失败,不建议使用本接口 以供参考或临时使用
10:增加 x64_取线程上下文结构体()  wow64环境下有很大几率调用失败,不建议使用本接口 以供参考或临时使用
11:增加 x64_置线程上下文结构体()  wow64环境下有很大几率调用失败,不建议使用本接口 以供参考或临时使用
12:增加 X64_取线程真实入口() 根据线程句柄返回线程的入口地址,失败返回0
13:增加 X64_线程句柄到进程ID() 成功返回对应进程的PID,失败返回0
14:增加 X64_线程句柄到线程ID() 成功返回对应的线程ID,失败返回0
15:增加 FileTime转为时间格式() 将18位长整数型的File系统文件创建时间 转换成日期时间型 如 132762591809225412 转为  2021年9月16日19时46分
16:另增加了一些参与的变量类型转指针接口;增加或修正一些必要的数据类型;增加一些dll命令 暂停线程__()等
17:开辟一个新程序集 [Veh_hook64]本程序集时间原因未完成开发 预留备用 VEH+硬断 hook
内部有一些 预备子程序 如有需要可以参考
call_OpenThread() 在目标进程打开指定线程,返回打开后的线程句柄值,这个句柄在我方进程不能使用,权限属于目标进程,我们只是需要获得这个值,已做它用
call_ZwClose() 在目标进程中调用 ZwClose 函数关闭目标进程中某个已经打开的对象句柄
call_ZwGetContextThread() 根据 线程句柄 找到 线程所属进程 中去调用 ZwGetContextThread 函数取得上下文后 从参数二返回 CONTEXT64结构体 调用本接口请挂起线程 否则该数据将不是即时有效的 本接口能稳定获得上下文
call_ZwSetContextThread() 根据 线程句柄 找到 线程所属进程 中去调用 ZwSetContextThread 函数 重写CONTEXT64结构体,本接口重置所有寄存器,确保在同一次挂起线程中配合call_ZwGetContextThread()改写,否则后果自负 本接口能稳定获得上下文
call_RtlAddVectoredExceptionHandler() 在目标进程中远线程执行RtlAddVectoredExceptionHandler函数,注册一个向量化异常处理接口,成功返回注册的向量异常处理程序的句柄
call_RtlRemoveVectoredExceptionHandler()取消注册向量异常处理程序。如果函数成功,则返回值非零。
---------------------------------------------------------------

历史更新记录:
2021/5/5  模块源码2.3 更新:
1: hook通讯模式由消息模式 改为 线程模式,线程模式相比消息模式更自由,不存在堵塞的可能性,安装时没有了窗口句柄参数
2:远程hook64指令_安装()中 hook长度 参数 现在支持最小 5字节hook,且支持了不在模块区域的可执行代码中hook
3  回调接口 现在传回4个参数 必须为 可空 参考 分别是 control_寄存器;自定义回调值;目标进程句柄值;触发Hook线程ID,写的时候参考源码实例
4:新增 子程序 x64_申请指定内存()
     该接口可以在目标进程指定地址处分配内存 如果该地址不可申请会在附近2G偏移内寻找一处申请 失败返回0 成功返回指针
5:修复hook过程中因自身进程意外关闭而导致目标进程卡住或崩溃的问题
6:修复 远程hook64指令_全部卸载()在调试模式调用时出现的系统报告异常问题
7:实例中 对 call_send()特殊处理了一下,这个调用可以根据设置是否绕过hook位置,如果参数四为真不会触发send回调
8:实例中 简单增加了几个子程序,封包寻找替换规则() call_API() call_WSASend()这几个给予参考,未用于实例应用,WSASend没有找到目标进程所以未经测试
9:提示:X64_取进程函数入口()这个调用返回是比较慢的,因为要在所有的DLL中寻找出对应的DLL然后再去找对应的函数,所以此接口在循环中慎用。正确的方式是:因为系统API接口 在每个进程的地址是一样的,所以只需取得一次保存地址给后续调用使用即可
10:实例中 多进程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,因为穿插代码中会调用API函数,而64位汇编必须遵守栈指针16字节对齐,故对穿插代码进行栈指针16字节对齐,增强稳定性
       3,hook指令安装支持长度由6-127字节 变动 为 6-119字节,原因么没必要说了,代码优化造成的,稍微少了一点无所谓了
       4,对模块回调进行了适当优化处理,增强稳定性
三:应支持的朋友需要故增加 x64_远程调用函数()命令,易语言可以直接远call64进程,且无需写汇编代码或机器码指令,支持15个参数,支持返回值,支持16个通用寄存器全部取得返回值
      该功能调用即16字节栈对齐,不要用户管堆栈,代码内部构成,远线程执行,你只需要知道call有几个参数,需要什么寄存器,对应提供即可。
四:有朋友说原模块x64英文看了烦,那好吧就给改成了中文标识,弄得我自己也不习惯
五:源码内列子改了改,可以自己看,需要注意的是模块注释的很详细,使用前最好看一看,尤其是hook回调接口的写法和安装的写法最好按照模块列子中的写法来,除非你能把64hook模块组看懂一遍,对于一些对本模块一知半解的朋友请不要乱改乱发,这个模块我会继续增强的,只是工作原因时间有限,只能一点一点来
--------------------------------------------------------------------

支持最小6字节hook,hook采用JMP转移,且为长转移(并非2G短转移),且支持最小6字节
支持hook任意指令处,支持获得当时16个通用寄存器+一个rip寄存器,的读取及修改
回调接口返回值支持是否执行Hook掉的原指令(0=执行,>0不执行)
支持任意堆栈操作,通过rsp
支持任意rip转移(支持大于2G长转移),通过rip
支持一个易语言程序同时控制多个64位目标进程
支持多个hook点同时回调至一个回调接口内
且所有回调尽阶独立,不论hook位置的复杂经过性皆不影响回调数据
每次hook的经过都会等到回调返回,假如回调接口未返回,则hook当时的经过为挂起等待状态

灵活多变的自由控制,可达到几乎所有的要求

如需其他历史版本进我个人发表历史翻阅下载
附件回复可见:欢迎有这方面兴许的朋友与我交流进步
wow64_hook_2.6.rar (220.92 KB, 下载次数: 1263)

评分

参与人数 23好评 +21 精币 +46 收起 理由
ganyilu + 1 + 2 没有备份XMM浮点寄存器,不完整。
小33 + 1 + 1 支持开源~!感谢分享
llxx123 + 1 + 2 支持开源~!感谢分享
Ezra + 1 新技能已get√
空竹 + 1 + 2 欢迎常来帮助新人,谢谢~
外星人群控 + 1 + 3 这么好的东西,给小鱼儿点赞
凌哥 + 1 + 5 [本周热帖]中唯一能叫“热门”的帖子
nosilence + 1 + 1 支持开源~!感谢分享
116154801 + 1 支持开源~!感谢分享
易语言资源网 + 1 + 5 支持开源~!感谢分享
桥南 + 1 感谢分享,很给力!~
飘在空气里 + 1 + 2 太特么牛逼了
ale99 + 1 支持开源~!感谢分享
揰掵佲 + 1 + 4 感谢分享,很给力!~
就是那个秋 + 1 + 2 感谢发布原创作品,精易因你更精彩!
司徒西 + 1 + 2 支持开源~!感谢分享
小白子 + 1 支持开源~!感谢分享
rnox + 1 + 2 支持开源~!感谢分享
Patek + 1 + 3 新技能已get√
小拳拳捶爆泥 + 1 + 2 支持开源~!感谢分享
feiyu2005 + 1 + 2 支持开源~!感谢分享
精易萧萧 + 1 + 2 啥时候增加修改包
夜的静night + 1 + 2 新技能已get√

查看全部评分


本帖被以下淘专辑推荐:

签到天数: 17 天

 楼主| 发表于 2021-10-10 20:32:21 | 显示全部楼层   浙江省绍兴市
' ---------------------------------------------------------------
' 2021/10/10  模块源码2.82 更新:
' 1:修改 X64_远程调用函数() 远线程调用指定进程中某个函数入口,成功=返回函数执行后的RAX值,其他寄存器值通过参数三返回.失败返回-1 超时返回-2(如果超时 寄存器值将不是有效返回)
' ---增加 绑定主线程 参数,可空.默认=0=创建新的远线程执行,-1=绑定进程主模块线程(初始EXE模块的线程),-2=绑定主线程(进程创建的第一个线程),其他负值(-窗口句柄)=绑定窗口线程,其他大于0值=自定义线程ID(负数功能建议代码外部构成提供线程ID 其他线程效果以测试为准 如果线程正在沉睡 可执行代码并不会立即执行),可用于这方面防护的突破
' ---增加 超时间隔 参数,可空.毫秒计,默认=8000毫秒,提供小于等于零则强制性一直等待返回 否则按照给定的毫秒时间等待返回,如果超时 子程序返回 -2, *注意内部并不处理事件 自身主线程调用时结合实际情况
' 2:删除 call_OpenThread() call_ZwClose() call_ZwGetContextThread() call_ZwSetContextThread() x64_取线程上下文结构体() x64_置线程上下文结构体() 这些都不需要了
' 3:修复 X64_取线程上下文() X64_置线程上下文() 在wow64环境下调用偶尔成功偶尔失败的问题 替代了(2:)中删除的子程序
' 4:新增 X64_进程注入dll() 把x64dll注入到x64进程中去,支持绑定线程注入,成功返回模块基址  失败返回-1  超时并不代表注入失败
' 5:新增 X64_进程卸载dll() 卸载通过 X64_注入dll() 加载的dll,支持绑定线程卸载
' 6:新增 x64_内存注入dll() 支持以字节集的方式将dll内存注入到目标进程 支持绑定线程注入 使之无影无踪 成功返回模块基址  失败返回-1
' ---该功能 参考引用网络开源的 X64_ShellCode 跳板指令 结合我方源码实现
' ---注入成功返回的模块基址 亦可用我方模块命令枚举出导出函数
' ---其他方式难以再次获得内存注入的模块基址 如需另做它用 务必在注入时保存
' 7:新增 x64_内存释放dll () 释放 通过 x64_内存注入dll() 注入的内存dll *注意 如果此时dll有线程代码在执行 可能导致目标进程崩溃
' 8:新增 X64_构造保护寄存器指令集 () 返回将15个通用寄存器和1个标志寄存器压入栈中临时保护的字节集汇编指令 与 X64_构造恢复寄存器指令集() 配对使用
' 9:新增 X64_构造恢复寄存器指令集() 返回将15个通用寄存器和1个标志寄存器从栈中弹出并恢复到各寄存器的字节集汇编指令  与 X64_构造保护寄存器指令集() 配对使用
' 10:新增 X64_构造rip跳转指令集()构造一个 jmp[rip] 的长跳转指令集 jmp qword ptr ds[rip] 占6字节 紧随其后需要8字节跳转地址 共返回14字节
' 11:新增 X64_取进程主模块()根据进程句柄 取进程主模块信息 成功由参数二返回模块信息
' 12:新增 X64_取进程主线程ID()成功=返回 进程第一个创建的线程ID 失败=0 *注意:(它不绝对等于EXE主模块线程)
' 13:新增 X64_取进程主模块线程ID()成功=返回执行进程EXE主模块的线程ID 失败=0 *注意:进程主模块线程ID(不绝对等于)进程主线程ID
' 14:新增 dll定义 取窗口线程ID_ () user32.dll-->GetWindowThreadProcessId 返回=线程ID,参数二 能返回进程ID
' 15:新增 X64_取进程名称 () 进程句柄取进程名,成功返回进程名,失败=“”
' 16:新增 X64_构造保护XMM寄存器指令集() 返回 16个XMM寄存器压入到栈中临时保护的字节集指令 指令执行后rsp-0x100
' 17:新增 X64_构造恢复XMM寄存器指令集() 返回 从栈中取出临时保存的XMM寄存器值到XMM寄存器中 指令执行后 rsp+0x100
' ---------------------------------------------------------------
本次小更新,就不再次发帖了,更新内容就在本帖置顶,需要的朋友进企鹅群内下载源码。
回复 支持 反对

使用道具 举报

结帖率:88% (15/17)

签到天数: 29 天

发表于 7 天前 | 显示全部楼层   广东省深圳市
支持开源~!感谢分享
回复 支持 反对

使用道具 举报

签到天数: 1 天

发表于 2024-1-20 23:18:23 高大上手机用户 | 显示全部楼层   河北省邢台市
太厉害了
回复 支持 反对

使用道具 举报

结帖率:90% (26/29)

签到天数: 7 天

发表于 2023-8-9 08:31:55 | 显示全部楼层   山东省济南市
多谢分享
回复 支持 反对

使用道具 举报

结帖率:0% (0/1)
发表于 2023-8-5 16:53:20 | 显示全部楼层   广东省茂名市
感谢分享啊
回复 支持 反对

使用道具 举报

发表于 2023-7-26 12:23:29 | 显示全部楼层   安徽省合肥市
tfssssssssssssss
回复 支持 反对

使用道具 举报

发表于 2023-7-26 11:46:21 | 显示全部楼层   安徽省合肥市
tfsssssssssssssssss
回复 支持 反对

使用道具 举报

发表于 2023-6-17 18:54:18 | 显示全部楼层   四川省乐山市
阿斯顿发生的发生大的沙发
回复 支持 反对

使用道具 举报

结帖率:50% (1/2)

签到天数: 10 天

发表于 2023-2-1 03:34:10 | 显示全部楼层   山东省泰安市
支持开源~!感谢分享
回复 支持 反对

使用道具 举报

结帖率:50% (1/2)

签到天数: 10 天

发表于 2023-2-1 03:33:49 | 显示全部楼层   山东省泰安市
        没有备份XMM浮点寄存器,不完整。
回复 支持 反对

使用道具 举报

签到天数: 9 天

发表于 2023-1-2 14:32:21 | 显示全部楼层   河南省平顶山市
感谢分享 支持开源 !
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 诚聘英才| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 800073686,邮箱:800073686@b.qq.com
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表