回答
一般來說,你所要求的是不可能的。
考慮這個功能恰好使用的數據值過大,編碼爲直接:
@ void patch_nop(void *code_addr);
patch_nop:
ldr r1, =0xe1a00000
str r1, [r0]
bx lr
其中,由時間它已經通過彙編和背部,看起來像這樣:
$ arm-none-eabi-objdump -d a.out
a.out: file format elf32-littlearm
Disassembly of section .text:
00000000 <patch_nop>:
0: e59f1004 ldr r1, [pc, #4] ; c <patch_nop+0xc>
4: e5801000 str r1, [r0]
8: e12fff1e bx lr
c: e1a00000 .word 0xe1a00000
由於ELF數據,我們仍然可以確定函數結束位置和文字池開始的位置,但objdump正在挖掘這些部分並且符號很難「輕量化」,而且誰說你有這些?如果你有只是的代碼?
$ arm-none-eabi-objcopy -Obinary a.out bin
$ arm-none-eabi-objdump -D -marm -bbinary bin
bin: file format binary
Disassembly of section .data:
00000000 <.data>:
0: e59f1004 ldr r1, [pc, #4] ; 0xc
4: e5801000 str r1, [r0]
8: e12fff1e bx lr
c: e1a00000 nop ; (mov r0, r0)
那裏。嵌入你的指令流中,你有數據,這是一條指令。甚至沒有數據偶然發生看起來像一條指令。從字面上看,沒有任何東西可以從這32位中單獨推斷出它們不會被執行(嗯,至少不是那位置)。
有幾個啓發式這可能有助於使一個受過教育的猜測,尤其是如果任何額外的先驗知識,可以假定它縮小:
這可以被編碼爲即時任何事情都是差不多當然是一條指令,因爲編譯器/彙編程序首先不會將它作爲文字發送出去。但是,理想情況下,您至少要知道前面的代碼是ARM還是Thumb,以便知道相應的即時範圍是*。
任何未定義的指令通常都是數據,除非碰巧它是想要故意引發undef異常的代碼。而且你基本上必須擁有大部分的反彙編程序來檢查某些東西是否與任何已定義的編碼不匹配。在ARM/Thumb之上。
緊隨無條件分支之後的任何東西都可能是文字數據,特別是如果您有符號並且可以告訴它非常接近以下函數的開頭,或者您對所查找的數據有一定的瞭解,它看起來像數據。後一點當然是相關的,如果你只是眼球反彙編 - 在實踐中,文字數據往往是地址的東西,通常脫穎而出像一個拇指拇指†一旦你看整個代碼。
檢查文字是否是文字的最可靠方法是查看前面的代碼(最多1025條指令),檢查以該地址爲目標的PC相對負載。你只需要檢查字面加載編碼(這是你的簡單掩碼操作),然後解碼相對偏移量,如果你找到一個。理想情況下,您想要解決ARM/Thumb的問題,以避免檢測不適當的編碼時出現誤報,並且在最絕對的病態情況下,您仍然可以運行前面的文字池中的某些數據,看起來像是文字加載定位你的地址;永不說永不。
當然,這仍然是假設編譯器/彙編程序自動發出的文字池;當涉及到完全手寫彙編代碼時,所有投注都關閉:
patch_nop2:
ldr r1, [pc, #-4]
mov r0, r0
str r1, [r0]
bx lr
是代碼?是。它是數據嗎?是。 *順便說一句,ARM和Thumb代碼之間的區分歸結爲基本上與此相同的問題 - 「這個位模式是什麼意思?」 - 在沒有外部幫助的情況下也同樣不重要。
†沒有雙關語意
- 1. ARM彙編 - 分支指令
- 2. 如何在拆卸過程中分離ARM指令和數據
- 3. ARM SUB指令操作數
- 4. ARM彙編指令
- 5. arm指令是'UNDEFINED'?
- 6. 將ARM指令轉換爲i386指令
- 7. ARM架構中的GT和HI指令有什麼區別?
- 8. ARM,幫助LDR指令
- 9. ARM彙編「retne」指令
- 10. 困惑的ARM指令
- 11. ARM 32位指令STR
- 12. 混合ARM和THUMB指令
- 13. 從指令外的指令中獲取ng-repeat中的數據
- 14. ARM中的指令調度NEON
- 15. ARM彙編中的STR和LDR指令
- 16. 在ARM程序集中跳過指令
- 17. 數據指令中的MIPS指令
- 18. 拇指指令與arm指令集相比如何增加?
- 19. 在ARM/Android中如何處理分區
- 20. 如何在精靈文件中區分手臂指令的拇指指令?
- 21. 如何計算在ARM程序中執行的指令數量?
- 22. 在Clockworkmod恢復命令中的數據分區上指定zip文件
- 23. 如何區分2個指令
- 24. 區分相同操作碼的指令
- 25. ARM BLX指令範圍(絕對值)
- 26. 什麼是ARM Thumb指令集?
- 27. ARM是更安全的指令集嗎?
- 28. 解散簡單的ARM指令?
- 29. ARM彙編指令的含義
- 30. 執行單CPU互斥指令的ARM
和[這裏是一個更狡猾的一個(http://stackoverflow.com/q/38294896/3156750)。 – Notlikethat