首先可以通过在反汇编得到的的c代码里确定JUMPOUT在汇编代码的位置
之后在汇编代码中跳转到该地址,应该可以看到一个跳转指令(B,BL,BX等)。
由于IDA无法识别跳转指令的跳转地址,所以会出现JUMPOUT的情况。
想要去除JUMPOUT,就要由我们自己将这个跳转指令算出来。手动将算出来的地址写入汇编指令,代替原来的跳转地址。
跳转指令计算方式:
1.通过前面的代码直接算相应寄存器的值,这个方法需要一定的经验
2.直接hook跳转指令,把相应寄存器的值打印出来,打印出来的值如果都是相同的则可以直接修复,不相同则说明这里的跳转是动态的
修改方法:工具栏 -> Edit -> Patch Program -> Change byte...
arm32位和64位的修改方式略有不同
32位:
上面是修复前的指令,下面是修复后的。修复 JUMPOUT需要更改前两个字节,第一个字节是偏移量,每+1跳转的目标地址就会+2,第二个字节是固定的E0表示跳转指令B
64位:
需要修改的是前4个字节,其中第一个字节是偏移量,每+1偏移地址会+4,第二,三个字节应该也是偏移量(不确定)第4个字节是固定的14表示跳转指令B 。
arm汇编代码有两种指令集,arm和thumb使用上面的方式更改指令后如果结果不正确可以试试更换指令集的方式再试一下,更改的方法:
mac上快捷键是option+g
修改value即可
另外,也会出现跳转指令无法计算的情况。这是由于静态代码中的方法需要动态传入参数,参数占用的地址不确定,导致无法静态计算最后的跳转地址,这时候就要结合动态分析来确定最终跳转地址。