我又来了朋友们,首先祝愿进帖子的兄弟姐妹们国庆愉快,都都发财!废话不啰嗦 x64_远程hook 这个模块继续在精益开源并更新V2.6首发
---------------------------------------------------------------本次更新内容
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,且支持了不在模块区域的可执行代码中hook3回调接口 现在传回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当时的经过为挂起等待状态灵活多变的自由控制,可达到几乎所有的要求