Files
revkit/tools/find_appboot.js
T
tkgstratorandClaude Opus 4.6 a849198fd0 feat(tools): MSLクライアント実装と解析ツールを追加
- src/netflix_msl/: Python MSLクライアント (鍵交換, 暗号化/復号, マニフェスト取得)
- tools/run.py: Fridaフックランナー (@@LOG@@パース, JSONL保存, crypto表示改善)
- tools/find_appboot.js: appboot関連シンボル検索
- tools/check_tweak.js: Tweakロード状態確認
- tools/dump_rsa_key.py, verify_key.py 等の解析ユーティリティ

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 02:07:22 +00:00

92 lines
3.4 KiB
JavaScript

// appboot.netflix.com 関連のシンボル・文字列・フレームワークを調査
//
// objection 経由で spawn (pause 状態で起動):
// objection -N -h 192.168.0.49 -n com.netflix.Netflix -s start
//
// objection プロンプトで:
// import tools/find_appboot.js
// %resume
// 即時実行 (pause 状態で実行するため遅延不要)
console.log("[*] Searching for appboot references...\n");
var modules = Process.enumerateModules();
console.log("[*] Loaded modules: " + modules.length);
// Netflix 関連モジュールのみ
var nfModules = modules.filter(function (m) {
var n = m.name;
return n.indexOf("Netflix") !== -1 ||
n.indexOf("NF") !== -1 ||
n.indexOf("Argo") !== -1 ||
n.indexOf("Osprey") !== -1 ||
n.indexOf("Gibbon") !== -1 ||
n.indexOf("Nbp") !== -1 ||
n.indexOf("Msl") !== -1 ||
n.indexOf("Bolt") !== -1;
});
console.log("\n[*] Netflix-related modules (" + nfModules.length + "):");
nfModules.forEach(function (m) {
console.log(" " + m.name + " @ " + m.base + " (" + m.size + " bytes)");
});
// Netflix モジュール内のみで "appboot" を検索
console.log("\n[*] Scanning Netflix modules for 'appboot'...");
nfModules.forEach(function (m) {
try {
var ranges = m.enumerateRanges("r--");
ranges.forEach(function (range) {
try {
var results = Memory.scanSync(range.base, range.size, "61 70 70 62 6f 6f 74"); // "appboot"
results.forEach(function (match) {
try {
var str = match.address.readUtf8String(200);
console.log(" [" + m.name + "] @ " + match.address + ": " + str.split("\0")[0]);
} catch (e) {}
});
} catch (e) {}
});
} catch (e) {}
});
// ObjC クラスで appboot 関連を検索
if (ObjC.available) {
console.log("\n[*] ObjC classes matching 'appboot' or 'boot'...");
var classNames = Object.keys(ObjC.classes);
classNames.forEach(function (name) {
var lower = name.toLowerCase();
if (lower.indexOf("appboot") !== -1 ||
(lower.indexOf("boot") !== -1 &&
(name.indexOf("NF") !== -1 || name.indexOf("Netflix") !== -1 || name.indexOf("Argo") !== -1))) {
console.log(" Class: " + name);
try {
ObjC.classes[name].$ownMethods.forEach(function (method) {
console.log(" " + method);
});
} catch (e) {}
}
});
// SSL pinning / certificate 関連クラス
console.log("\n[*] ObjC classes matching pinning/cert/trust/ssl...");
classNames.forEach(function (name) {
if ((name.indexOf("NF") === 0 || name.indexOf("Netflix") !== -1 || name.indexOf("Argo") !== -1) &&
(name.toLowerCase().indexOf("pin") !== -1 ||
name.toLowerCase().indexOf("cert") !== -1 ||
name.toLowerCase().indexOf("trust") !== -1 ||
name.toLowerCase().indexOf("ssl") !== -1 ||
name.toLowerCase().indexOf("tls") !== -1 ||
name.toLowerCase().indexOf("security") !== -1)) {
console.log(" Class: " + name);
try {
ObjC.classes[name].$ownMethods.forEach(function (method) {
console.log(" " + method);
});
} catch (e) {}
}
});
}
console.log("\n[*] Done.");