frida-scripts
Frida 动态插桩常用脚本速查(供安全研究/自有应用分析)。当需要用 frida hook 安卓应用、绕过 SSL Pinning(证书校验)、绕过 root/模拟器/调试检测、hook Java/native 函数改返回值、dump 内存/参数、跟踪加密函数调用时使用。
소스 정보
- 저장소
- xiamiya/mHook
- 최근 소스 활동
- 2026년 8월 6일 10:08
- 감지된 SKILL.md 언어
- 중국어
- 스타
- 95
- 포크
- 23
설치 방법
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
소스 파일 검토
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
SKILL.md 표시 중
SKILL.md
소스 지침 · 읽기 전용 미리보기- name
- frida-scripts
- description
- Frida 动态插桩常用脚本速查(供安全研究/自有应用分析)。当需要用 frida hook 安卓应用、绕过 SSL Pinning(证书校验)、绕过 root/模拟器/调试检测、hook Java/native 函数改返回值、dump 内存/参数、跟踪加密函数调用时使用。
# Frida 动态插桩脚本速查
面向对**自有或已授权**应用的动态分析、调试与安全研究。frida 通过运行时插桩,在不改包的情况下 hook 函数、改行为、dump 数据,非常适合先用 frida 验证思路,再落地成永久 patch。
## 前置
- 设备需能跑 frida-server(root 设备直接跑;或用 frida-gadget 注入到重打包后的 APK)。
- 电脑端:`frida -U -f 包名 -l 脚本.js`(spawn 模式)或 `frida -U 包名 -l 脚本.js`(attach)。
- 无 root 时可用 objection / frida-gadget 方案。
## 一、Hook Java 方法
### 改方法返回值(最常用:VIP/登录/校验返回 true)
```javascript
Java.perform(function () {
var Target = Java.use('com.example.VipManager');
// 无重载
Target.isVip.implementation = function () {
console.log('[+] isVip called -> forced true');
return true;
};
// 有重载时用 overload 指定参数类型
Target.check.overload('java.lang.String').implementation = function (s) {
console.log('[+] check(' + s + ') -> true');
return true;
};
});
```
### 打印方法参数和调用栈
```javascript
Java.perform(function () {
var C = Java.use('com.example.Crypto');
C.encrypt.implementation = function (data) {
console.log('[encrypt] input=' + data);
var ret = this.encrypt(data);
console.log('[encrypt] output=' + ret);
// 调用栈
console.log(Java.use('android.util.Log').getStackTraceString(
Java.use('java.lang.Exception').$new()));
return ret;
};
});
```
## 二、绕过 SSL Pinning(抓包必备)
```javascript
// 通杀思路:hook 常见校验点。实战优先用社区维护的通杀脚本(如 frida 官方 codeshare 的
// "universal android ssl pinning bypass"),这里给核心思路:
Java.perform(function () {
// 1) 干掉 TrustManager 校验
var X509TrustManager = Java.use('javax.net.ssl.X509TrustManager');
var SSLContext = Java.use('javax.net.ssl.SSLContext');
var TrustManager = Java.registerClass({
name: 'com.bypass.TrustAll',
implements: [X509TrustManager],
methods: {
checkClientTrusted: function () {},
checkServerTrusted: function () {},
getAcceptedIssuers: function () { return []; }
}
});
var init = SSLContext.init.overload(
'[Ljavax.net.ssl.KeyManager;', '[Ljavax.net.ssl.TrustManager;',
'java.security.SecureRandom');
init.implementation = function (km, tm, sr) {
init.call(this, km, [TrustManager.$new()], sr);
};
// 2) OkHttp CertificatePinner.check 直接放行
try {
var CP = Java.use('okhttp3.CertificatePinner');
CP.check.overload('java.lang.String', 'java.util.List').implementation = function () {};
} catch (e) {}
});
```
> 实战建议:直接用社区通杀脚本(覆盖 OkHttp/Conscrypt/TrustKit/Flutter 等),比手写全。
## 三、绕过 Root / 模拟器 / 调试检测
```javascript
Java.perform(function () {
// 常见:hook 检测方法返回 false
var names = ['isRooted', 'checkRoot', 'isEmulator', 'isDebuggerConnected'];
// 具体类名要先逆向定位,这里示意
var Detector = Java.use('com.example.security.Detector');
names.forEach(function (m) {
if (Detector[m]) {
Detector[m].implementation = function () { return false; };
}
});
// 干掉 Debug.isDebuggerConnected
var Debug = Java.use('android.os.Debug');
Debug.isDebuggerConnected.implementation = function () { return false; };
});
```
## 四、Hook native 函数(.so 里的逻辑)
```javascript
// hook 导出函数
var addr = Module.findExportByName('libnative.so', 'check_license');
Interceptor.attach(addr, {
onEnter: function (args) { this.a0 = args[0]; },
onLeave: function (retval) {
console.log('[check_license] ret=' + retval);
retval.replace(ptr(1)); // 强制返回 1
}
});
// 未导出函数用 模块基址 + 偏移
var base = Module.findBaseAddress('libnative.so');
Interceptor.attach(base.add(0x1234), { /* ... */ });
```
## 五、常见工作流
1. `frida-trace -U -j 'com.example.*!*check*'` 快速定位可疑方法
2. hook 打印参数/返回值/调用栈,看清逻辑
3. 改返回值验证效果(够用就 frida 常驻;要永久就落地成 so/smali patch)
4. 抓包场景:SSL Pinning bypass 脚本 + 系统代理/证书
## 与永久 patch 的关系
frida 是**运行时**改,重启失效、需 frida 环境。验证思路正确后,用 `reverse-patch-techniques` 的手法把改动落地到 so(SOMCP)或 smali(MT),做成永久 patch。
## 边界
用于自有/授权应用的安全研究、调试、学习。不协助破解他人付费软件牟利或未授权侵权。
GitHub에서 보기