Frida+Objection
adb shell getprop ro.product.cpu.abi 查看模拟器的架构
下载frida-server https://github.com/frida/frida/releases
把frida-server放入Mumu的shell文件里面
cmd cd跳转到Mumu的shell位置(cd /d E:\MuMu Player 12\shell)
输入adb.exe push frida-server-16.0.11-android-arm64 /data/local/tmp
关于recaple的手机抓包的配置
https://reqable.com/zh-CN/docs/getting-started/installation/
adb.exe shell
我们需要提升到root权限,输入su(注意mumuMonique输入su后会弹窗让你确认权限,一定要允许)
cd /data/local/tmp/
chmod 777 frida-server-16.6.1-android-arm64
./frida-server-16.6.1-android-arm64
这个cmd不要关
frida-ps -U(输出中应列出 MuMu 模拟器中的所有正在运行的进程)
frida -U -l E:\hello_world.js android.process.media (U是USB l是load加载)
android studio连接mumu
要打开Mumu的开发者模式
adb.exe connect 127.0.0.1:7555
adb shell ps (列出所有程序,可以查看进程)
frida -U -p 14025 -l E:\frida脚本\script1.js
frida -UF -l hook_script.js -o logs.txt
r0capture:
对于安装:
pip install loguru -i https://mirrors.aliyun.com/pypi/simple/
pip install click -i https://mirrors.aliyun.com/pypi/simple/
python .\r0capture.py -U 包名
python r0capture.py -U PID
r0capture.py --isUsb com.xingin.xhs
objection:
https://www.52pojie.cn/thread-1626964-1-1.html
objection --gadget com.xingin.xhs explore
memory list modules 查看当前程序调用的so
android hooking list activities 打印所有的活动页面(只显示活动的界面)
memory search 内存搜索
android intent launch_activity com.xingin.im.ui.activity.ChatActivity强行启动指定activities 可以强行启懂页面
android hooking watch class com.example.fridaapp.MainActivity --dump-args --dump-backtrace --dump-return 查找它的类
android hooking watch class_method com.example.fridaapp.MainActivity.calculateResult --dump-args --dump-backtrace --dump-return
android hooking generate simple com.android.settings.DisplaySettings 生成一个简单的hook代码
android hooking list classes 打印所有 classes
android hooking search classes *** 筛选指定类
android hooking list class_methods sun.util.locale.LanguageTag 打印方法体
android hooking watch class_method com.xxx.xxx --dump-args --dump-return 快速hook(来看是否代码走到这里)
搜索类 android hooking search classes display
搜索所有的方法 android hooking search methods display
列出类的所有方法 android hooking list class_methods com.xxx.xxx
objection --gadget com.example.fridaapp explore 这条命令启动 objection 并连接到指定的应用 com.example.fridaapp,进入一个交互式控制台,你可以在其中执行进一步的分析。
android hooking list classes 这条命令会列出目标应用中当前已加载的所有 Java 类。你可以通过这些类来进行进一步的 Hook 或分析。
android hooking search classes fridaapp 这条命令会列出所有类名中包含 frida 的 Java 类。你可以用这个命令来查找与 Frida 相关的类,进行进一步的 Hook 或分析。
android hooking list methods <类名>
android hooking search methods <关键字>
objection辅助插件wallbreaker
git clone https://github.com/hluwa/Wallbreaker ~/.objection/plugins/Wallbreaker
objection --gadget com.example.fridaapp explore -P ~/.objection/plugins/
plugin wallbreaker objectsearch com.xingin.chatbase.bean.MsgUIData 打印出参数
plugin wallbreaker classdump com.example.fridaapp.MainActivity 输出类的结构, 若加了 --fullname 参数,打印的数据中类名会带着完整的包名
plugin wallbreaker objectdump <handle> [--fullname] 在 ClassDump 的基础上,输出指定对象中的每个字段的数据
对android studio里面的代码进行一个apk
点击 Build 菜单,选择 Build Bundle(s) / APK(s) > Build APK(s)。
<你的项目目录>/app/build/outputs/apk/debug/app-debug.apk
jadx反编译
Xposed
charles
安装证书在设置-网络和互联网-互联网-网络偏好设置-安装证书中
逆向Bilibili
逆向请求头
请求体是如何加密的
如何查找这些
jadx反编译
网络请求
okhttp
retrofit
实战流程:
首先打开jeb或者jadx
然后放入apk在里面
然后打开androidmanifest.xml查看app的包名
manifest package就是app的包名
然后开始启动adb shell的./frida-server
adb shell ps列举出所有的进程,查看是否该程序启动
然后objection --gadget 包名 explore
找到实例相关
然后使用apktool
apktool d your_app.apk或者自定义输出路径apktool d C:\Users\ASUS\Desktop\app-debug.apk -o E:/output_folder
{
说明:
AndroidManifest.xml:Android 应用的清单文件,可以在这里修改权限、组件声明等。
smali/ 文件夹:这是反编译后得到的 Smali 文件,它们代表了 APK 的字节码,可以在这里修改应用的逻辑(如果需要)。
res/ 文件夹:包含资源文件,如图片、布局(XML 文件)、字符串资源等。你可以直接修改这些文件来更改界面或资源。
libs/:包含 JNI 库文件。
assets/:包含应用的资产文件,如数据库、配置文件等。
}
然后修改好smail之后重新apk:apktool b your_app_folder -o modified_app.apk
然后就是前面签名 APK,用的是apksigner
如何通过抓包,然后知道它的一些调用方法的函数
抓到包之后,然后模糊搜索他的一些参数
=====================frida-dexdump=============================(脱壳工具)
frida-dexdump进行一个脱壳
frida-dexdeump -U -f 包名
frida-dexdeump -U -d 包名 (深度脱壳)
pip3 install frida-dexdump -i https://mirrors.aliyun.com/pypi/simple/
frida-dexdump -Uf com.hipu.yidian 要打开app才可以进行
进行查询findstr /s /i /m "com.yidian.news.ui.guide.UserGuideActivity" * (com.yidian.news.ui.guide.UserGuideActivity用GDA打开在baseinfo里面)
脱完壳之后可以看到有很多classes.dex
然后把特定的classes.dex放入反编译器
如果apk加固了用MT管理器全是so文件,没有dex文件
然后frida-dexdump把加固的脱壳之后,就会有很多dex文件
可以用GDA4来进行检索Main Activity(BaseInfo)的一个入口
找到Main Activity入口之后可以使用findstr /s /i /m "入口" * (用power shell执行)
就会出来一些相关的dex文件
某so对frida检测,然后终止
放gpt写一个检测 .so 文件加载的脚本
逐步查看打开的文件顺序
第一种方式,删掉这个so文件
反frida(删除so文件,换用hluda,ptrace占坑)
LSposed可以获取加载相关的类,还有package
findClassIfExists 主要用于安全地查找类,并避免因类不存在而导致应用崩溃。它在某些情况下非常有用,尤其是当你不确定某个类是否已经在当前的环境中加载时。
findAndHookMethod 是 LSPosed 框架中的一个非常重要的工具方法,它用于动态地查找一个方法并将其“钩住” (hook),即在方法调用时插入自定义的代码。
xposedhelpher,也可以打印出栈
xposed在安装一个算法助手
unidbg,开发者可以在没有 Android 设备的情况下执行和调试原生代码
抓包获取的数据都乱码,一定是做了代理检测
所以我们要抓更底层的包,Socket(下载一个socksdroid)
单向证书验证
SSL证书验证
双向证书验证
curl转requests
https://spidertools.cn/#/curl2Request
有编码就解码 url解码工具 https://spidertools.cn/#/unQuoteUrl
写一下注释看看能不能跑,能跑就不分析这个参数
不是有些参数会变化吗
那么就hook头部的代码Header
首先就是apk解码,jadx模糊搜索header
然后hook.js代码写好
frida -UF -l hook.js (USB数据线)
通过 USB 连接到安卓设备 (-U)。
启动并附加到目标应用 (-F)。
然后我们就开始查看authorization的栈
在编程和调试中,“栈”通常指的是 调用栈,它记录了程序执行过程中每个函数的调用情况。每次函数被调用时,相关的信息(比如函数名、参数、局部变量等)会被压入栈中。函数执行完毕后,这些信息会被弹出栈。
Header Name: Authorization
Header Value: MjAxODAxMTFfYW5kcm9pZDplOTk0NmIyYWZlYzQxZWU0MTEzNzdkODljNGQwZjQ0OTMyNmJhMmRi
Stack Trace for Authorization header:
java.lang.Exception
at okhttp3.Request$Builder.addHeader(Native Method)
at com.bk.base.netimpl.a.a(HttpUtil.java:767)
at com.bk.base.netimpl.interceptor.d.intercept(HeaderInterceptor.java:62)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
at com.bk.net.interceptor.AuthInterceptor.intercept(AuthInterceptor.java:26)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
at com.bk.base.netimpl.interceptor.a.intercept(AnchorInterceptor.java:61)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
at com.ke.trafficstats.LJTSHTTPInterceptor.intercept(LJTSHTTPInterceptor.java:69)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:257)
at okhttp3.RealCall$AsyncCall.execute(RealCall.java:201)
at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:919)
at com.lianjia.httpservice.HttpExecutors$ThreadWrapper.run(HttpExecutors.java:139)
================sekiro========================================
https://sekiro.iinti.cn/sekiro-doc/01_manual/2.basic.html
Sekiro是一个rpc框架,他主要用于将内网环境的一个api功能发布到公开的外网环境
===================unidbg==========================================
可以调用安卓或者ios的so文件
================平头哥ratel==========================================
免root
================spawn和attach====================================
spawn:启动一个新的应用进程,Frida 会在应用启动时就开始工作。
attach:附加到已经在运行的应用进程,分析正在运行的应用。
===========安卓混淆和反混淆===============================
Proguard
在build.gradle看看采用得是什么混淆
ProGuard 或 R8
=========native层hook=====================================================
java代码像中国店
native方法像进口商品
JNI就像海关,负责java和C的沟通
NDK native development kit 是安卓的工具集,允许使用C/C++编写安卓应用
system.loadlibrary("")用于加载.so文件
.so文件是C/C++编译后的动态库文件
就像Windows的.dll文件一样
memory list modules可以查看so是被加载
memory list exports .so
===逆向代码说明和注释=======================================================
SerializedName序列化成json
Patchproxyreasult热修复工具
if(resylt.isSupported)意思是如果有热补丁,执行下面的程序
parcel(可以理解成为一个容器).readString()表示读取字符串
hashmap就是key-value
MessageBean存储消息的各种信息,相当于一个容器
intent是传递消息的工具或者去下一个页面 putextra()把东西放进去
WebRequestInterceptor 是一个实现了 OkHttp 的 Interceptor 接口的拦截器类。拦截器的主要作用是在 HTTP 请求发送前和响应接收后对请求和响应进行处理和修改。在这个类中,拦截器主要完成以下任务:
处理请求参数:根据请求的不同方法(如 POST 或 GET)和路径,修改请求参数,生成并添加 newSign 参数。
添加请求头:根据配置,向请求中添加一系列自定义头部(如 duuuid、duimei、User-Agent 等)。
WebRequestInterceptor 通过拦截和修改 HTTP 请求,为每个请求生成并添加了 newSign 参数。newSign 的生成依赖于 RequestUtils 类中的方法,这些方法可能涉及复杂的签名或加密逻辑。
// 获取当前的HTTP请求
Request request = chain.request();
// 获取当前时间并减去配置的时间偏移量
long currentTimeMillis = System.currentTimeMillis() - DuHttpConfig.d.getTimeOffset();
// 构建新的URL,保持原有的scheme和host
HttpUrl.Builder host = request.url().newBuilder()
.scheme(request.url().scheme())
.host(request.url().host());
// 使用RequestUtils.c方法生成newSign,并将其作为查询参数添加到URL中
host.addQueryParameter("newSign", RequestUtils.c(hashMap2, currentTimeMillis));
newParams2.addParams("newSign", RequestUtils.a(newParams2, currentTimeMillis)); 这个函数应该是随机生成一个newSign
然后就收hook生成newSign的代码
// hook_newSign.js
Java.perform(function () {
// 替换为 RequestUtils 类的完整包名
var RequestUtils = Java.use('com.example.utils.RequestUtils'); // 请根据实际情况修改
// Hook RequestUtils.c(Map<String, Object> params, long timestamp)
RequestUtils.c.overload('java.util.Map', 'long').implementation = function (params, timestamp) {
// 调用原始方法生成 newSign
var newSign = this.c(params, timestamp);
// 将 params 转换为字符串以便于查看
var paramsString = JSON.stringify(params);
console.log('[RequestUtils.c] newSign generated: ' + newSign);
console.log('[RequestUtils.c] Params: ' + paramsString);
return newSign;
};
// Hook RequestUtils.a(ParamsBuilder params, long timestamp)
RequestUtils.a.overload('com.example.params.ParamsBuilder', 'long').implementation = function (params, timestamp) {
var newSign = this.a(params, timestamp);
var paramsMap = params.toMap(); // 假设 ParamsBuilder 有 toMap 方法
console.log('[RequestUtils.a] newSign generated: ' + newSign);
console.log('[RequestUtils.a] Params: ' + JSON.stringify(paramsMap));
return newSign;
};
// Hook RequestUtils.b(ParamsBuilder params, long timestamp)
RequestUtils.b.overload('com.example.params.ParamsBuilder', 'long').implementation = function (params, timestamp) {
var newSign = this.b(params, timestamp);
var paramsMap = params.toMap(); // 假设 ParamsBuilder 有 toMap 方法
console.log('[RequestUtils.b] newSign generated: ' + newSign);
console.log('[RequestUtils.b] Params: ' + JSON.stringify(paramsMap));
return newSign;
};
});
System.loadLibrary(String libName) 是 Java 标准库中的一个静态方法,用于加载本地库(通常是以 .so 结尾的共享库文件)到 Java 虚拟机(JVM)中。