IDA动态调试脱壳步骤
本帖最后由 森林雪人 于 2019-2-11 11:56 编辑近几天学习IDA脱壳,把步骤梳理汇总一下,与大家做个交流。
安卓APK加固后,dex文件被修改或被隐藏了。使用反编译工具通常无法获得程序代码。
不论dex文件如何被加密隐藏,在程序运行时会被加载到内存中。加载dex的函数:dvmDexFileOpenPartial 这个函数有两个重要参数,一个是dex的真实地址,一个是dex的大小。加载dex到内存中的函数:int dvmDexFileOpenPartial(const void* addr, int len, DvmDex** ppDvmDex);第一个参数就是dex内存起始地址,第二个参数就是dex大小。我们的目标是从内存中将解密后的dex文件dump出来。再对dex进行反编译从而获得程序源码。
加固后的APK下载地址
旧的链接已失效,新下载地址
https://pan.baidu.com/s/1amIg3G2QFgORyX5qutOJuQ 提取码:8dy9
使用androidkiller反编译,查看反编译后的配置文件AndroidManifest.xml
文件已含android:debuggable="true",表明此APK可以调试。如果没有就需要添加此属性,然后使用androidkiller重打包即可。
对3.apk反编译后samli文件夹只有StubApplication.smali,大小1KB,真正dex被隐藏了。
调试步骤:
1、下载IDA工具,将dbgsrv目录下的android_server,复制到手机/data/local/tmp/目录下,并添加777权限。如果你的手机是64系统,请复制android_server64,如果使用模拟机,请复制android_x86_server。
2、手机数据线连接电脑,手机打开调试模式,使用adb命令
adb devices//手机将弹出窗口,点击信任允许
adb install3.apk//手机中安装3.apk
adb shell//进行终端后,执行以下命令。
cd /data/local/tmp/
./android_server//手机将打开本地23946端口。
退出shell模式。做本地端口转发,将电脑23946端口转发到手机的23946端口。
adb forward tcp:23946 tcp:23946
3、通过查看配置文件知道程序入口activity是com.ali.tg.testapp/.MainActivity
进入命令行adb shell
调试模式启动程序
root@android:/ # am start -D -n com.ali.tg.testapp/.MainActivity
手机上出现testapp正在等待调试
查询testapp进程信息ps -l
记录下对应的PID:14243
adb forward tcp:8700 jdwp:14243
4、启动IDA(如果你手机是64位,请启动IDA64),
此处的127.0.0.1:23946对应步骤2中启动./android_server开打的端口。确定后出现下图,选择需要调试的APK。
出现弹窗后确定。
5、打开命令提示符,启动jdb调试器
jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700
正常情况下是这样
6、首先找到libdvm.so。IDA窗口Debugger->Debugger windows->Modulelist,打开Modules,CTRL+F搜索:libdvm.so找到后双击进入。然后再次CTRL+F搜索:dvmDexFileOpenPartial。找到后双击进入如下图
dvmDexFileOpenPartial函数处(40BBD190)下断点,左侧点击一下就可以了。下断点后会变成红色。
使用F8进行单步调试,但是这里需要注意的是,只要运行过了PUSH命令就可以了,记得不要越过下面的BL命令,因为我们没必要走到那里。当执行了PUSH命令之后,我们就是使用脚本来dump处内存中的dex数据了,这里有一个知识点,就是R0~R4寄存器一般是用来存放一个函数的参数值的,那么我们知道dvmDexFileOpenPartial函数的第一个参数就是dex内存起始地址,第二个参数就是dex大小:
7、这里就可以使用这样的脚本进行dump,Shift+F2调出IDA脚本运行界面:
static main(void){
auto fp, dex_addr, end_addr;
fp = fopen("F:\\dump.dex", "wb");
end_addr = r0 + r1;
for ( dex_addr=r0; dex_addr < end_addr; dex_addr ++ )
fputc(Byte(dex_addr), fp);
}
运行脚本后在F盘找到dump出的dex文件。直接转jar,没有出错。
查看源码。
注:Dalvik模式是Android 4.4以下采用的模式,以上操作是在android4.2进行。
Android 4.4开始加入ART模式,Android 5.0开始默认是ART模式。ART模式脱壳和Dalvik模式区别如下:attach成功后,打开modules 搜索libart.so,然后在libart.so中搜索Openmemory函数并且跟进去。然后下断点。寄存器R1保存dex起始位,寄存器R2保存dex大小。脱壳脚本中需要R0改成R1,R1改成R2即可。
static main(void){
auto fp, dex_addr, end_addr;
fp = fopen("F:\\dump.dex", "wb");
end_addr = R1 + R2;
for ( dex_addr=R1; dex_addr < end_addr; dex_addr ++ )
fputc(Byte(dex_addr), fp);
}
z5487693 发表于 2019-7-18 17:08
楼主还在吗?帮忙看一下我的这个问题吧,怎么只有三个进程,别的进程都没有
推荐一位高人的文章,https://blog.csdn.net/jiangwei0910410003/article/details/51597771
我的帖子是在他的基础上写的。
IDA脱壳操作比较复杂,能看到这里的小伙伴不容易,分享一个脱壳工具:xposed+FDex2,秒脱主流加固壳。 jmzqwh 发表于 2019-7-13 17:56
根据网址下载的apk装到真机上无法运行,楼主有源链接么?因为看起来是个阿里的测试题
我有台机也不能运行。如果闪退,dex应用还未加载到内存。只能换一台真机试试。 谢谢,写的太好了!!! 牛!通俗易懂,但是自己操作就。。。 写的很不错,但实际操作起来就有点难了 不错呀,感谢作者的分享 操作非常複雜......值得收藏 收藏,学习.感谢楼主分享 很不错,正准备进入壳 世界,想问下,这种方法目前对几种市面上 流行的 加密壳有效? (没抱太大希望...) 通俗易懂,期待更多好文章