arm函数内部进行模式切换的技巧
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了arm函数内部进行模式切换的技巧相关的知识,希望对你有一定的参考价值。
这是某个函数的入口,可以看出cpu运行在thumb模式
运行到<+4>,跳转到分支 0xf6bda400,不改变仍运行在thumb模式,但是调试器却没有正确理解,以arm模式给出了反汇编
幸好这只是调试器反汇编出来的,要是CPU运行在错误的模式进行指令译码,然后执行,大家都知道CPU执行上面译码出来的指令,要么就SIGILL要么就SIGSEGV。那么我们通过指定arch译出正确的指令
这时可以看到,虽然当前指令被正确译码,但是到却是错误的指令。这里就出现了同一函数内模式切换的技巧。
注意三点,
1.从上一条指令 跳进来,
2.pc下一条指令与当前指令地址一样,,x86汇编也有类似的技巧。
3. 当前执行指令
合起来就是
当前pc是偶对齐的,bx pc意味CPU跳转到pc指令同时也切换到了arm模式。这样一来,pc取指令的步进就是按arm模式进行,也就是pc+=4。那么就是到 0xf6bda404,这时就是按arm模式进行译码了。
God!! 又来了,0xf6bda40c 开始又反汇编错误了,这里又一技巧。当执行pc指令,即 ldr r12, [pc] 时,pc同时pc+=4,那么load进r12的就是 0xf6bda40c 的0xffffe4b4。(ps,上面pc的值有点误)
这时可能就是跳到某个内联的static函数了。
以上是关于arm函数内部进行模式切换的技巧的主要内容,如果未能解决你的问题,请参考以下文章