首页
社区
课程
招聘
[原创]移动样本之初学脱壳
发表于: 2018-7-16 17:04 10247

[原创]移动样本之初学脱壳

2018-7-16 17:04
10247

概况

本次分析的样本来自,ISCC竞赛(9efK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3W2K6j5$3I4S2j5W2)9J5k6h3!0J5k6#2)9J5k6h3y4F1i4K6u0r3i4@1g2r3i4@1u0o6i4K6R3&6i4@1f1%4i4@1p5%4i4@1u0n7i4@1f1#2i4K6S2m8i4@1p5^5i4@1f1&6i4K6R3H3i4K6R3$3i4@1f1#2i4K6V1H3i4K6V1I4i4@1f1%4i4K6W2m8i4K6R3@1i4@1f1^5i4@1t1#2i4K6W2n7i4@1f1&6i4@1p5J5i4K6V1^5i4@1g2r3i4@1u0o6i4K6S2o6i4@1f1@1i4@1u0p5i4K6W2o6i4@1f1@1i4@1t1^5i4@1u0m8i4@1f1$3i4K6W2o6i4@1q4o6i4@1f1@1i4@1u0m8i4@1u0m8i4@1f1%4i4K6W2m8i4K6R3@1i4@1f1%4i4@1u0n7i4K6R3K6i4@1f1$3i4K6R3&6i4K6S2n7i4@1f1@1i4@1t1&6i4K6S2n7i4@1f1@1i4@1u0p5i4K6W2o6i4@1f1K6i4K6R3H3i4K6R3J5i4@1f1$3i4K6W2o6i4@1q4o6i4@1f1$3i4@1q4o6i4@1p5I4i4@1f1#2i4K6R3^5i4K6R3$3i4@1f1$3i4K6W2q4i4K6V1H3i4@1f1^5i4@1u0r3i4K6R3%4i4@1f1%4i4@1p5^5i4K6S2n7i4@1f1@1i4@1t1^5i4@1q4p5i4@1g2r3i4@1u0o6i4K6S2o6i4@1f1@1i4@1t1^5i4@1u0n7i4@1f1^5i4@1p5$3i4K6R3I4i4@1f1&6i4K6R3H3i4K6W2m8i4@1f1^5i4@1u0r3i4K6R3%4d9f1c8m8i4@1f1^5i4@1t1H3i4K6R3K6i4@1f1^5i4@1q4r3i4K6V1#2c8s2g2E0M7q4!0q4y4g2)9^5y4#2!0n7b7h3c8W2P5q4!0q4y4W2)9&6y4W2)9^5y4#2!0q4y4q4!0n7b7W2!0n7y4W2!0q4c8W2!0n7b7#2)9^5b7#2!0q4y4g2!0n7z5g2!0n7y4W2!0q4y4q4!0n7z5q4)9&6y4q4!0q4z5q4!0n7c8W2)9&6b7W2!0q4z5q4!0m8x3g2)9^5b7#2!0q4y4#2!0m8c8g2)9^5x3q4!0q4y4g2)9^5c8q4)9&6y4g2!0q4y4g2)9&6b7#2!0n7x3q4!0q4y4q4!0n7b7W2!0m8x3#2!0q4y4#2!0m8x3q4)9^5x3g2!0q4z5g2)9&6z5q4)9^5y4g2!0q4z5q4!0m8c8W2!0n7b7W2!0q4y4g2)9^5c8q4!0n7x3#2!0q4y4g2)9^5c8W2!0m8c8W2!0q4y4g2!0m8c8g2)9^5b7#2!0q4y4W2)9^5z5q4)9&6x3p5y4S2M7s2c8#2M7X3f1`. Flag(拔旗)!


1.由JEB,查看Manifest根据带有"android.intent.action.MAIN"和"android.intent.category.LAUNCHER"确定该activity为入口活动,由android:name确定入口类为"org.isclab.shh.protectapp.MainActivity"


图[1]:确定入口活动

2.根据jeb左侧列表未找到MainActivity类,隐藏入口类,确定该APP已经加固。


图[2]:类列表

3.根据APP应用的启动流程可以知道,dex文件最终会被加载进内存,所以思路就是,只要在载入内存前,找到并dump出来即可。这里因为测试机是Android4.4还在使用DVM虚拟机,所以只要找到libdvm.so下的dvmDexFileOpenPartial函数并下断点即可。

首先将IDA目录下的android_server文件push进/data/local下(只要让文件可执行就行),赋予权限chmod 777 /data/local/android_server,然后./data/local/android_server执行(为了让ida可以远程连接,需要手机ARM架构)


