操作系统支持:Windows
拦截当前程序中任何位置的汇编指令.相比APIHOOK更加的强大.更加灵活,可用场合更多.(成功返回真,失败返回假)
语法: 逻辑型 Hook指令 (指令地址, 回调函数, 指令长度)
|
参数名 |
描
述 |
|
指令地址
|
整数型, , 欲HOOK的指令地址,该地址必须真实有效 |
|
回调函数
|
整数型, , 回调函数(寄存器) 返回-1放行,0阻止并处理ebp和esp(只适合在func入口Hook),>65535时重置返回结果为eip运行 |
|
指令长度
|
整数型, 可空, 指令长度需 ≥ 5 ,留空则撤消对某指令地址的HOOK |
例程:
说明
HOOK为拦截的意思,指令当然是指汇编机器指令.这个功能是能在是能拦截目标程序任何位置的汇编指令.相比APIHOOK更加的强大.更加灵活,可用场合更多.
当然越是强大的功能,往往用法上也比较复杂,需要用心理解此函数哦才能用好.
常常有人问我,如何锁定内存中的数值永远不变?
如何让自已的挂更加的有效率并且更能节省系统性能资源呢?
现在我告诉你,使用模块中的 HOOK指令 一切问题都将迎刃而解.
如上面的情况来举例,目标程序不断的在改变某内存中的数值.要想锁定此处内存值不变,首先有人会想到把那处的内存设置为只读,不准他写新值进去.理论上确实没错,可是目标程序尝试写入这个被修改为只读处的内存时,就会产生异常,最终导致程序崩溃.
也有人会说,只要开启一个时钟或一个线程不停的去往那处内存读取与写入一个固定的值,只要你的速度比游戏更快,就能达到类似于锁定的效果.当然对于新手我也推荐此种方式,正如前面初级教程中也有提及过,那个CE工具也是这样来锁定内存的.但这种方式非常的占用系统性能,时钟速度慢了达不到锁定的效果,时钟速度太快又大占CPU与内存.如果你要锁很多的内存,更是不可靠.
HOOK指令 功能可以在目标程序指定汇编指令处进行拦截.然后把当时所有的寄存器中的数据送到你的回调接口中,此时你想咋获取或修改EAX,EBX等各寄存器或EBP,ESP所指向的堆栈中的数据就能修改,绝对能满足你的欲望与需求.
有回调接口中所带回来的寄存器参数里的值除EIP外全都可以进行修改.虽然可修改但你也要注意,不能乱改,特别是ESP与EBP这两个寄存器值,除非你真的知道自已在做什么.
HOOK指令与APIHOOK的原理上差不多,所以也可以用HOOK指令来达到APIHOOK同样的效果.APIHOOK使用简单方便,HOOK指令强大灵活.各有优点.
有时候我们可能真的需要使用HOOK指令来HOOKAPI的.为什么呢?特别是那类有例如CRC验证的目标程序.常规APIHOOK是拦截在API的入口处.修改入口的N字节指令.假如目标程序检查一下某些关健API的入口有没有被修改过,就会穿帮了,这当然不是我们所想要看到的结局.
那么我们可以尝试拦截API入口再加N字节后的地方,往往能达到意想不到的效果.因为一般只会检查入口处前8,12,16个字节.很少会再往下检测,因为DLL中有些地方的汇编指令会因为DLL所加载在的内存地址不同,而被重定位修正.这给检测带来了麻烦...显然对我们来说这可是件好事.当然也意味着我们再得小心HOOK,不然会导致目标程序崩溃.
当HOOK指令接口返回一个大于65535的值时,就会把该值作为新EIP进行转移.即让目标程序即不阻止,也不放行,而且跳到指定的地方去继续执行.
HOOK指令是个好东西,对于制作智能第三方插件来说很重要,若与CALL再结合,则再完美不过了,双剑合壁哦!
在适当的地方进行HOOK指令拦截,获取到最需要的数据,再在适当的情况下执行CALL功能,一切都变得那么的美好,事半功倍的效果.
需要注意当你进行EIP跳转时,堆栈也要顾一下,不想乱跳打破了栈平衡,更不要随便跳到当前汇编程序段之外,还是那句话,除非你真的知道自已在做什么
参见:
HOOK指令.e