在逆向分析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