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

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