ele7enxxh/Android-Inline-Hook

relocate的一个小问题

nevermoe opened this issue · 8 comments

我发现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之后就变成永远无法跳过了。

我记不太清了,加nop的原因好像是为了指令地址的对齐,以避免某些特殊情况的crash,你可以尝试不加nop,看是否会出问题。

确实考虑到pc预读,要对齐到四字节会带来很多麻烦。。。没有什么好办法吗。。

可以对it系列指令单独处理,在it块结束后再填充nop指令。不过这需要it块中不包含需要relocate的指令,我印象中it块中本来就不允许出现需要relocate的指令

Rprop commented

把IT系列指令和NOP交换位置?

@rrrfff 你可以试试,如果测试成功,欢迎提交PR

Rprop commented

@nevermoe 看了手册IT在AArch64被弃用, AArch64是否还有类似的block指令?

@rrrfff 我试了把IT指令好NOP交换位置,确实可以。但是问题是还有别的ITT,ITTE之类的指令,这时候简单交换位置就行不通了。

cpu指令我也不是很懂。。。

我也发现了类似的bug, 在hook函数strncmp时候考虑不全,这个函数是thumb指令,hook的时候改写了8个字节,而第7个字节正好是循环跳转的目标地址,执行到后面的跳转指令跳转回来并不是原来的指令,导致出错。