吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 36613|回复: 89
收起左侧

[Android 脱壳] IDA动态调试脱壳步骤

    [复制链接]
森林雪人 发表于 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
0.png
文件已含android:debuggable="true",表明此APK可以调试。如果没有就需要添加此属性,然后使用androidkiller重打包即可。
1.png

对3.apk反编译后samli文件夹只有StubApplication.smali,大小1KB,真正dex被隐藏了。
微信截图_20180806161053.png

调试步骤:
1、下载IDA工具,将dbgsrv目录下的android_server,复制到手机/data/local/tmp/目录下,并添加777权限。如果你的手机是64系统,请复制android_server64,如果使用模拟机,请复制android_x86_server。
dbgsrv.png

2、手机数据线连接电脑,手机打开调试模式,使用adb命令
adb devices  //手机将弹出窗口,点击信任允许
adb install  3.apk//手机中安装3.apk
adb shell  //进行终端后,执行以下命令。
cd /data/local/tmp/
./android_server//手机将打开本地23946端口。
androidserver.png

退出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
ps.png
记录下对应的PID:14243
adb forward tcp:8700 jdwp:14243



4、启动IDA(如果你手机是64位,请启动IDA64),
ida1.png
ida2.png
ida3.png
ida4.png

此处的127.0.0.1:23946对应步骤2中启动./android_server开打的端口。确定后出现下图,选择需要调试的APK。
pid.png
出现弹窗后确定。

5、打开命令提示符,启动jdb调试器
jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700
正常情况下是这样
jdb.png

6、首先找到libdvm.so。IDA窗口Debugger->Debugger windows->Modulelist,打开ModulesCTRL+F搜索:libdvm.so找到后双击进入。然后再次CTRL+F搜索:dvmDexFileOpenPartial。找到后双击进入如下图
111.png
dvmDexFileOpenPartial函数处(40BBD190)下断点,左侧点击一下就可以了。下断点后会变成红色。
使用F8进行单步调试,但是这里需要注意的是,只要运行过了PUSH命令就可以了,记得不要越过下面的BL命令,因为我们没必要走到那里。当执行了PUSH命令之后,我们就是使用脚本来dump处内存中的dex数据了,这里有一个知识点,就是R0~R4寄存器一般是用来存放一个函数的参数值的,那么我们知道dvmDexFileOpenPartial函数的第一个参数就是dex内存起始地址,第二个参数就是dex大小:


7、这里就可以使用这样的脚本进行dumpShift+F2调出IDA脚本运行界面:
jb.png
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,没有出错。
kill.png 查看源码。
jar.png

注: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即可。
art.png
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);
}


免费评分

参与人数 22威望 +1 吾爱币 +28 热心值 +20 收起 理由
疯火戏猪猴 + 1 + 1 谢谢@Thanks!
毒瘤 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
快乐交友 + 1 + 1 谢谢@Thanks!
huangziqiangj + 1 + 1 谢谢@Thanks!
bitpeach + 1 + 1 用心讨论,共获提升!
wyf3809 + 1 谢谢@Thanks!
走码观花 + 1 用心讨论,共获提升!
梦还在继续 + 1 我很赞同!
qtfreet00 + 1 + 9 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
dlj + 1 + 1 谢谢@Thanks!
851365960 + 2 + 1 热心回复!
VikyPluto + 1 + 1 用心讨论,共获提升!
thornfish + 1 + 1 我很赞同!
guigui328 + 1 + 1 用心讨论,共获提升!
xtkj4382 + 1 + 1 我很赞同!
shock-c + 1 + 1 感觉似曾相识
RoB1n_Ho0d + 1 热心回复!
CIBao + 1 + 1 谢谢@Thanks!
LivedForward + 1 + 1 谢谢@Thanks!
zysanjing1 + 1 + 1 谢谢@Thanks!
mc123 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
独行风云 + 1 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 森林雪人 发表于 2019-7-20 22:56
z5487693 发表于 2019-7-18 17:08
楼主还在吗?帮忙看一下我的这个问题吧,怎么只有三个进程,别的进程都没有

推荐一位高人的文章,https://blog.csdn.net/jiangwei0910410003/article/details/51597771
我的帖子是在他的基础上写的。
IDA脱壳操作比较复杂,能看到这里的小伙伴不容易,分享一个脱壳工具:xposed+FDex2,秒脱主流加固壳。
 楼主| 森林雪人 发表于 2019-7-18 10:25
jmzqwh 发表于 2019-7-13 17:56
根据网址下载的apk装到真机上无法运行,楼主有源链接么?因为看起来是个阿里的测试题

我有台机也不能运行。如果闪退,dex应用还未加载到内存。只能换一台真机试试。

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
jmzqwh + 1 + 1 谢谢@Thanks!

查看全部评分

java_shr 发表于 2018-8-6 19:16 来自手机
zysanjing1 发表于 2018-8-6 19:30
牛!通俗易懂,但是自己操作就。。。
Javajsc 发表于 2018-8-6 19:40
写的很不错,但实际操作起来就有点难了
LivedForward 发表于 2018-8-6 19:48
不错呀,感谢作者的分享
头像被屏蔽
vvking7 发表于 2018-8-6 20:11
提示: 作者被禁止或删除 内容自动屏蔽
CIBao 发表于 2018-8-6 20:57
操作非常複雜......值得收藏
振翅而飞 发表于 2018-8-6 21:17
收藏,学习.感谢楼主分享
刀锋之影 发表于 2018-8-6 21:24
很不错,正准备进入壳 世界,想问下,这种方法目前对几种市面上 流行的 加密壳有效? (没抱太大希望...)
A00 发表于 2018-8-6 21:41
通俗易懂,期待更多好文章
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-22 14:06

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表