你好,歡迎來到IOS教程網

 Ios教程網 >> IOS使用技巧 >> IOS技巧綜合 >> arm指令bne.w改成b,即無條件跳轉

arm指令bne.w改成b,即無條件跳轉

日期:2017/8/17 10:11:54      編輯:IOS技巧綜合
[摘要]本文是對arm指令bne.w改成b,即無條件跳轉的講解,對學習IOS蘋果軟件開發有所幫助,與大家分享。

近期逆向一個程序,需要把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 ;R3R2+R1÷4
ADD R3,R2,R1,LSR R4 ;R3R2+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編輯器。

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved