Android-Inline-Hook icon indicating copy to clipboard operation
Android-Inline-Hook copied to clipboard

relocate的一个小问题

Open nevermoe opened this issue 7 years ago • 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之后就变成永远无法跳过了。

nevermoe avatar Jun 21 '17 09:06 nevermoe

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

ele7enxxh avatar Jun 21 '17 09:06 ele7enxxh

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

nevermoe avatar Jun 21 '17 10:06 nevermoe

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

ele7enxxh avatar Jun 22 '17 01:06 ele7enxxh

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

Rprop avatar Aug 23 '17 10:08 Rprop

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

ele7enxxh avatar Aug 23 '17 10:08 ele7enxxh

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

Rprop avatar Sep 24 '17 03:09 Rprop

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

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

nevermoe avatar Oct 03 '17 09:10 nevermoe

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

cjycjw avatar Jul 09 '19 07:07 cjycjw