mcpField
F
frida-17

frida-17

github.com/yfe404開発52.6k 回インストール44 週間前に更新
リポジトリ

frida-17 について

Frida 17に対応するJavaScriptスクリプトの作成・レビュー向けガイドです。削除されたAPIと代替方法、互換性上の注意点をまとめています。

主な機能

  1. 01Frida 17 API移行ガイド
  2. 02NativePointerのメモリ操作
  3. 03Javaブリッジの例
  4. 04スクリプト互換性チェックリスト

活用シーン

  1. 01スクリプトのFrida 17対応
  2. 02削除APIの使用箇所の確認
  3. 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 スクリプトをレビューする際は、次の点を確認してください。

  1. Module.findBaseAddress() -> Process.findModuleByName().base
  2. Module.getBaseAddress() -> Process.getModuleByName().base
  3. Module.findExportByName(null, name) -> Process.findModuleByName('libc.so').findExportByName(name)
  4. Module.findExportByName(lib, name) -> Process.findModuleByName(lib).findExportByName(name)
  5. Module.enumerateExports(lib) -> Process.getModuleByName(lib).enumerateExports()
  6. Module.enumerateSymbols(lib) -> Process.getModuleByName(lib).enumerateSymbols()
  7. Memory.readU32(ptr) -> ptr.readU32()
  8. toUInt32() -> toInt32()(toUInt32 は一度も存在しません)
  9. function hexdump() -> function dumpHex()(名前が競合します)
  10. writeByteArray() での Java byte[] の使用 -> 手動で 16 進数に変換

参考資料

コメント