敢说敢作敢为, 无怨无恨无悔。这篇文章主要讲述Android逆向基础相关的知识,希望能为你提供帮助。
1. Android APK文件结构
问题:那么Android APK的入口函数是什么?
Android 系统历史
2.SDK工具-adb,monitor
adb命令
monitor操作
3. Android逆向工具
①命令行工具
1.AndroidManifest.xml清单文件解密工具
2.Dex文件反汇编、汇编工具
3.apk签名工具
4.apk反编译工具-apktool
5.Dex2jar工具(转换文件格式)
6.Java反编译工具(将java文件反编译为源码)
②可视化工具
1.AndroidKiller工具(集成了反编译、回编译、安装apk、查看源码)
2.JEB反编译工具
3.Jadx-GUI
4.GDA 反编译工具
4. Android逆向分析方法
5. 字符串分析法-实例-破解一个apk的流程
破解步骤
使用AndroidKiller用字符串分析法
6. Smali代码-HelloWorld
7. 日志过滤法-实例
使用Monitor过滤日志
使用AndroidKiller过滤日志
8. 配置环境问题
夜神模拟器adb连接
0. android逆向基本介绍
- Android APK文件结构
- SDK工具-adb,monitor
- 逆向工具介绍
- Android逆向分析方法
- 字符串分析法-实例-破解一个apk的流程
- 日志过滤分析法
- 配置环境问题
文章图片
META-INF目录: 签名信息,包括公司信息、文件的HASH值
Res目录:资源信息,包括图片、xml(布局文件、字符串、风格样式等)
AndroidMainfest.xml :清单文件,包括APK包名、四大组件的一些申明定义、权限、程序的入口
Classes.dex: 可执行文件,包括java的类信息、方法信息、字段信息、虚拟机指令。dex文件的生成流程是从java源码-> class文件-> dex文件
Resources.arsc: 资源序号文件,包括资源里的所有ID、名称。资源ID对应文件是R.class
文章图片
在Android studio 中,打开apk文件,在Lib目录动态库,扩展名是.so ,包括C++代码,有各种平台,比如x86,arm
文章图片
Assets目录 自定义资源,比如.txt,mp4,等等
文章图片
问题:那么Android APK的入口函数是什么?
自己定义的MainActivity中onCreate
而且清单文件中application节点可以添加android:name属性,指定继承自application的类,用于初始化整个app的全局信息。
继承自application的类有两个重写函数会执行,是程序最早执行的函数。
① attachBaseContext
② onCreate
文章图片
所以一个app最早执行的函数是 application的类中的attachBaseContext函数
一般apk加固之后,都会自定义application类,并重写其中的attachBaseContext函数或onCreate函数,并且声明为native类型的函数。
app运行的流程
文章图片
Android 系统历史
分为三个阶段
① android2.3~4.0 卡顿
② android4.1~4.4 成长,飞跃
android虚拟机dalvik-> art
③ android5.0~现在 整体不错
逆向分析的环境
系统:android 4.4 (同时有dalvik和art)
手机: google nexus 4/5(500左右)
google nexus 6p(800左右)
2.SDK工具-adb,monitor adb命令
① 列举设备
adb devices
②将apk上传到设备
adb push
文章图片
③安装apk
adb install -r apk文件名 (可以覆盖安装)
④启动apk
adb shell am start -n < 包名/activity名称>
adb -s emulator-5556 shell am start -n com.bluelesson.helloworldndk21/.MainActivity
adb shell am start -D -n < 包名/activity名称> (以调试方式启动)
⑤ shell命令
ls,cd,su,ps,ps | grep com,kill,chmod
monitor操作
① 概况
- androidstudio中打开
文章图片
- 文件目录中打开
文章图片
- 主要窗口
文章图片
② 设备列表
文章图片
③ 文件夹操作
文章图片
④ 日志
文章图片
过滤日志
文章图片
1.AndroidManifest.xml清单文件解密工具
- AXMLPrinter2.jar
java -jar AXMLPrinter2.jar < 清单文件>
java -jar AXMLPrinter2.jar AndroidManifest.xml > out.xml - APK15PBParser.jar(集成了AXMLPrinter2.jar,apktool.jar中xml解析部分代码)
java -jar APK15PBParser.jar
java -jar APK15PBParser.jar HelloWorld1.apk
- Baksmali.jar(反汇编工具,将虚拟机指令反汇编成smali代码)
java -jar baksmali.jar-o < 输出目录>
java -jar baksmali.jar classes.dex -o out_dir
反汇编生成的目录中,包括所有dex文件中的类代码,每一个类就是一个smali文件。
Java中有三种类,外部类、内部类、匿名类
外部类:MainActivity.java -> MainActivity.smali
内部类:MainActivity类中MyOnClickListener类MainActivity$MyOnClickListener.smali
匿名内部类:MainActivity类中new OnClickListener对象 -> MainActivity$1.smali - smali.jar(汇编工具,将smali代码汇编生成dex文件)
java -jar smali.jar < 目录> -o 文件名
java -jar smali.jar out_dir -o out.dex
修改smali代码,#号是注释代码
// # if-eqz v2, :cond_24
java -jar signapk.jar testkey.x509.pem testkey.pk8 update.apk update_signed.apk
签名工具:signapk.jar
密钥对:公钥testkey.x509.pem,私钥 testkey.pk8
签名:
java -jar signapk.jar testkey.x509.pem testkey.pk8 代签名.apk 已签名.apk
签名工具的配置
打开发送到的文件夹:shell:sendto
java -jar 全路径 \\signapk.jar全路径 \\testkey.x509.pem 全路径\\testkey.pk8 %1 %1_signed.apk
4.apk反编译工具-apktool反编译apk
java -jar apktool.jar d
java -jar apktool.jar d HelloWorld.apk
①将清单文件解密
②将资源序号文件与资源名称做了一个对应关系表
生成在了/res/values/public.xml
③将dex文件反编译成了smali代码
回编译 apk目录
java -jar apktool.jar b < 反编译的apk文件目录>
java -jar apktool.jar b HelloWorld
生成的APK在 < 反编译的apk文件目录> /dist目录中
5.Dex2jar工具(转换文件格式)dex2jar> d2j-dex2jar.bat
dex2jar> d2j-dex2jar.bat classes.dex
dex2jar classes.dex -> .\\classes-dex2jar.jar
6.Java反编译工具(将java文件反编译为源码)
文章图片
②可视化工具
1.AndroidKiller工具(集成了反编译、回编译、安装apk、查看源码)
- apktool
所在目录:AndroidKiller_v1.3.1\\bin\\apktool\\apktool
文章图片
AndroidKiller SDK环境
文章图片
在Androidkiller中设置新的apktool
文章图片
文章图片
文章图片
文章图片
- adb工具
常用命令
打开shell:adb shell , adb -s 设备名称 shell
安装apk: adb install 1.apk , adb install -r 1.apk
列举设备: adb devices
- dex2jar工具集
将dex文件转成jar文件,方便jd-gui反编译
- jd-gui工具
可以查看smali代码对应的java源码
文章图片
此外还有一些好工具的辅助工具
文章图片
编码转换
文章图片
文章图片
文章图片
3.Jadx-GUI
文章图片
4.GDA 反编译工具
文章图片
4. Android逆向分析方法①字符串分析法
②日志分析法
③动态调试smali, 动态调试so文件(c++生成的文件)
④API下断(调试so,对linux API下断),栈回溯分析
5. 字符串分析法-实例-破解一个apk的流程 破解步骤
- 拿到apk
- 使用反编译工具进行反编译
- 根据apk运行提示,查找字符串
- 查找字符串进行分析,找关键代码修改
- 使用重打包工具进行重打包
- 使用签名工具进行签名
但是需要注意的是,中文字符串在Android是以Unicode编码方式显示的,格式类似\\u4e0d\\u597d\\u610f\\u601d。我们需要进行转换,AndroidkKiller提供了这个功能
文章图片
通过查找到对应代码,然后在代码附近可以发现显示成功的字符串。在成功字符串上面有关键跳转,我们只需要将关键跳转nop掉即可。其实在smali使用#号注释掉即可。
文章图片
在代码的上方,应该就是正确密码比对的地方,查看上下文发现v2寄存器,使用资源ID中获取的一个字符串。
文章图片
在这个时候,一般在工程中搜索资源ID,从资源ID找到对应的资源名称以及类型,然后再根据类型和名称找到对应资源的定义。
文章图片
然后再去搜索对应资源名称,找到字符串定义,因为已经知道类型是sting,直接可以查看文件res/values/strings.xml。
文章图片
之后,重新编译,安装测试。
6. Smali代码-HelloWorld
.class public LHelloWorld;
#Ye olde hello world application
#To assemble and run this on a phone or emulator:
#
#java -jar smali.jar -o classes.dex HelloWorld.smali
#zip HelloWorld.zip classes.dex
#adb push HelloWorld.zip /data/local
#adb shell dalvikvm -cp /data/local/HelloWorld.zip HelloWorld
#
#if you get out of memory type errors when running smali.jar, try
#java -Xmx512m -jar smali.jar HelloWorld.smali
#instead.super Ljava/lang/Object;
.method public static main([Ljava/lang/String;
)V
.registers 2sget-object v0, Ljava/lang/System;
->
out:Ljava/io/PrintStream;
const-stringv1, "Hello World!"invoke-virtual {v0, v1}, Ljava/io/PrintStream;
->
println(Ljava/lang/String;
)Vreturn-void
.end method
文章图片
7. 日志过滤法-实例 使用Monitor过滤日志
①添加过滤项
文章图片
②搜索过滤
文章图片
使用AndroidKiller过滤日志
文章图片
文章图片
8. 配置环境问题 夜神模拟器adb连接
【Android逆向基础】
文章图片
复制androidkiller中的adb以及dll,到SDK目录、夜神安装目录
文章图片
文章图片
推荐阅读
- 通达2017OA办公系统-热销-全功能无限制源码CRM HR微信钉钉APP
- 阶段3 2.Spring_03.Spring的 IOC 和 DI_5 BeanFactory和ApplicationContext的区别
- 关于获得安卓外部存储读写权限
- Xamarin Android 监听音量键(下)
- 彻底解析Android缓存机制——LruCache
- Android数据库使用指南(下)
- android SDK 安装
- android中ScrollView嵌套ListView或GridView显示位置问题
- Android MTP 模式 驱动无法安装解决方案