Android ARM指令學習

來源:互聯網
上載者:User

標籤:android   style   blog   code   width   http   

    在逆向分析Android APK的時候,往往需要分析它的.so檔案。這個.so檔案就是Linux的動態連結程式庫,只不過是在ARM-cpu下編譯的。所以學習Android下的ARM指令很重要。目前,市面上的ARM-cpu基本都支援一種叫做THUMB的指令集模式。這個THUMB指令集可以看作是ARM指令集的子集,只不過ARM指令集為32bit,THUMB指令集為16bit。之所以要使用這個THUMB指令集,主要是為了提升代碼密度。具體資訊大家可以google。

   下面介紹如何簡單修改.so檔案。

   首先,我們需要熟悉ARM/THUMB指令的OPCODE。以MOVS R1, #0  為例。咋一看這是一個ARM 32bit的彙編指令,但是該指令的16進位表示只有16bit!因為編譯器已經自動將這個指令最佳化成了16位的THUMB指令 MOV R1, #0,其16進位表示為 00 21。那麼這個00 21是怎麼來的呢?這就需要我們理解THUMB指令的opcode:

   如所示,0~7位是立即數值,8~10位為源/目的寄存器,11~12為sub_opcode,13~15為opcode的前3位。值得注意的是,這裡將5位opcode分成了兩部分——前3位001是固定的,後2位用於標識4中不同的操作:mov, cmp, add, sub。所以mov指令的opcode二進位表示為00100;這裡Rd為R1,所以8~10位為001;同理,0~7為就0000 0000。所以MOVS R1, #0的2進位表示為:0010 0001 0000 0000 = 0x 21 00。

  但,為什麼顯示出來卻是00 21 呢?這是因為ARM-cpu採用小端對齊的方式,至於什麼是小端對齊,大家也可自行google。

  分析到這裡,就告一段落了。如果我們想將原.so檔案的MOVS R1, #0 修改為MOVS R1, #1,那麼我們只需要將原來的0x 00 21 改為0x01 21即可。

  附THUMB OPCODE地址 :https://ece.uwaterloo.ca/~ece222/ARM/ARM7-TDMI-manual-pt3.pdf

  ARM OPCODE : http://simplemachines.it/doc/arm_inst.pdf

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.