热补丁
普通代码修改技术是修改API起始地址的5个字节, 而热补丁是修改7个字节.
相比代码修改的API钩取, 采用热补丁能提高多线程系统的稳定性和性能.
原理和特征
二次跳转
API起始地址7个字节是5个nop和2个字节的mov edi, edi没有实际意义, 是设计时专门留给打热补丁用的7字节.热补丁实现时就是利用这7个字节, 在PUSH EBP指令上方是一个短跳转指令(2字节), 用来跳转到就在该指令上方的远跳转指令(5字节), 远跳转指令才是跳到钩取函数起始地址. 这就是二次跳转.
不需要钩取函数进行脱钩/挂钩操作
因为修改的指令都是在无意义字节, 所以调用原API时从[API起始地址 + 2]调用可以直接得到原函数. 不需要额外进行挂钩/脱钩操作. 多线程环境下, 如果一个线程修改了API(挂钩)还没修改回来(脱钩), 其他线程有需要调用这个API, 就会发生内存异常错误. 所以热补丁技术可以提高系统稳定性, 同时因为不用经常执行脱钩/挂钩操作, 性能也能提升.