假设您要分析反汇编的ARM函数,如何确定函数的结束位置?
我正在寻找一个BX LR
序列,但这不是100%可靠。
答案 0 :(得分:3)
从程序集/机器代码定义“函数”。真的不是这样的事情,结果他们真的没有结束。最终,编译的函数将以恢复程序计数器结束,以在调用函数后返回指令。有明显的bx lr,和mov pc,lr和pop {...,pc}。但它并不总是必须使用其中的三个(pop {r0},mov pc,r0)。然后有尾部优化,如果函数中的最后一件事是调用另一个函数,优化是分支而不是调用,那么从该函数的返回最终会从先前的指令调用返回。
查看可能导致此问题的另一个问题,您需要跟踪从调用函数到返回其后的地址的所有可能执行路径,并且可能触及的所有指令都可能是被认为是该职能的一部分。函数末尾的返回只是高级语言的错觉,它不必以这种方式实现。