1.原理
要了解dex函數指令修改原理,需要先弄懂dex文件結構,結構裏面有個insns ,是用於存放程序實現代碼的地方。
程序執行時候會把整個 dex 文件加載到內存中,然後動態地解析執行 insns 中的內容,只要修改了裏面的數據,就相當於修改了程序執行流程和方法。
DEX文件可以通過以下結構找到DexCode,然後通過DexCode再找到insns
DexClassDef -> DexClassData -> DexMethod -> DexCode
2. 靜態修改 insns
原始程序很簡單,調用函數ret1(),返回結果 1。
public class MainActivity extends AppCompatActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = (TextView)findViewById(R.id.textView);
int re = ret1();
tv.setText(String.valueOf(re));
}
public int ret1(){
return 1;
}
}
用010editor打開dex文件,找到下面的位置,在virtual_methods中找到ret1()
接着找到方法的code_item,可以看到insns_size的值爲2,指令數爲2
使用JEB查看dex文件的指令碼,可以看出大概的意思。
在JEB中找到函數位置,看到指令爲1210,只要將 1210 改爲 1220,返回1就會變爲返回2.
JEB中無法直接修改,在010中直接修改dex文件,修改完以後使用dex修復工具修改一下校驗和,再將dex文件放回apk包中,運行。
3.總結
很多殼在運行時會通過修復insns指令來運行程序。