Android逆向之Android逆向工具介绍
Android逆向之Android逆向工具介绍
Android逆向第一天介绍
Android APK文件结构 问题:Android APK的入口函数是什么? Android 系统历史
SDK工具adb,monitor adb的使用 adb命令 monitor操作
Android逆向工具 ①命令行工具 1.AndroidManifest.xml清单文件解密工具 2.Dex文件反汇编、汇编工具 3.apk签名工具 4.apk反编译工具apktool 5.Dex2jar工具(转换文件格式) 6.Java反编译工具(将java文件反编译为源码) ②可视化工具 1.AndroidKiller工具(集成了反编译、回编译、安装apk、查看源码) 2.JEB反编译工具 3.JadxGUI 4.GDA 反编译工具
Android逆向分析方法
字符串分析法实例破解一个apk的流程 破解步骤 使用AndroidKiller用字符串分析法
Smali代码HelloWorld
日志过滤法实例 使用Monitor过滤日志 使用AndroidKiller过滤日志
配置环境问题 Android逆向之Android逆向工具介绍 夜神模拟器adb连接
0.Android逆向第一天介绍
Android APK文件结构
SDK工具adb,monitor
逆向工具介绍
Android逆向分析方法
字符串分析法实例破解一个apk的流程
日志过滤分析法
配置环境问题
1.Android APK文件结构
android studio生成的apk在以下目录
基本的APK是一个压缩包,压缩包中有
METAINF目录 签名信息,包括公司信息、文件的HASH值 Res目录 资源信息,包括图片、xml(布局文件、字符串、风格样式等)
AndroidMainfest.xml 清单文件,包括APK包名、四大组件的一些申明定义、权限、程 序的入口
Classes.dex 可执行文件,包括java的类信息、方法信息、字段信息、虚拟机指令。 dex文件的生成流程是从java源码>class文件>dex文件
Resources.arsc 资源序号文件,包括资源里的所有ID、名称。资源ID对应文件是
R.class
android studo 3.2,所在的目录
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 5(二手 200左右)
2.SDK工具adb,monitor
adb的使用
需要在SDK文件中找到adb,
方法一:设置目录到path环境变量中 F:\Android\Sdk\platform-tools
方法二:
1.新建一个环境变量,变量名:ANDROID_HOME,变量值:以你安装目录为准(我的为F:\Android\Sdk),确认里面有tools和add-ons等多个文件夹,点击确认。
2.修改PATH环境变量:后面新增;%ANDROID_HOME%\tools;%ANDROID_HOME%\platform-tools;%ANDROID_HOME%\build-tools\29.0.2(注意最前面的分号,分割)
然后cmd输入adb测试。不需要重启。能找到就是成功了。
adb命令
① 列举设备 adb devices
② 将apk上传到设备、下载文件到PC
adb push
adb pull
③ 安装apk adb install r apk文件名 (可以覆盖安装) ④ 启动apk adb shell am start n <包名/activity名称>
以调试方式启动apk adb shell am start D n <包名/activity名称> (以调试方式启动)
⑤ shell命令
使用 adb shell 进入 安卓命令行,可以在命令行使用Linux命令
ls,cd,su,ps,ps | grep com,kill,chmod
monitor操作
① 概况
androidstudio中打开
文件目录中打开
主要窗口
② 设备列表
③ 文件夹操作
④ 日志
过滤日志
3.Android逆向工具
①命令行工具
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
2.Dex文件反汇编、汇编工具
Dex文件是android java代码编译生成的二进制文件,包含了虚拟机指令(dalvik虚拟机)
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匿名内部类:类中对象1.smali smali.jar(汇编工具,将smali代码汇编生成dex文件) java jar smali.jar <目录> o 文件名 java jar smali.jar out_dir o out.dex 修改smali代码,#号是注释代码 // # ifeqz v2, :cond_24
3.apk签名工具
签名工具,使用android系统源码编译时用到的一个工具 java jar signapk.jar testkey.x509.pem testkey.pk8 update.apk update_signed.apk
4.apk反编译工具apktool
反编译apk
java jar apktool.jar d java jar apktool.jar d HelloWorld.apk ①将清单文件以及其他xml文件解密 ②将资源序号文件(resources.arsc)与资源名称做了一个对应关系表 生成在了/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>d2jdex2jar.bat dex2jar>d2jdex2jar.bat classes.dex dex2jar classes.dex > .\classesdex2jar.jar
6.Java反编译工具(将java文件反编译为源码)
②可视化工具
1.AndroidKiller工具(集成了反编译、回编译、安装apk、查看源码)
第一次打开的时候需要配置一下jdk的路径
AndroidKiller中集成了好几个工具:
apktool, dex2jar工具集,adb,jdgui
apktool 所在目录:AndroidKiller_v1.3.1\bin\apktool\apktool
在Androidkiller中设置新的apktool
adb工具 常用命令 打开shell:adb shell , adb s 设备名称 shell 安装apk: adb install 1.apk , adb install r 1.apk 列举设备: adb devices
dex2jar工具集
将dex文件转成jar文件,方便jdgui反编译
jdgui工具 可以查看smali代码对应的java源码
此外还有一些好工具的辅助工具
编码转换
2.JEB反编译工具
3.JadxGUI
4.GDA 反编译工具
4.Android逆向分析方法
① 字符串分析法 ② 日志分析法
③ 动态调试smali, 动态调试so文件(c++生成的文件) ④ API下断(调试so,对linux API下断),栈回溯分析
5.字符串分析法实例破解一个apk的流程
破解步骤
拿到apk
使用反编译工具进行反编译
根据apk运行提示,查找字符串
查找字符串进行分析,找关键代码修改
使用重打包工具进行重打包
使用签名工具进行签名
使用AndroidKiller用字符串分析法
但是需要注意的是,中文字符串在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 2
sget‐object v0, Ljava/lang/System;‐>out:Ljava/io/PrintStream;
const‐string v1, "Hello World!"
invoke‐virtual {v0, v1}, Ljava/io/PrintStream;‐
>println(Ljava/lang/String;)V
return‐void
.end method
7.日志过滤法实例
使用Monitor过滤日志
①添加过滤项
②搜索过滤
使用AndroidKiller过滤日志
8.配置环境问题
复制androidkiller中的adb以及dll,到SDK目录、夜神安装目录