arm指令bne.w改成b,即無條件跳轉,armbne.w
近期逆向一個程式,需要把bne.w改成b,無條件跳轉。由於ios逆向不像pc上,可以在od裡直接改彙編指令,這篇文章給了我很大的協助。通過memory write 修改後,驗證可行後,再用ultraedit修改二進位檔案,儲存可執行程式。再拷貝到ios裝置,即可。
文章出處:http://blog.chinaunix.net/uid-22915173-id-225005.html
ARM中的常用指令含義
ADD 加指令
SUB 減指令
STR 把寄存器內容存到棧上去
LDR 把棧上內容載入一寄存器中
.W 是一個可選的指令寬度說明符。它不會影響為此指令的行為,它只是確保產生 32 位指令。Infocenter.arm.com的詳細資料
BL 執行函數調用,並把使lr指向調用者(caller)的下一條指令,即函數的返回地址 lr link register連結寄存器
BLX 同上,但是在ARM和thumb指令集間切換。
CMP 指令進行比較兩個運算元的大小
ADD R3,R2,R1,LSR #2 ;R3R2+R1÷4
ADD R3,R2,R1,LSR R4 ;R3R2+R1÷2R4
LDR R0,[R1] ;R0←[R1] 將R1的值為地址的儲存空間中的資料傳送到R0中
STR R0,[R1] ;[R1]←R0 將R0的值傳送到R1的值為地址的儲存空間中。
基址變址定址
LDR R0,[R1,#4] ;R0←[R1+4]
LDR R0,[R1,#4]!;R0← [R1+4], R1←R1+4
LDR R0,[R1] ,#4 ;R0←[R1], R1←R1+4
LDR R0,[R1,R2] ;R0← [R1+R2]
LDR R0,[R1,R2,LSL#2];R0← [R1+R2*4]
堆棧定址
ARM 32位指令
STMFD SP! {r0,r1,r3-r5} ; r0-r1,r3-r5入棧
LDMFD SP! {r0,r1,r3-r5} ; r0-r1,r3-r5出棧
Thumb 16位指令
PUSH {r0,r1,r3-r5} ; r0-r1,r3-r5入棧
POP {r0,r1,r3-r5} ; r0-r1,r3-r5出棧
滿遞減堆棧-進棧
stmfd sp!, {r0,r1,r3-r5}
滿遞減堆棧-出棧
ldmfd sp!, {r0,r1,r3-r5}
跳轉指令
B 跳轉指令
BL 帶連結的跳轉指令
BLX 帶連結和狀態切換的跳轉指令
BX 帶狀態切換的跳轉指令
軟體中斷指令SWI
SWI 0x2
斷點指令(BKPT)
BKPT 0xF02C 斷點,用於調試
Thumb 是16-bit 指令集
代碼密度高 (總代碼大小約為ARM指令的65%)
使用窄匯流排儲存空間時可以大大提高效能。
是 ARM 指令集的一個子集,不是一個完整的指令集(Thumb-2除外)
核存在一個執行狀態 – Thumb狀態
ARM和Thumb之間可通BX 指令進行切換
http://wenku.baidu.com/link?url=83-XJ-2KEt4gCIeLG1Bi2oTgQXeHqDUDAJ-zXVt8nlAf_VOg7_6FyXmKCJPiB2J98u-fosB0ERlnn_53rTjnpS8dL96MdZncTzmUMpSZV7y
其他:IDA深度解析修改so檔案和ARM彙編
1.我們要達到什麼目地?
我們逆向APK時,如今對於so一般來說是肯定要做修改的,然而IDA修改彙編代碼,不像OD可以直接修改彙編指令,必須通過WINHEX等修改十六進位。我們僅僅知道00表示代碼清除,90表示NOP指令,即空指令。但僅僅刪除一行代碼這樣的修改肯定是滿足不了需要的。我們需要深入修改一點。
2.Intel8086與ARM基礎知識
Intel8086是英特爾公司的16位處理器,ARM是ARM公司的32位處理器。每個處理器都對應自己的一套組合語言,所以兩個處理器分別對應於8086彙編和ARM彙編。由於處理器的位元,所以8086彙編指令的機器碼是16位,而ARM彙編指令的機器碼就是32位。機器碼可以看作是二進位指令,其實所謂的HEX即稱為十六進位作業碼或十六進位機器碼,也是二進位指令,只是把二進位的數值用十六進位去展示。
3.ARM彙編非常重要
ARM彙編可以做的事情在我看來比8086彙編多得多,如果你會了ARM,就會了主流的嵌入式開發,然後就是硬體編程,然後就是機器人或機械製造。所以,ARM真的非常重要,希望可以去認真學習,不僅是ARM指令集,還有ARM的機器碼的原理,以及ELF檔案在linux下的objdump反編譯。下面只能簡單講解。
4.ARM的機器碼簡單講解
ARM機器碼為32位,我們以跳轉指令BL和BEQ為例講解。其實我們只需要關注最高的8位,也就是24-31位。首先來看,28-31這四位,不同條件這四位有什麼不同。然後在27-24這四位裡,BL和BEQ都是1010.所以BL指令的二進位是11101010,即十六進位的EA;相同BEQ的十六進位就是0A。
5.SO裡面的情況
當我們把SO裡的組合語言放到工具中去轉換為HEX時,會發現和IDA中的HEX有時是完全不同的,這是因為IDA中有時反編譯SO使用的不是ARM,而是16位的ARM,也就是Thumb指令,但有時卻是ARM的32位指令。
6.修改彙編跳轉指令
這種情況一般是Thumb指令,一般而言一行代碼對應是2個HEX碼。
例子:bne指令修改為beq指令
通過工具,我們發現bne跳轉指令對應的HEX機器碼是D1,beq對應的HEX機器碼是D0,然後用WINHEX修改,再用IDA檢測。
7.修改資料
這種情況一般是ARM指令,一般而言一行代碼對應是4個HEX碼。
例子:修改小黃人快跑中初始化金幣量
so裡面原來ARM代碼:mov R1,#0x49C8
最大可改為0XFFFF,也就是65535,修改後的代碼應為:mov R1,#0xFFFF
原本的代碼對應的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來看看。當然最簡單修改辦法,是用WINHEX直接在右邊修改字串。其實,這和修改文本是一樣的,記事本,notepad都可以。手機端的MT,HEXEDITOR,十六進位編輯器等等也都可以修改SO的字串,推薦使用默小坑兄弟的ADK編輯器。