frida-17 について
Frida 17に対応するJavaScriptスクリプトの作成・レビュー向けガイドです。削除されたAPIと代替方法、互換性上の注意点をまとめています。
主な機能
- 01Frida 17 API移行ガイド
- 02NativePointerのメモリ操作
- 03Javaブリッジの例
- 04スクリプト互換性チェックリスト
活用シーン
- 01スクリプトのFrida 17対応
- 02削除APIの使用箇所の確認
- 03フック内でのJavaバイト配列処理
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ yfe404/ frida-17-skill --skill frida-17インストール後、Claude Code で/frida-17を入力して読み込まれたか確認します。
詳細
Frida 17 スクリプティングガイド
このスキルは、Frida 17.0.0(2025 年 5 月リリース)に対応した Frida スクリプトの作成と修正に役立ちます。
Frida 17 の破壊的変更
1. 静的モジュールメソッド — 削除
// OLD - No longer works in Frida 17
Module.findBaseAddress('libriver.so')
Module.getBaseAddress('libriver.so')
Module.findExportByName(null, 'open')
Module.findExportByName('libc.so', 'open')
Module.getExportByName(null, 'open')
Module.ensureInitialized('libc.so')
Module.enumerateExports('libc.so')
Module.enumerateSymbols('libc.so')
// NEW - Use Process and instance methods instead
var lib = Process.findModuleByName('libriver.so'); // returns Module or null
var lib = Process.getModuleByName('libriver.so'); // throws if not found
lib.base // module base address
lib.findExportByName('open') // returns address or null
lib.getExportByName('open') // throws if not found
lib.enumerateExports() // returns array
lib.enumerateSymbols() // returns array
2. 静的メモリメソッド — 削除
// OLD - No longer works
Memory.readU32(ptr)
Memory.writeU32(ptr, value)
// NEW - Use NativePointer instance methods
ptr.readU32()
ptr.writeU32(value)
3. 従来の列挙 API — 削除
// OLD - Callback style removed
Process.enumerateModules({ onMatch: fn, onComplete: fn })
Process.enumerateModulesSync()
// NEW - Returns array directly
Process.enumerateModules()
4. 予約済み関数名 — 上書きしないでください
次の名前は Frida の組み込み関数です。これらの名前でカスタム関数を定義すると、次のエラーが発生します。
TypeError: cannot define variable 'hexdump'
予約済みの名前:
hexdump— カスタムの 16 進ダンプ関数には、代わりにdumpHexを使用しますptr— ポインターコンストラクターの省略形NULL— null ポインター定数
// BAD - conflicts with built-in
function hexdump(ptr, len) { ... }
// GOOD - use different name
function dumpHex(ptr, len) { ... }
NativePointer メソッド(Frida 17 で有効)
変換:
toInt32()— 符号付き 32 ビット整数にキャストしますtoNumber()— JavaScript の数値に変換しますtoString([radix])— 文字列に変換します
利用できません:
toUInt32()— 存在しません。2^31 未満のサイズにはtoInt32()を使用します
メモリの読み取り:
readU8()、readS8()、readU16()、readS16()readU32()、readS32()、readU64()、readS64()readByteArray(length)— ArrayBuffer を返しますreadPointer()、readCString()、readUtf8String()
メモリへの書き込み:
writeU8(value)、writeS8(value)などwriteByteArray(bytes)— bytes は ArrayBuffer または JS 配列である必要がありますwritePointer(ptr)、writeUtf8String(str)
ポインター演算:
add(rhs)、sub(rhs)、and(rhs)、or(rhs)、xor(rhs)shr(n)、shl(n)、not()isNull()、equals(rhs)、compare(rhs)
Java Bridge API(Frida 17 でも変更なし)
Java.perform(function() {
var MyClass = Java.use('com.example.MyClass');
// Hook with overload
MyClass.myMethod.overload('int', 'java.lang.String').implementation = function(a, b) {
console.log('Called with: ' + a + ', ' + b);
// Call original
return this.myMethod.overload('int', 'java.lang.String').call(this, a, b);
};
// Hook all overloads
MyClass.myMethod.overloads.forEach(function(overload) {
overload.implementation = function() {
return overload.apply(this, arguments);
};
});
});
Java byte[] の処理:
Java のバイト配列は Memory.alloc().writeByteArray() に直接渡せません。
手動で変換します。
// BAD - throws "expected a buffer-like object"
var hex = dumpHex(Memory.alloc(javaByteArray.length).writeByteArray(javaByteArray), len);
// GOOD - iterate and convert
var hex = "";
for (var i = 0; i < javaByteArray.length; i++) {
hex += ("0" + (javaByteArray[i] & 0xff).toString(16)).slice(-2);
}
Frida 17 の一般的なパターン
ライブラリの読み込みを待つ
function waitForLibrary(libName, callback) {
var lib = Process.findModuleByName(libName);
if (lib) {
callback(lib.base);
return;
}
var pollInterval = setInterval(function() {
var lib = Process.findModuleByName(libName);
if (lib) {
clearInterval(pollInterval);
callback(lib.base);
}
}, 500);
}
libc 関数のフック
var libc = Process.findModuleByName('libc.so');
var open = libc ? libc.findExportByName('open') : null;
if (open) {
Interceptor.attach(open, {
onEnter: function(args) {
console.log('open(' + args[0].readCString() + ')');
}
});
}
カスタムの 16 進ダンプ関数
function dumpHex(ptr, len) {
if (!ptr || ptr.isNull()) return 'null';
try {
var bytes = ptr.readByteArray(len);
if (!bytes) return 'null';
var arr = new Uint8Array(bytes);
var hex = '';
for (var i = 0; i < arr.length; i++) {
hex += ('0' + arr[i].toString(16)).slice(-2);
}
return hex;
} catch (e) {
return 'error: ' + e;
}
}
Frida 17 との互換性チェックリスト
Frida スクリプトをレビューする際は、次の点を確認してください。
-
Module.findBaseAddress()->Process.findModuleByName().base -
Module.getBaseAddress()->Process.getModuleByName().base -
Module.findExportByName(null, name)->Process.findModuleByName('libc.so').findExportByName(name) -
Module.findExportByName(lib, name)->Process.findModuleByName(lib).findExportByName(name) -
Module.enumerateExports(lib)->Process.getModuleByName(lib).enumerateExports() -
Module.enumerateSymbols(lib)->Process.getModuleByName(lib).enumerateSymbols() -
Memory.readU32(ptr)->ptr.readU32() -
toUInt32()->toInt32()(toUInt32 は一度も存在しません) -
function hexdump()->function dumpHex()(名前が競合します) -
writeByteArray()での Java byte[] の使用 -> 手動で 16 進数に変換
参考資料
コメント
Markdown 対応