|
楼主 |
发表于 2021-8-30 08:50:16
|
显示全部楼层
北京市北京市
这个就是论坛发出来的开源版本例子
- .版本 2
- .支持库 const
- .子程序 Hook_Air, , 公开
- .参数 Hook地址, 整数型, , Hook的地址
- .参数 备份长度, 整数型, , 备份长度字节数,超过5个字节默认会用填充PON
- .参数 调用数据, 字节集, , 调用回调时数据
- .参数 回调地址, 整数型, , 到整数(&函数名称)
- .参数 是否前置, 逻辑型, , 是否让覆盖的数据先执行,真=先执行覆盖掉的数据,假=执行完我们的函数在执行覆盖掉的数据,
- .局部变量 回调偏移, 整数型
- .局部变量 原字节集, 字节集
- .局部变量 JPM_地址, 整数型
- .局部变量 写入长度, 整数型
- .局部变量 填充Dm, 字节集
- 回调偏移 = 寻找字节集 (调用数据, { 232 }, )
- 原字节集 = 取空白字节集 (备份长度)
- 写入长度 = 取字节集长度 (调用数据)
- ReadProcessMemory (-1, Hook地址, 原字节集, 备份长度, 备份长度) ' 备份Hook前数据
- JPM_地址 = VirtualAlloc (0, 1024, 位或 (#MEM_COMMIT, #MEM_RESERVE), #PAGE_EXECUTE_READWRITE) ' <!!!> 申请地址
- .如果 (是否前置 = 真)
- 回调偏移 = 回调偏移 + 备份长度
- WriteProcessMemory (-1, JPM_地址, 原字节集, 取字节集长度 (原字节集), 0) ' 恢复之前Hook覆盖掉的代码
- WriteProcessMemory (-1, JPM_地址 + 备份长度, 调用数据, 写入长度, 0) ' 往申请的内存写入我们首次传过来的数据
- WriteProcessMemory (-1, JPM_地址 + 回调偏移, 偏移计算 (JPM_地址 + 回调偏移 - 1, 回调地址), 4, 0)
- WriteProcessMemory (-1, JPM_地址 + 备份长度 + 写入长度, { 233 } + 偏移计算 (JPM_地址 + 写入长度 + 备份长度, Hook地址 + 备份长度), 5, 0) ' 跳回Hook后下条执行的地址
- .否则
- WriteProcessMemory (-1, JPM_地址, 调用数据, 写入长度, 0) ' 往申请的内存写入我们首次传过来的数据
- WriteProcessMemory (-1, JPM_地址 + 回调偏移, 偏移计算 (JPM_地址 + 回调偏移 - 1, 回调地址), 4, 0)
- WriteProcessMemory (-1, JPM_地址 + 写入长度, 原字节集, 备份长度, 0) ' 恢复之前Hook覆盖掉的代码
- WriteProcessMemory (-1, JPM_地址 + 写入长度 + 备份长度, { 233 } + 偏移计算 (JPM_地址 + 写入长度 + 备份长度, Hook地址 + 备份长度), 5, 0) ' 跳回Hook后下条执行的地址
- .如果结束
- WriteProcessMemory (-1, Hook地址, { 233 } + 偏移计算 (Hook地址, JPM_地址), 5, 0) ' 写入Hook的Jmp地址
- .计次循环首 (备份长度 - 5, ) ' 这里默认为Jmp 5个字节 多余的填充PON
- 填充Dm = 填充Dm + { 144 }
- .计次循环尾 ()
- .如果真 (取字节集长度 (填充Dm) ≠ 0)
- WriteProcessMemory (-1, Hook地址 + 5, 填充Dm, 取字节集长度 (填充Dm), 0) ' 超过5个字节用PON填充
- .如果真结束
复制代码 |
|