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

來源:互聯網
上載者:User

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編輯器。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.