relocate的一个小问题
nevermoe opened this issue · 8 comments
nevermoe commented
我发现relocate考虑得不太全面,比如我hook sleep函数,sleep是thumb模式的函数,relocate的时候会增加很多不必要的nop (https://github.com/ele7enxxh/Android-Inline-Hook/blob/master/relocate.c#L271)。 而sleep函数的前几个字节是这样的:
.text:0002DFCE PUSH {R0-R2,LR}
.text:0002DFD0 CMP R0, #0
.text:0002DFD2 IT LT
.text:0002DFD4 MOVLT R0, #0x7FFFFFFF
.text:0002DFD8 MOV R1, SP
relocate之后IT LT
之后多了一条nop命令,IT LT
的意思是如果小于零,则跳过下一条指令,这样MOVLT
这条指令本来应该跳过的,现在relocate之后就变成永远无法跳过了。
ele7enxxh commented
我记不太清了,加nop的原因好像是为了指令地址的对齐,以避免某些特殊情况的crash,你可以尝试不加nop,看是否会出问题。
nevermoe commented
确实考虑到pc预读,要对齐到四字节会带来很多麻烦。。。没有什么好办法吗。。
ele7enxxh commented
可以对it系列指令单独处理,在it块结束后再填充nop指令。不过这需要it块中不包含需要relocate的指令,我印象中it块中本来就不允许出现需要relocate的指令
Rprop commented
把IT系列指令和NOP交换位置?
nevermoe commented
@rrrfff 我试了把IT指令好NOP交换位置,确实可以。但是问题是还有别的ITT,ITTE之类的指令,这时候简单交换位置就行不通了。
cpu指令我也不是很懂。。。
cjycjw commented
我也发现了类似的bug, 在hook函数strncmp时候考虑不全,这个函数是thumb指令,hook的时候改写了8个字节,而第7个字节正好是循环跳转的目标地址,执行到后面的跳转指令跳转回来并不是原来的指令,导致出错。