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