我的测试环境:模拟器 Android 4.2 armeavi-v7a
1.IDA附加调试apk程序
找到IDA所在目录,在dbgsrv文件夹下找到程序android_server
在这里按住“Shift +鼠标右键”,打开控制台
把程序android_server push到安卓设备/data/local/tmp/目录下、提权并运行
转发端口
在打开一个控制台
注意:在这里我们要先在设备中运行之前安装的apk。
之后打开IDA程序
到这里就附加成功了,我们下一步就可以修改程序的内存了。
2.修改程序内存
这个程序是一个算加法的程序,正常结果是13,我们修改内存中方法的二进制代码,将其改为减法。
再打开一个IDA,找到方法的代码相对于dex文件的偏移。
将apk文件解压,把解压出的dex文件在IDA中打开,找到这个方法的偏移大小
因为这个测试程序是自己写的,所以我知道方法就在MainActivity这个类中,为了快速找到,我们“Ctrl +F "直接搜索
我们看到相对于dex文件头的偏移大小是0x13F808
然后我们在附加进程的IDA中找到内存中dex头的地址大小
在附加进程的IDA界面按快捷键“Ctrl + S”,选择dex文件
在Hex View-1视图中点击鼠标右键,完成如下操作
找到dex头在内存中的地址 0x4BD6B028
到这了我们就可以算出方法在内存中的位置
dex头在内存中的地址 0x4BD6B028 + 相对于dex文件头的偏移大小是0x13F808 = 内存中方法的地址是 4BEAA830
我们在附加进程的IDA中找到这个地址位置
快捷键“G”,输入地址0x4BEAA830
我们将90 改为 91,便将方法中的加法改为减法了
鼠标点击90,按快捷键“F2”,将其修改为91,之后在按F2 保存
之后点击运行程序
结果为1,我们已经将加法变为减法了
3.接下来我们将内存中的dex文件通过运行IDA脚本程序dump到本地
前面我们已经知道了dex头在内存中的地址 0x4BD6B028
接着来要知道dex文件的大小
了解文件结构的话,就知道0x261A94就是dex文件的大小
不知道,那也没关系,我们使用工具010 Editor运行dex模板查看,结果相同
接着我们编写IDAdump脚本,并运行。
打开脚本窗口- File–ScriptCommand 或直接用快捷键“Shift +F2”
static main(void){
auto fp, begin, end, dexbyte;
//打开或创建一个文件
fp = fopen("d:\\dump.dex", "wb");
//dex基址
begin = 0x4BD6B028;
//dex基址 + dex文件大小
end = begin + 0x261a94;
for ( dexbyte = begin; dexbyte < end; dexbyte ++ ){
//按字节将其dump到本地文件中
fputc(Byte(dexbyte), fp);
}
}
我们发现dump下来的dex文件,与我们本身的dex文件是不同的
用工具Beyond Compare,选择16进制比较
找到不同的地方后用010 Editor工具查看具体情况。
后续更近。。。