一、基础App数据抓取
1、App常用抓包工具
-
常用的拦截抓包工具有fiddler、mitmproxy、charles
(手机端需和电脑端在同一个网络下,且手机端要配置相应的证书,手机端还要设置手动代理):大部分app使用的数据通信协议基于http/https,可通过抓包查看来模拟url请求。 - 对于安卓手机抓包建议使用charles,因SSL Pinning(证书锁定)无法对https协议的请求抓包,此时可尝试以下几种方式①使用android 7 以下的系统解除限制,②xposed + JustTrustMe,③ VirtualXposed + JustTrustMe ④ Frida + DroidSSLUnpinning ;只有抓到包我们才知道需要哪个参数
-
常用的自动化工具有uiautomatorviewer、Appium、Airtest
(手机与电脑端通过usb数据线连接,同时手机需要打开usb调试功能进入开发者模式):就相当于web端的selenium
2、fiddler抓包工具
- fiddler安装与使用,不用手动设置代理,打开软件就自动开启了代理
3、mitmdump抓包工具
-
mitmproxy安装与抓包分析, 需要手动设置浏览器局部代理不太方便但还行;
强大功能在于mitmdump可以实时抓包,然后给python等处理
- mitmdump实时抓包使用介绍:分析抓包逻辑编写好python处理脚本 > mitmdump -s py文件 -p 端口号 > 滑动app(设置代理)或者web(设置局部代理)
4、charles抓包工具
- charles安装与抓包分析,Charles免费使用30分钟,然后需要重启再次使用,貌似设置了SSL Proxying证书,可以抓SSL Pining的包(低于7版本的安卓系统)
5、uiautomatorviewer / appium自动化工具
-
appium相关操作使用,与手机通过usb连接,需要确定要操作的相应的app包名起服务,没有airtest方便;
可通过录制功能自动生成python代码
- appium实战案例1
- appium实战案例2
6、Airtest自动化工具
-
Airtest相关操作使用,与手机通过usb数据线连接,
可以操作多个手机实现群控,可通过录制功能自动生成python代码
,功能十分强大
二、js逆向与app逆向的区别
- app逆向比js逆向繁琐很多,掌握的知识点也要更多,难度根本不在一个层次
- js逆向:全部在web页,抓包只需chrome浏览器,js逆向分析也只需chrome浏览器,也就是整个分析过程在chrome上就可以完成,一些偶尔使用的辅助工具油猴,fiddler,ast,几乎就没了
- app逆向:最好有一个手机,https的抓包可能会抓不到,有壳的还要脱壳,需要反编译或者反汇编才能看到java或者C的代码,有时候甚至要看汇编的,需要掌握的知识点根本不是一个量级
- 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++转化成目标机器执行的代码)的代码混淆工具; - 当有如上OLLVM混淆时,要分析其内部调用逻辑,十分困难,一个方法是硬刚逆向so文件和通过动态调试进行分析;另一个方法就是利用RPC、unidbg等模拟执行so文件的逻辑
-
模拟执行so层逻辑:Frida-RPC、AndServer-RPC、unidbg
:模拟执行so文件的逻辑,不关心so文件的内部逻辑,直接调用so文件,传入对应的参数,得到执行结果;如果被风控检测到执行环境不正常,会拒绝返回数据或者是返回假数据
2、jadx反编译工具
-
jdk1.8_java环境安装(目录3)
-
adb安装(目录2)
-
jadx工具:jadx-gui反编译图形界面工具,jadx下载 , 解压后运行exe文件,然后
打开加载apk文件即可
-
常用功能:文本搜索(导航),右击代码查找方法声明,右击代码查找用例,反混淆(工具),日志查看器(帮助),设置选项里面也有很多功能
3、JEB反编译工具
(1)JEB常用功能介绍
-
JEB反编译器使用详细介绍
-
JEB下载安装,windows运行
.bat文件
,然后加载apk文件,即可看到右侧Smali代码
,通过编译也可以转到java代码看 -
常用功能1:ctr+f图一进行文本字符串搜索定位,并勾选环绕搜索,或者图二ctr+f搜索
- 常用功能2:右击代码编译可以
转到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工具
- Hook工具Frida详细介绍,是一个基于Python和JavaScript的Hook与调试框架,可以Hook Java层或者Native层,通过python注入js脚本操作手机上的java代码
- Frida安装:按如下命令进行安装
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层的逻辑
- ① 下载相关.apk文件安装到模拟器或者手机,本案例以模拟器为例
- ② cmd窗口
起frida服务
,如下,然后编写hook逻辑的js文件以及相应的python文件,并打开相应的appadb shell su cd /data/local/tmp ./frida-server-15.1.14-android-x86
- ③ 编写hook native 的js代码逻辑, 以及python脚本,然后运行python脚本,然后再操作app相关步骤,进而hook到;
与hook java层不同的地点在于js代码的编写,python部分完全一样且固定
5、app的壳与脱壳
(1)app的壳特征
- 如果一个.apk,可以直接通过jadx等直接反编译获得源码是比较危险的,所以为了保护源码,基本上apk都会加壳,
目前有三代壳
-
一代壳
:对原有的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
脱壳:FART
6、IDAPro反汇编工具
(1)静态分析
- IDAPro下载安装查看
- 查看手机是哪种处理器:
adb shell getprop ro.product.cpu.abi
,则选择对应文件夹下的.so文件
- 右击选择对应的.so文件打开
- 然后到了如下界面,左侧是so文件中的一些方法声明,右侧是对应的反汇编结果
- 然后将汇编代码还原成C/C++,如图操作即可
(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
文件,并双击进入 -
然后选择目标定义的方法,左侧会出现对应的汇编代码
文章来源:https://www.toymoban.com/news/detail-401234.html -
然后下断点,运行,然后滑动手机,然后单步调试
文章来源地址https://www.toymoban.com/news/detail-401234.html
未完待学习完善修正中
到了这里,关于Android逆向基础入门的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!