易语言资源网 - 做最全的易语言资源下载社区
<易语言软件开发工程师>特训 第13期(预报名) 精易论坛授权登录

wow64_hook_V2.91 2022/4/27 更新,x64_远程hook,x64_硬断hook,x64_调用函数   [复制链接]

    2022-05-08 10:09:21
    模块控件源码
    易语言资源网
    542 次浏览
    来源链接


wow64_hook 源码历史更新

' ---------------------------------------------------------------

' ' 2022/4/26 模块源码2.91 更新:

' 1: 修复 hook组织短跳代码() 负跳计算BUG

' 2: 修正 易程序与目标程序之间因权限原因引起的hook回调失败的问题

' 3: 新增 远程hook64指令_前置指令() 命令 本接口仅供高级用户使用 作用是进入我方穿插指令前 事先执行 用户提供的汇编指令,触发时寄存器环境=hook触发时环境,[前置指令]运行结果影响[穿插指令],如果你希望还能继续执行[穿插指令]请不要在[前置指令]尾部使用ret,参数三 默认={}=清除[前置指令] 用户提供的前置汇编指令字节集 *注意:对于汇编能力一般的用户慎用 除非您能清楚的知晓您加入的[前置指令]在您的掌控范围...且对于[穿插指令]的影响

' 4: 增加并公开了更多个 命令 具体忘记记载了

' 5:VehDrx_hook64() 功能组命令增加绑定线程安装 参数

' 6: 此版本往后 使用模块命令前  必须先调用模块命令 help_初始化模块() 以便用户自行决定何时初始化模块  以应对一些冲突环境问题

' 7: 对封包实列 做了适当微调  包含但不限以下

' 对数据报类封包情况 需要处理错误码的情况 详见   recv回调接口内代码

' 对 远程hook64指令_前置指令() 命令的应用 做了 send recv 只回调指定套接字的实列写法

' ---------------------------------------------------------------

' 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

' ---------------------------------------------------------------

' 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有几个参数,需要什么寄存器,对应提供即可。

' 四:源码内列子改了改,可以自己看,需要注意的是模块注释的很详细,使用前最好看一看,尤其是hook回调接口的写法和安装的写法最好按照模块列子中的写法来,除非你能把64hook模块组看懂一遍,对于一些对本模块一知半解的朋友请不要乱改乱发,这个模块我会继续增强的,只是工作原因时间有限,只能一点一点来



点我下载 (已有 61 次下载)

引用模块


源码文件名 模块文件名
wow64_Inline hook 演示实列.e
eWOW64_hook_2.91.ec
wow64_VehDrx hook 演示实列.e
eWOW64_hook_2.91.ec


引用支持库


源码文件名 支持库文件名 支持库标识
wow64_hook_2.91模块源码.e 系统核心支持库 5.7 d09f2340818511d396f6aaf844c7e325
特殊功能支持库 3.1 A512548E76954B6E92C21055517615B0
wow64_Inline hook 演示实列.e 系统核心支持库 5.7 d09f2340818511d396f6aaf844c7e325
特殊功能支持库 3.1 A512548E76954B6E92C21055517615B0
多线程支持库 2.0 5F99C1642A2F4e03850721B4F5D7C3F8
扩展界面支持库一 2.0 27bb20fdd3e145e4bee3db39ddd6e64c
应用接口支持库 3.1 F7FC1AE45C5C4758AF03EF19F18A395D
高级表格支持库 2.11 0B4337DA651B4b619ACF61334A7E8B47
wow64_VehDrx hook 演示实列.e 系统核心支持库 5.7 d09f2340818511d396f6aaf844c7e325
特殊功能支持库 3.1 A512548E76954B6E92C21055517615B0
多线程支持库 2.0 5F99C1642A2F4e03850721B4F5D7C3F8
扩展界面支持库一 2.0 27bb20fdd3e145e4bee3db39ddd6e64c
应用接口支持库 3.1 F7FC1AE45C5C4758AF03EF19F18A395D
高级表格支持库 2.11 0B4337DA651B4b619ACF61334A7E8B47


[错误报告]   上一篇:听书网 获取真实地址...     下一篇:【ntdll】对ntdll中的一些函数的...