ソースコードを持っていない iOS アプリケーションのレビューを行っています。環境をより細かく制御するために、ジェイルブレイクされた iPad でアプリケーションを実行しています。
アプリケーションが行っている API 呼び出しを監視できるようにしたいです...理想的には、Rohitab の MS Windows ベースのAPI Monitorのようなものを見つけたいのですが、代わりに iOS 用です。
私はいくつかの調査を行い、「Subjective-C」と呼ばれる KennyTM によるプロジェクトを見つけました。私は実際に cycript スクリプトを、Google コード サイト で入手できる libsubjc.dylibとともに使用しています。
ただし、アプリの呼び出しのログ記録を正しく開始する方法を理解できませんでした。Subjective-C (libsubjc) の作成者によって作成された cycript スクリプトへのリンクは次のとおりです。以下のスクリプトも貼り付けました。
/*
libsubjc.cy ... Use libsubjc in cycript.
Copyright (C) 2009 KennyTM~ <kennytm@gmail.com>
[...GPL3...]
*/
dlopen("libsubjc.dylib", 10);
if (!dlfun) {
function dlfun(fn, encoding, altname) { var f = new Functor(dlsym(RTLD_DEFAULT, fn), encoding); if (f) this[altname || fn] = f; return f; }
}
dlfun("SubjC_start", "v");
dlfun("SubjC_end", "v");
dlfun("SubjC_set_file", "v^{sFILE=}");
dlfun("SubjC_set_maximum_depth", "vI");
dlfun("SubjC_set_print_arguments", "vB");
dlfun("SubjC_set_print_return_value", "vB");
dlfun("SubjC_set_print_timestamp", "vB");
SubjC_Deny = 0, SubjC_Allow = 1;
dlfun("SubjC_clear_filters", "v");
dlfun("SubjC_filter_method", "vi#:");
dlfun("SubjC_filter_class", "vi#");
dlfun("SubjC_filter_selector", "vi:");
dlfun("SubjC_default_filter_type", "vi");
dlfun("SubjC_filter_class_prefixes", "viI^*");
dlfun("SubjC_filter_class_prefix", "vi*");
dlfun("fopen", "^{sFILE=}**");
dlfun("fclose", "i^{sFILE=}");
libsubjc cycript スクリプトをロードし、SubjC_start 関数を呼び出すことができました。ただし、 dlfun("SubjC_set_file", "v^{sFILE=}");で始まる行の入力ファイルハンドルを指定するにはどうすればよいですか?
「libsubjc.cy」cycript スクリプトを Subjective-C ライブラリ (libsubjc.dylib) で正常に使用して、アプリの API 呼び出しを監視した人はいますか?
アップデート
これにより、少なくとも出力ファイルが生成されますが、出力ファイル (/tmp/test.txt) 内に情報が入力されていません。
cycript -p SpringBoard libsubjc.cy; cycript -p SpringBoard
f = fopen("/tmp/test.txt", "w");
SubjC_set_file(f);
SubjC_set_maximum_depth(15);
SubjC_set_print_arguments(YES);
SubjC_set_print_return_value(YES);
SubjC_set_print_timestamp(YES);
SubjC_default_filter_type(SubjC_Deny);
SubjC_start();
//do stuff
SubjC_end();
または、ジェイルブレイクされたデバイスで API 呼び出し (ソース コードなし) を監視する別の方法を誰かが知っている場合は、お知らせください。