Android逆向系列–360二代加固脱壳实例
前言
在学习Android开发的过程中,往往会去借鉴别人的应用是怎么开发的,那些漂亮的动画和精致的布局可能会让你爱不释手,作为一个开发者,你可能会很想知道这些效果界面是怎么去实现的,这时,你便可以对改应用的APK进行反编译查看。用jadx反编译apk时发现经过360加固,遂对此app脱壳尝试。
360二代加固的难度有所增加,最明显的地方就是qihoo下面增加了一个Configuration.smali文件,由以前的一个增加为两个。
准备工作
反编译工具介绍(jadx)
• jadx介绍
jadx是一款GUI界面的反编译工具,是一款点击鼠标就可以使用的跨平台工具。
项目地址:https://github.com/skylot/jadx
下载地址:https://sourceforge.net/projects/jadx/files/
• 使用方法
a) 下载完解压jadx-0.6.1.zip
b) java环境变量配置,参考教程(https://jingyan.baidu.com/article/c85b7a6414f2ee003bac95d5.html)
c) Windows下点击鼠标运行 bin/jadx-gui (Linux系统运行jadx-gui)
或者直接双击运行lib/jadx-gui-0.6.1.jar
d) 打开APK文件即可查看源码
如果要存储Java源码点击File - Save ALL 即可,我习惯保存java源码并用sublime text 3工具打开,方便全局搜索代码。
脱壳工具介绍(drizzleDumper)
• drizzleDumper脱壳工具的相关链接和讨论
github地址:https://github.com/DrizzleRisk/drizzleDumper#drizzledumper
freebuf地址:https://github.com/DrizzleRisk/drizzleDumper#drizzledumper
看雪地址:http://bbs.pediy.com/showthread.php?goto=nextoldest&nojs=1&t=213174
android-unpacker地址: https://github.com/strazzere/android-unpacker/tree/master/native-unpacker
• drizzleDumper工具下载地址
链接: http://pan.baidu.com/s/1hr49HBI 密码: 6bgv
• jadx工具下载地址
链接:https://sourceforge.net/projects/jadx/files/
Android基础知识
APK(Android Package)是Android程序安装包,是 Android 软件包的分发格式,它本身是个 Zip 压缩包。将.apk后缀名改成.zip,解压后APK 根目录下可能出现的目录和文件有:
AndroidManifest.xml
resource/
xxx.dex
assert/
META-INF/
resources.arsc
• AndroidManifest.xml就是对APP的基本描述文件,用来配置包名_权限_组件信息/最小API等等信息。
• resource 它是app中的资源文件,比如图片布局,如果你想偷点图片什么的,翻一番就可以有的。
• xxx.dex 是Android虚拟机Dalvik的可执行格式(Dalvik Executable format)。
• assert 存放原始的二进制素材,比如mp3,mp4,css,Bitmap。
• META-INF 是对apk的签名信息,防止被盗用。
• resources.arsc 是对value.xml的打包文件。
如果开发者对APP没有做混淆的话,以上文件均可反编译,反编译后,就是这样的:
AndroidManifest.xml -> 转为可读的明文xml
resource/ -> 转为可读的明文xml
xxx.dex -> 变成smali,smali是dex反编译后的文件,基于寄存器,语法类似于汇编
META-INF/ -> 这个...没必要破解,反正重新打包后都要重新签名的
resources.arsc -> 转为可读的明文xml,比如value_string ,value_style
部分名词科普
• .java : 这个是Java源代码
• .jar : 这个是打包好的Java二进制包
• .class : 这个是jar中的字节码/汇编码
• .dex: Dalvik可执行格式
• .smali: Dalvik的字节码/汇编码
• .apk: 这个是Android的安装包
drizzleDumper脱壳工具原理分析
drizzleDumper工作的原理是root环境下,通过ptrace附加需要脱壳的apk进程,然后在脱壳的apk进程的内存中进行dex文件的特征搜索,当搜索到dex文件时,进行dex文件的内存dump。
drizzleDumper.c实现核心代码,详情请查看http://blog.csdn.net/qq1084283172/article/details/53561622
脱壳实战
使用已经root的真机进行drizzleDumper的脱壳实战,以包名com.bbvwpz.nhslo为例。(包名从反编译的AndroidManifest.xml中可以看到)
1.工具下载如下图所示,分为arm和x86两个版本,根据手机CPU类型选择相应版本
2.查看手机CPU类型是x86还是arm adb shell cat _proc_cpuinfo 注:adb是SDK提供的一个常用工具的命令行工具,全称为Android Debug Bridge,用于在调试时连接本机和手机设备。adb shell命令需提前配置好adb环境变量。
3.将dizzleDumper文件推送到android手机_data_local/tmp文件夹下
cd xxxxx/drizzleDumper #进入存放的drizzleDumple文件夹
adb push drizzleDumper /data/local/tmp #将drizzleDumper文件推送到手机
4.修改drizzleDumper可执行权限
adb shell chmod 0777 /data/local/tmp/drizzleDumper
5.执行脱壳操作
adb shell #进入android系统的shell
su #获取root权限
./data/local/tmp/drizzleDumper com.bbvwpz.nhslo 2/#执行脱壳操作等待两秒
如上图所示,脱壳成功,dex文件com.bbvwpz.nhslo_dumped_80.dex保存在_data_local/tmp文件夹下
6.将dex文件拷贝到电脑上
cp /data/local/tmp/com.bbvwpz.nhslo_dumped_80.dex /mnt/sdcard
adb pull sdcard/com.bbvwpz.nhslo_dumped_80.dex
7.用jadx查看dex文件可以看到app源码了