標籤: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