图[3]:android_server执行

4.端口转发adb forward tcp:23946 tcp:23946,让手机中的23946端口映射到PC本地23946端口,用来IDA和手机通信连接(这里需要注意:一旦android_server断开了,重启后需要重新端口转发,要不然IDA连接不到手机的进程)

5.执行adb shell am start –D –n com.example.protectapp/ org.isclab.shh.protectapp.MainActivity(包名/入口类),让需要脱壳的程序在开启入口活动前进入等待调试连接状态。


图[4]:程序等待调试状态

6.打开IDA,选择远程调试连接,然后输入127.0.0.1进行本地调试,并勾选这三个选项,然后Ctrl+F搜所相关字符串,选择需要调试的进程


图[5]:远程连接


图[6]:填写选项


图[7]:选择进程

7.打开Android Device Monitor(android studio自带工具),必须选中需要调试的进程(这里注意一下,如果没有出现进程列表,尝试1.adb kill-server,2.adb start-server然后重新从执行android_server开始),然后adb 连接安卓应用,jdb –connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700


图[8]:选中需要调试的进程


图[9]:jdb连接程序

8.打开第6步填好选项的IDA,选择libdvm.so文件(modules模块下,也可以经过Debugger->Debugger windows->Modules List),双击进入,选择dvmDexFileOpenPartialPKviPP6DvmDex函数并下断点


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 3
支持
分享
打赏 + 5.00雪花
打赏次数 1 雪花 + 5.00
 
赞赏  supperlitt   +5.00 2019/03/15 感谢分享
最新回复 (16)
雪    币: 2708
活跃值: (1723)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
这不是  最初的爱加密的壳子么
2018-7-16 17:54
0
雪    币: 59
活跃值: (185)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
不错不错,支持楼主
2018-7-17 19:21
0
雪    币: 51
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
尼玛,我今天写了一个一摸一样的文章,缘分啊
2018-7-17 21:25
0
雪    币: 2653
活跃值: (3648)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
5
入门不易,设优鼓励
2018-7-17 21:46
0
雪    币: 1192
活跃值: (609)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
顶一下,毕竟爆照了呢
2018-7-18 16:51
0
雪    币: 45
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
顶顶顶
2018-7-19 10:06
0
雪    币: 339
活跃值: (1051)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
8
嘿嘿,顶一波
2018-7-21 09:57
0
雪    币: 140
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
不错不错,支持一下
2018-7-21 14:05
0
雪    币: 5
活跃值: (487)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
说个坑吧,,模拟器请用Linux 选项
2018-7-23 10:01
0
雪    币: 242
活跃值: (41)
能力值: ( LV4,RANK:44 )
在线值:
发帖
回帖
粉丝
11
谢谢分享,写的真的很详细,但是有个问题就是在dvmDexFileOpenPartial里R0存放dex文件开始位置,R1是文件大小是怎么看出来的。
2018-8-1 11:14
0
雪    币: 220
活跃值: (4078)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
12
我二年前写过几乎一样的帖子,,没有给优秀,,有天理吗,,还是刚出来的时候
2018-8-1 13:15
0
雪    币: 419
活跃值: (845)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
13
xeldax 谢谢分享,写的真的很详细,但是有个问题就是在dvmDexFileOpenPartial里R0存放dex文件开始位置,R1是文件大小是怎么看出来的。
从别的大佬引用的,“通过函数原型  dvmDexFileOpenPartial(addr, len, &pDvmDex) 可以知道, addr(R0) 保存的是原来 apk classes.dex 的文件起始地址,len(R1) 保存的是原来 apk classes.dex 的文件长度”
2018-9-7 16:04
0
雪    币: 419
活跃值: (845)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
14
gtict 我二年前写过几乎一样的帖子,,没有给优秀,,有天理吗,,还是刚出来的时候
大佬,不要在意这些小细节
2018-9-7 16:04
0
雪    币: 577
活跃值: (2035)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
mark
2018-9-7 19:46
0
雪    币: 164
活跃值: (2778)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
好东西啊,支持楼主的贡献
2019-3-16 15:56
0
雪    币: 3997
活跃值: (432)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
17
xeldax 谢谢分享,写的真的很详细,但是有个问题就是在dvmDexFileOpenPartial里R0存放dex文件开始位置,R1是文件大小是怎么看出来的。
寄存器传参  R0保存第一个参数也就是起始地址 R1是第二个参数也就是要dump的dex文件的长度   可以去看下源码
2019-4-3 23:21
0
游客
登录 | 注册 方可回帖
返回