Android dex函數指令修改

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指令來運行程序。

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