日前解决一现网问题遇到补丁加载未生效现象,想要验证流程是否走进补丁代码,由于补丁函数和原函数名称一样,且修改代码较少,通过普通gdb方法难以看出是否走进补丁,但可用gdb反汇编方法来验证。
gdb该进程,之后断补丁函数,再使用disassemble进行反汇编,查看补丁加载前后汇编代码,若不一致则可确定两次走进不同函数。
加载补丁前
加载补丁后
从汇编指令可看出,加载补丁后在原函数基础上加了8字节的偏移,补丁的原理就是在原来函数基础上加上跳转,到补丁函数地址执行,之所以是8字节,因为ldr指令和br各占4字节,总共是8字节,这也是为什么有些函数太小就无法做补丁的原因,因为函数本身大小没有达到汇编跳转指令的大小。