1. 程式人生 > >arm函數內部進行模式切換的技巧

arm函數內部進行模式切換的技巧

改變 png 不改變 ges 分享 cnblogs 註意 ati 錯誤

這是某個函數的入口,可以看出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函數內部進行模式切換的技巧