arm函數內部進行模式切換的技巧
阿新 • • 發佈:2017-11-10
改變 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函數內部進行模式切換的技巧