我有一個使用 ARM-V7A 指令集的 Android .so 檔案。
我把它拖進IDA,有一行顯示:
0x1000: b #0x102c
十六進制視窗顯示 的二進制代碼b #0x102c是14 e0。
14 e0具有二進制格式0001 0100 1110 0000,這不是 ARM 手冊對該指令進行編碼的方式。
除非
1 4 e 0
0001 0100 1110 0000
8 ----- 1 16 ---- 9
8 -- 1表示 1 位到 8 位,9 -- 16表示 9 位到 16 位
為什么指令在.so檔案中以這種方式編碼?
例如,如果我想在某個地址運行時更改某些指令。我是否將其更改為0x14e0(這是指令在.so檔案中的編碼方式),還是將其更改為0xe014(這是指令在 ARM-Manual 中的編碼方式)
uj5u.com熱心網友回復:
看起來 IDA 將其分解為位元組,因此您希望低 8 位作為位元組流排在第一位。 14 e0與 little-endian 相同e014,即單個 16 位半字。
(IDA 可能最初是為 x86 開發的,其中機器代碼是可變長度的位元組流,而不是 16 位或 32 位塊的序列,并移植到 ARM。這仍然是十六進制轉儲 ARM 機器代碼的有效方法.)
回復:標題問題:
可執行檔案或庫的 .text 部分將被映射到記憶體中,例如mmap,無需修改。除了在極少數情況下“文本重定位”來修復絕對地址,例如在跳轉表中.rodata或movw/本身movk中。.text
但是位置無關的代碼通常會避免這種情況,因為這就是位置無關的全部意義所在。它絕對不是位元組交換的!
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/418158.html
標籤:
