1.我們要達到什么目地?
我們逆向APK時,如今對于so一般來說是肯定要做修改的,然而IDA修改匯編代碼,不像OD可以直接修改匯編指令,必須通過等修改十六進制。我們僅僅知道00表示代碼清除,90表示NOP指令,即空指令。但僅僅刪除一行代碼這樣的修改肯定是滿足不了需要的。我們需要深入修改一點。
2.與ARM基礎知識
是英特爾公司的16位處理器,ARM是ARM公司的32位處理器。每個處理器都對應自己的一套匯編語言,所以兩個處理器分別對應于8086匯編和ARM匯編。由于處理器的位數16進制編輯器改so文件,所以8086匯編指令的機器碼是16位,而ARM匯編指令的機器碼就是32位。機器碼可以看作是二進制指令,其實所謂的HEX即稱為十六進制操作碼或十六進制機器碼,也是二進制指令,只是把二進制的數值用十六進制去展示。
3.ARM匯編非常重要
ARM匯編可以做的事情在我看來比8086匯編多得多,如果你會了ARM,就會了主流的嵌入式開發,然后就是硬件編程,然后就是機器人或機械制造。所以,ARM真的非常重要,希望可以去認真學習,不僅是ARM指令集,還有ARM的機器碼的原理,以及ELF文件在linux下的反編譯。下面只能簡單講解。
4.ARM的機器碼簡單講解
ARM機器碼為32位,我們以跳轉指令BL和BEQ為例講解。其實我們只需要關注最高的8位,也就是24-31位。首先來看,28-31這四位,不同條件這四位有什么不同。然后在27-24這四位里,BL和BEQ都是1010.所以BL指令的二進制是,即十六進制的EA;相同BEQ的十六進制就是0A。
5.SO里面的情況
當我們把SO里的匯編語言放到工具中去轉換為HEX時,會發現和IDA中的HEX有時是完全不同的,這是因為IDA中有時反編譯SO使用的不是ARM,而是16位的ARM16進制編輯器改so文件,也就是Thumb指令,但有時卻是ARM的32位指令。
6.修改匯編跳轉指令
這種情況一般是Thumb指令,一般而言一行代碼對應是2個HEX碼。
例子:bne指令修改為beq指令
通過工具,我們發現bne跳轉指令對應的HEX機器碼是D1,beq對應的HEX機器碼是D0,然后用修改,再用IDA檢測。
7.修改數據
這種情況一般是ARM指令,一般而言一行代碼對應是4個HEX碼。
例子:修改小黃人快跑中初始化金幣量
so里面原來ARM代碼:mov R1,#
最大可改為,也就是65535,修改后的代碼應為:mov R1,#
原本的代碼對應的HEX:C8 19 04 E3,為什么是這個樣子,這和8086匯編有類似之處,就是十六進制和匯編代碼是大體顛倒的。最后的E3是MOV這個匯編指令。我們做一個正確的顛倒:E3 01 49 C8。這下就懂了吧!所以,我們改為FF 1F 0F E3。
當然,為了方便,可以直接使用工具,不過這樣的分析能夠極大增強大家ARM分析的能力。不過不要寄太多希望于工具,因為很多時候,工具會發生錯誤或者和IDA中的HEX-VIEW情況不一致,也不利于我們學習的。所以工具只是輔助,主要還是動腦子。
8.修改字符串
這種情況比較簡單,字符串就是字符串,修改字符串的HEX碼就是利用ASCII轉HEX的工具就可以,我們可以對比兩個so來看看。當然最簡單修改辦法,是用直接在右邊修改字符串。其實,這和修改文本是一樣的,記事本,都可以。手機端的MT,,十六進制編輯器等等也都可以修改SO的字符串,推薦使用默小坑兄弟的ADK編輯器。
視頻下載地址: