我正在审查一款iOS应用程序,但我没有源代码。为了更好地控制环境,我在越狱的iPad上运行该应用程序。
我想监视应用程序正在进行的API调用... 理想情况下,我想找到像Rohitab的基于MS Windows的API Monitor,但适用于iOS。
我进行了一些研究,并发现KennyTM的项目名为“Subjective-C”,似乎可以满足我的需求。实际上,我一直在使用一个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调用的另一种方法(无需源代码),请告诉我!