Android 動態代碼自修改原理

1.原理

DexClassDef -> DexClassData -> DexMethod -> DexCode

裏面的 u2 insns 的值是用於存放程序實現代碼的地方。
程序執行時候會把整個 dex 文件加載到內存中,然後動態地解析執行 insns 中的內容。
只要修改了裏面的數據,就相當於修改了程序執行流程和方法。

2. 內存中修改 insns

主要步驟

  1. 定位到 dex 文件
  2. 計算函數的 DexCode 位置
  3. 重寫 DexCode 的 insns 數據

原始程序很簡單,調用函數ret1(),返回結果 1。
用010editor打開dex文件,找到下面的位置
在這裏插入圖片描述
在virtual_methods中找到ret1()
在這裏插入圖片描述
接着找到方法的code_item,可以看到insns_size的值爲2,指令數爲2
在這裏插入圖片描述
在010editor中不方便修改指令碼,使用JEB查看dex文件的指令碼。
在JEB中找到函數位置

看到指令爲1210,將 1210 改爲 1220,這樣就從返回1變爲返回2.
在這裏插入圖片描述
JEB中無法直接修改,需要在內存中進行修改,因此需要用到IDA。
IDA中的操作步驟如下:
1.在IDA中進行動態調試掛接
2.Ctrl + S 打開 map 數據
找到hellonative的內存起始地址
在這裏插入圖片描述
查找到dex起始位置,0x751c7028,直接計算偏移,修改相應的位置
在這裏插入圖片描述
在文件中的偏移是0x188ec8,用它加上內存中起始地址0x751c7028找到目標在內存中的地址:0x7534fef0。
在IDA中直接g跳轉到0x7534fef0,在字節碼上修改爲1220後F2。
程序運行後返回2
在這裏插入圖片描述

3.總結

其實直接修改dex文件也是可以的,修改完以後使用dex修復工具修改一下校驗和,再將dex文件放回apk包中,運行。
很多殼在運行時會通過修復insns指令來運行程序。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章