Android逆向基础入门
目录
一、基础App数据抓取
1、App常用抓包工具
常用的拦截抓包工具有fiddler、mitmproxy、charles
(手机端需和电脑端在同一个网络下,且手机端要配置相应的证书,手机端还要设置手动代理):大部分app使用的数据通信协议基于http/https,可通过抓包查看来模拟url请求。常用的自动化工具有uiautomatorviewer、Appium、Airtest
(手机与电脑端通过usb数据线连接,同时手机需要打开usb调试功能进入开发者模式):就相当于web端的selenium2、fiddler抓包工具
3、mitmdump抓包工具
强大功能在于mitmdump可以实时抓包,然后给python等处理
4、charles抓包工具
5、uiautomatorviewer / appium自动化工具
可通过录制功能自动生成python代码
6、Airtest自动化工具
可以操作多个手机实现群控,可通过录制功能自动生成python代码
,功能十分强大二、js逆向与app逆向的区别

三、Android_apk逆向
1、app逆向名词
.apk
:每个android app都有对应的安装包,以.apk
为后缀 ,.apk文件类似压缩包,将后缀名改成.zip可以进行解压,里面的.dex文件可以用反编译工具
进行反编译获得源码;所以一般app都会加壳,将真正的源码隐藏起来Java层
:Java代码Native层
:C/C++代码,也称为so层,保存在.so文件下反编译工具:jadx、JEB、Apktool
:因SSL Pinning导致无法正常抓包时,或则是抓包后要分析某个参数的生成逻辑时,需要反编译apk文件,还原成可读性高的java代码进一步分析Hook工具:Xposed、Frida
:可以通过hook拦截和改写逻辑,获取关键加密数据,hook或模拟Java层
和Native层(即so层由C/C++
等实现)的代码;其中Xposed只能Hook Java层逻辑,且Xposed整个模块逻辑需要使用Java语言实现;因此Frida更强大、方便、灵活反汇编工具:IDA Pro工具
:逆向分析、调试、模拟Native层(so层由C/C++`等实现)的代码实现逻辑Java调C的接口:JNI(Java Native Interface)
:即Java的本地接口,是Java调用Native即C/C++编写的代码,C/C++编写的代码会被编译到.so
后缀的文件里,还原so需要反汇编,增加了逆向难度混淆工具:OLLVM(Obfuscator-LLVM)
:在Native层实现混淆,即针对LLVM(编译器和工具链的集合,把C/C++转化成目标机器执行的代码)的代码混淆工具;模拟执行so层逻辑:Frida-RPC、AndServer-RPC、unidbg
:模拟执行so文件的逻辑,不关心so文件的内部逻辑,直接调用so文件,传入对应的参数,得到执行结果;如果被风控检测到执行环境不正常,会拒绝返回数据或者是返回假数据2、jadx反编译工具
jadx工具:jadx-gui反编译图形界面工具,jadx下载 , 解压后运行exe文件,然后打开加载apk文件即可
常用功能:文本搜索(导航),右击代码查找方法声明,右击代码查找用例,反混淆(工具),日志查看器(帮助),设置选项里面也有很多功能
3、JEB反编译工具
(1)JEB常用功能介绍
JEB下载安装,windows运行.bat文件
,然后加载apk文件,即可看到右侧Smali代码
,通过编译也可以转到java代码看
常用功能1:ctr+f图一进行文本字符串搜索定位,并勾选环绕搜索,或者图二ctr+f搜索
转到java代码声明
处,或者再次右击相应代码字符串会回到Smali代码用例
处

(2)JEB动态调试功能
常用功能3:使用JEB动态调试功能验证
,在猜测的代码位置添加断点,然后app滑动加载数据,然后看断点位置是否停止运行
① 首先手机与电脑通过usb数据线连接 > 然后手机端要打开USB调试功能,进入开发者模式 > 然后将电脑端的.apk文件放到手机存储中>然后手机点击apk文件即可安装
② 然后cmd运行如下命令(该命令让手机端的app以调试的模式启动) ,之后手机会显示wating for debugger, -D指定App以调试模式启动
,-n指定启动入口
adb shell am start -D -n com.goldze.mvvmhabit/.ui.MainActivity
③ 然后JEB界面 `在目标代码行ctr+b下断点 > 点击Debug按钮 > 然后调试,滑动app,然后就会断在断点处,多出的右侧界面也可以看字段值变化
④ 发现加密点,进入encrypt函数内部继续调试,亦可右击代码编译直接看java代码,然后逻辑找到要么python还原,要么写个java爬虫都可以
4、Frida之Hook工具
pip install frida -i https://pypi.tuna.tsinghua.edu.cn/simple/
pip install frida-tools -i https://pypi.tuna.tsinghua.edu.cn/simple/
(1)真机下载frida-server文件
准备一部已经root的手机
手机下载frida-server文件,通过数据线usb与电脑连接,在cmd窗口输入以下命令查看cpu类型,如这里需要下载的包对应arm64 ,然后下载frida服务端frida-server(注意这里的版本和Frida的版本是一致的15.1.14)
adb shell
getprop ro.product.cpu.abi
将解压后的文件夹通过adb push将frida-server发送到android设备/data/local/tmp目录中,进入了adb shell操作窗口,并修改可执行权限
######## 1、将解压后的文件夹通过adb push将frida-server发送到android设备/data/local/tmp目录中
adb push "D:\Package\frida-server-15.1.14-android-arm64" /data/local/tmp
######## 2、进入了adb shell操作窗口,修改可执行权限
adb shell
cd /data/local/tmp
ls
chmod 777 frida-server-15.1.14-android-arm64
手机运行frida服务 ./frida-server-15.1.14-android-arm64 &
,起好服务后未报错,则保持当前cmd窗口不要关闭
######## 3、手机端后台运行frida服务
su
./frida-server-15.1.14-android-arm64
如上frida服务起好后,新开一个cmd窗口,执行如下命令
######## 4、在cmd新的窗口下执行如下命令
adb forward tcp:27042 tcp:27042
adb forward tcp:27043 tcp:27043
frida-ps -U
(2)夜神模拟器下载frida-server文件
准备下载夜神模拟器
下载,自定义安装路径,直接下一步即可安装,可以将安装路径D:\Program Files\Nox\bin添加到环境变量;默认打开是平板模式,打开设置>性能设置>分辨率改为手机模版;
连接夜神模拟器设备:打开cmd命令行,进入夜神安装的bin目录,执行如下命令,出现黄色区域内容即连接成功:
nox_adb.exe connect 127.0.0.1:62001
adb devices
模拟器下载frida-server文件,cmd输入以下命令查看cpu类型,如这里需要下载的包对应是x86 ,然后下载frida服务端frida-server(注意这里的版本和Frida的版本是一致的15.1.14)
adb shell
getprop ro.product.cpu.abi
将解压后的文件夹通过adb push将frida-server发送到android设备/data/local/tmp目录中,进入了adb shell操作窗口,并修改可执行权限
######## 1、将解压后的文件夹通过adb push将frida-server发送到android设备/data/local/tmp目录中
adb push "D:\Package\frida-server-15.1.14-android-x86" /data/local/tmp
######## 2、进入了adb shell操作窗口,修改可执行权限
adb shell
cd /data/local/tmp
ls
chmod 777 frida-server-15.1.14-android-x86
模拟器运行frida服务, ./frida-server-15.1.14-android-x86
,起好服务后未报错,则保持当前cmd窗口不要关闭
######## 3、模拟器运行frida服务,并保持当前adb shell窗口一直开着,不能关,否则服务也关了
./frida-server-15.1.14-android-x86
如上frida服务起好后,新开一个cmd窗口
,执行如下命令,控制台输出如下图片内容,则证明已连接成功
######## 4、新开一个cmd窗口,执行如下命令
adb forward tcp:27042 tcp:27042
adb forward tcp:27043 tcp:27043
frida-ps -U
(3)Hook Java层的逻辑
① 以夜神模拟器为例子,打开已下载的app
② cmd窗口起frida服务
,如图,然后编写hook逻辑的js文件以及相应的python文件
adb shell
su
cd /data/local/tmp
./frida-server-15.1.14-android-x86
③ 了解编写hook java 的js代码逻辑, 以及python固定脚本,固定代码结构如下,需要填充的就三处:待连接的app进程名,待hook的文件类名,待hook的函数方法js逻辑代码
js_text = """
Java.perform(function() {
var MainActivity = Java.use('文件类名,可以直接右键复制文件类名');
// 待编写该类下面的函数的hook逻辑
})
"""
# python固定代码,其中js_text是待编写的hook逻辑
def on_message(message, data):
print(message)
# 2、获取当前设备连接并调用设备的attach方法挂载对应的进程, 并往进程中注入Hook脚本
process = frida.get_usb_device().attach('app进程名称,需通过frida-ps -U查看获得')
script = process.create_script(js_text)
# 3、监听message事件, 回调方法是on_message, js代码中任何通过send方法发送的数据,on_message方法都会接收到对应的内容
script.on('message', on_message)
script.load()
sys.stdin.read()
④ 按如上要写的代码结构编写python与js脚本,然后运行python脚本,然后再操作app相关步骤触发,进而hook到;
打印调用堆栈
Java.perform(function(){
// 打印调用堆栈
function printStackTrace(){
console.log(Java.use("android.util.Log") .getStackTraceString(Java.use("java.lang.Exception") .$new()));
}
})
(4)Hook Native层的逻辑
起frida服务
,如下,然后编写hook逻辑的js文件以及相应的python文件,并打开相应的app
adb shell
su
cd /data/local/tmp
./frida-server-15.1.14-android-x86
与hook java层不同的地点在于js代码的编写,python部分完全一样且固定

5、app的壳与脱壳
(1)app的壳特征
目前有三代壳
一代壳
:对原有的dex文件整体加密生成一个新的壳dex文件;反编译后只能看到继承Application类的壳代码,android的四大组件被隐藏;壳的种类:诸如免费加固服务:360加固、腾讯加固、阿里加固、爱加密;查壳工具有:PKID;脱壳工具有:frida_dump、FRIDA-DEXDump等
二代壳
:将dex文件中的某些方法置空,只有在被调用时才会解密加载;反编译后Java代码的方法实现是空的, Smali代码有很多nop指令;脱壳工具有FART
三代壳
:有VMP壳和dex2C壳,将java层的方法Native化;反编译后方法被Native化了;没有成熟的脱壳工具(2)一代壳frida_dump脱壳
利用frida_dump
脱壳: 下载frida_dump,并解压有如下文件,其原理是通过文件头的内容搜索dex文件并dump下来
起好frida服务,手机上安装好app,然后执行frida -U -f com.goldze.mvvmhabit -l dump_dex.js --no-pause
# cmd窗口执行
adb shell
su
cd /data/local/tmp
./frida-server-15.1.14-android-arm64
# 然后另开一个cmd窗口
frida -U -f com.goldze.mvvmhabit -l dump_dex.js --no-pause
脱壳完毕后结果在/data/data/com.goldze.mvvmhabit/files/dump_dex_com.goldze.mvvmhabit文件夹下,有8个dex文件,把它拉取到电脑上
adb pull 可能会出现Permission denied
错误,此时将该目录下的dex文件cp -r 路径 目标路径
复制到/scard下:然后在adb pull 路径 目标路径
拉取到电脑上 ,然后选择较大的dex文件用jadx反编译打开即可看到源码了
adb shell
su
cp -r /data/data/com.goldze.mvvmhabit/files/dump_dex_com.goldze.mvvmhabit /sdcard
# 新开一个cmd窗口直接执行
adb pull /sdcard/dump_dex_com.goldze.mvvmhabit E:\AppPrj\app_apk\app7_tuoke
(3)一代壳frida_dexdump脱壳
利用frida_dexdump
脱壳:frida-DEXDump,通过pip3 install frida-dexdump
安装,其原理是根据一些暴力内存搜索的原理实现脱壳,对于完整的dex文件,搜索dex035
找壳,或者匹配特征如DexHeader的长度信息、索引指向找壳
起好frida服务,手机上安装好app,然后执行frida-dexdump -U -f 包名
# cmd窗口执行
adb shell
su
cd /data/local/tmp
./frida-server-15.1.14-android-arm64
# 然后另开一个cmd窗口
frida-dexdump -U -f com.iCitySuzhou.suzhou001
如图,加了壳的反编译目录
脱壳完毕后会在当前目录下生成文件夹存储dex文件,然后选择较大的dex文件,用jadx反编译即可看到相应的源码了尝试搜索搜索
然后我们搜索,在classes02.dex
文件里面找到了目标字符串,同时对代码进行了反混淆
(4)二代壳FART脱壳
FART
脱壳:FART6、IDAPro反汇编工具
(1)静态分析
adb shell getprop ro.product.cpu.abi
,则选择对应文件夹下的.so文件






(2)动态调试
ida动态调试
,需要起个服务android_server64,如图
adb push android_server64 /data/local/tmp
adb shell
su
cd /data/local/tmp
chmod 777 android_server64
./android_server64
# 新开一个cmd窗口
adb forward tcp:23946 tcp:23946
然后打开ida,选择Go
然后在Debugger选项卡上选择如下选项
然后选择对应app的包名,之后稍等片刻,ida pro会自动停下来
然后在右侧的Modules面板选择对应的.so
文件,并双击进入
然后选择目标定义的方法,左侧会出现对应的汇编代码
然后下断点,运行,然后滑动手机,然后单步调试
未完待学习完善修正中
来源:十一姐