好友
阅读权限10
听众
最后登录1970-1-1
|
森林雪人
发表于 2018-8-6 18:43
本帖最后由 森林雪人 于 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 install 3.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);
}
|
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|