219 lines
6.1 KiB
Markdown
219 lines
6.1 KiB
Markdown
# Frida + Objection 深度用法
|
||
|
||
## Frida 核心 API
|
||
|
||
### Java 运行时 (Android)
|
||
|
||
```javascript
|
||
Java.perform(function() {
|
||
// 获取类实例
|
||
var String = Java.use("java.lang.String");
|
||
|
||
// Hook 静态方法
|
||
var System = Java.use("java.lang.System");
|
||
System.getProperty.overload('java.lang.String').implementation = function(key) {
|
||
console.log("System.getProperty: " + key);
|
||
return this.getProperty(key);
|
||
};
|
||
|
||
// Hook 构造函数
|
||
var File = Java.use("java.io.File");
|
||
File.$init.overload('java.lang.String').implementation = function(path) {
|
||
console.log("File opened: " + path);
|
||
return this.$init(path);
|
||
};
|
||
|
||
// 枚举已加载类
|
||
Java.enumerateLoadedClasses({
|
||
onMatch: function(className) { console.log(className); },
|
||
onComplete: function() {}
|
||
});
|
||
|
||
// 修改返回值
|
||
var RootDetector = Java.use("com.app.security.RootDetector");
|
||
RootDetector.isDeviceRooted.implementation = function() {
|
||
return false;
|
||
};
|
||
});
|
||
```
|
||
|
||
### Native 层 (Android + iOS)
|
||
|
||
```javascript
|
||
// Hook 导出函数
|
||
Interceptor.attach(Module.findExportByName(null, "open"), {
|
||
onEnter: function(args) {
|
||
this.path = Memory.readUtf8String(args[0]);
|
||
},
|
||
onLeave: function(retval) {
|
||
console.log("open(" + this.path + ") = " + retval);
|
||
}
|
||
});
|
||
|
||
// Hook 任意地址(通过偏移)
|
||
var base = Module.findBaseAddress("libnative.so");
|
||
var target = base.add(0x12345);
|
||
Interceptor.attach(target, {
|
||
onEnter: function(args) {
|
||
console.log("Function called from: " + Thread.backtrace(this.context, Backtracer.ACCURATE)
|
||
.map(DebugSymbol.fromAddress).join('\n'));
|
||
}
|
||
});
|
||
|
||
// 修改返回值
|
||
Interceptor.attach(Module.findExportByName(null, "strcmp"), {
|
||
onLeave: function(retval) {
|
||
if (retval.toInt32() === 0) return; // strings equal, skip
|
||
// Force match
|
||
retval.replace(0);
|
||
}
|
||
});
|
||
```
|
||
|
||
### ObjC 运行时 (iOS)
|
||
|
||
```javascript
|
||
// Hook ObjC 方法
|
||
var hook = ObjC.classes.ViewController["- viewDidLoad"];
|
||
Interceptor.attach(hook.implementation, {
|
||
onEnter: function(args) {
|
||
console.log("viewDidLoad called");
|
||
}
|
||
});
|
||
|
||
// 枚举所有类
|
||
ObjC.enumerateLoadedClasses({
|
||
onMatch: function(className) { console.log(className); },
|
||
onComplete: function() {}
|
||
});
|
||
|
||
// 调用 ObjC 方法
|
||
var NSString = ObjC.classes.NSString;
|
||
var str = NSString.stringWithString_("Hello from Frida");
|
||
```
|
||
|
||
## Objection 命令速查
|
||
|
||
### 通用
|
||
|
||
```bash
|
||
objection -g "com.app" explore # 启动
|
||
objection -g "com.app" explore -q # 静默启动(只注入不等待)
|
||
objection patchapk --source app.apk # 自动注入 Frida Gadget
|
||
objection signapk --source app.apk # 仅签名
|
||
|
||
# 文件系统
|
||
env # 应用数据目录
|
||
ls # 列出文件
|
||
file download /path/to/file # 下载文件
|
||
file upload local.txt /remote/path # 上传文件
|
||
|
||
# SQLite
|
||
sqlite connect /path/to/db.sqlite
|
||
.tables # 列出表
|
||
select * from users; # 查询
|
||
```
|
||
|
||
### Android 专用
|
||
|
||
```bash
|
||
android root disable # 绕过 Root 检测
|
||
android sslpinning disable # 绕过 SSL Pinning
|
||
android hooking list classes # 枚举类
|
||
android hooking list class_methods com.app.Main # 枚举方法
|
||
android hooking watch class com.app.Main # Hook 所有方法
|
||
android intent launch_activity com.app.MainActivity # 启动 Activity
|
||
android heap search instances com.app.User # 堆搜索
|
||
android keystore list # Keystore 条目
|
||
```
|
||
|
||
### iOS 专用
|
||
|
||
```bash
|
||
ios jailbreak disable # 绕过越狱检测
|
||
ios sslpinning disable # 绕过 SSL Pinning
|
||
ios keychain dump # 导出 Keychain
|
||
ios nsuserdefaults get # NSUserDefaults
|
||
ios nsurlcache dump # HTTP 缓存
|
||
ios cookies get # 读取 Cookies
|
||
ios pasteboard monitor # 监听剪贴板
|
||
ios ui dump # UI 层次结构
|
||
ios plist cat Info.plist # 读取 plist
|
||
```
|
||
|
||
## 免 Root/越狱部署
|
||
|
||
### Android — Frida Gadget 注入
|
||
|
||
```bash
|
||
# 1. 解包 APK
|
||
apktool d app.apk -o app_unpacked
|
||
|
||
# 2. 下载 frida-gadget 并放入 lib 目录
|
||
cp frida-gadget-17.x.x-android-arm64.so \
|
||
app_unpacked/lib/arm64-v8a/libfrida-gadget.so
|
||
|
||
# 3. 在 smali 中注入 System.loadLibrary("frida-gadget")
|
||
# 修改主 Activity 的 onCreate 或 attachBaseContext
|
||
|
||
# 4. 重建并签名
|
||
apktool b app_unpacked -o app_patched.apk
|
||
uber-apk-signer -a app_patched.apk
|
||
|
||
# 5. Objection 自动化
|
||
objection patchapk --source app.apk --skip-resources
|
||
```
|
||
|
||
### iOS — Frida Gadget 注入
|
||
|
||
```bash
|
||
# 1. 解密 App Store IPA
|
||
python3 frida-ios-dump.py -u -p com.app.target
|
||
|
||
# 2. 注入 FridaGadget.dylib
|
||
# 修改 Mach-O Load Commands,添加 @executable_path/FridaGadget.dylib
|
||
|
||
# 3. 重签名
|
||
codesign -f -s "Apple Development" Payload/App.app
|
||
|
||
# 4. 通过 Xcode sideload 或 AltStore 安装
|
||
```
|
||
|
||
## SSL Pinning 绕过进阶
|
||
|
||
### 多层绕过(Android)
|
||
|
||
```javascript
|
||
// 1. OkHttp CertificatePinner
|
||
var CertificatePinner = Java.use("okhttp3.CertificatePinner");
|
||
CertificatePinner.check.overload('java.lang.String', 'java.util.List').implementation = function() {};
|
||
|
||
// 2. TrustManager 自定义
|
||
var TrustManagerImpl = Java.use("com.android.org.conscrypt.TrustManagerImpl");
|
||
TrustManagerImpl.verifyChain.implementation = function() { return []; };
|
||
|
||
// 3. WebView SSL Error
|
||
var SslErrorHandler = Java.use("android.webkit.SslErrorHandler");
|
||
SslErrorHandler.proceed.implementation = function() { return this.proceed(); };
|
||
|
||
// 4. Network Security Config
|
||
// 需要修改 AndroidManifest.xml → android:networkSecurityConfig="@xml/network_security_config"
|
||
// xml 中添加信任用户证书
|
||
```
|
||
|
||
### 多层绕过(iOS)
|
||
|
||
```javascript
|
||
// 1. NSURLSession
|
||
var SecTrustEvaluate = Module.findExportByName("Security", "SecTrustEvaluate");
|
||
Interceptor.replace(SecTrustEvaluate, new NativeCallback(function(trust, result) {
|
||
Memory.writeU32(result, 1); // kSecTrustResultProceed = 1
|
||
return 0; // errSecSuccess
|
||
}, 'int', ['pointer', 'pointer']));
|
||
|
||
// 2. Alamofire
|
||
// Hook ServerTrustManager.evaluate → 始终返回 success
|
||
```
|
||
|
||
Source: Frida docs, Objection wiki, OWASP MSTG
|