Open firmianay opened 9 months ago
另外有些疑问 1、EngineConfig.json5里定义的这些库,在初始化soot时好像不会被排除?IgnoreList和Library的区别是什么? 2、搜到了flowdroid的写法,把它的excludeList复制过来怎么样? 3、我使用PackManager.v().writeOutput()的时候还是会输出这些已经set_exclude的库,有什么办法减少输出?
IgnoreList: {
"PackageName": [
"com.meituan.robust",
"kotlin.jvm.internal.Intrinsics",
"com.bytedance.frameworks.apm.trace.MethodCollector"
],
"MethodName": [],
"MethodSignature": []
},
Library: {
"Package": [
"java.",
"sun.",
"javax.",
fun setExclude() {
// reduce time
val excludeList = ArrayList<String>()
excludeList.add("java.*")
excludeList.add("org.*")
excludeList.add("sun.*")
// excludeList.add("android.*");
// excludeList.add("androidx.*");
Options.v().set_exclude(excludeList)
// do not load body in exclude list
Options.v().set_no_bodies_for_excluded(true)
允许调试多条规则,当指定为“all”时表示全部
![]()
不建议调试多条规则,调试规则的时候,会把指针指向关系表和数据流向关系表输出到文件中:
另外有些疑问 1、EngineConfig.json5里定义的这些库,在初始化soot时好像不会被排除?IgnoreList和Library的区别是什么? 2、搜到了flowdroid的写法,把它的excludeList复制过来怎么样? 3、我使用PackManager.v().writeOutput()的时候还是会输出这些已经set_exclude的库,有什么办法减少输出?
IgnoreList: { "PackageName": [ "com.meituan.robust", "kotlin.jvm.internal.Intrinsics", "com.bytedance.frameworks.apm.trace.MethodCollector" ], "MethodName": [], "MethodSignature": [] }, Library: { "Package": [ "java.", "sun.", "javax.",
fun setExclude() { // reduce time val excludeList = ArrayList<String>() excludeList.add("java.*") excludeList.add("org.*") excludeList.add("sun.*") // excludeList.add("android.*"); // excludeList.add("androidx.*"); Options.v().set_exclude(excludeList) // do not load body in exclude list Options.v().set_no_bodies_for_excluded(true)
主要用于SSA生成的时候,避免处理这部分代码,也避免指针分析这部分代码。 soot加载花费的时间,和整体时间相比,可以忽略不计。
不建议调试多条规则,调试规则的时候,会把指针指向关系表和数据流向关系表输出到文件中:
- 这两个文件可能非常大
- 他们的名字是固定的 所以调试多条规则,意义并不大。
名字固定不是问题,这个只是现有功能的增强,每条规则输出到自己的子目录
是这么个需求,appshark运行在服务器上,有几百个测试样本,就想每个apk一次性跑完所有规则,把调试信息都保存下来,文件大点无所谓,然后第二天上班直接把数据拿下来分析
现在没解决的问题是第二个commit,把jimple打印下来,写函数签名的时候能对照着看,比如某条链为什么是断的,这个打印下来确实很多很大,就想怎么把库给排除掉,set_exclude貌似是不行的。看了soot的代码,writeOutput()打印的其实是applicationClasses(带参数的writeOutput是protect方法,没法直接调用),所以想请教这个问题
public void writeOutput() {
switch (Options.v().output_format()) {
default:
writeOutput(reachableClasses());
protected void writeOutput(Iterator<SootClass> classes) {...}
private Iterator<SootClass> reachableClasses() {
return Scene.v().getApplicationClasses().snapshotIterator();
}
/**
* Returns a chain of the application classes in this scene. These classes are the ones which can be freely analysed &
* modified.
*/
public Chain<SootClass> getApplicationClasses() {
return applicationClasses;
}
更新:我发现setLibraryClass()好像可以将某个类从applicationClasses里删掉,然后设置成libraryClasses。就是不知道对后续的分析有没有影响。。。
/** Makes this class a library class. */
public void setLibraryClass() {
if (isLibraryClass()) {
return;
}
Chain<SootClass> c = Scene.v().getContainingChain(this);
if (c != null) {
c.remove(this);
}
Scene.v().getLibraryClasses().add(this);
isPhantom = false;
}
Chain<SootClass> getContainingChain(SootClass c) {
if (c.isApplicationClass()) {
return getApplicationClasses();
} else if (c.isLibraryClass()) {
return getLibraryClasses();
} else if (c.isPhantomClass()) {
return getPhantomClasses();
} else {
return null;
}
}
IgnoreList和Library的区别是什么? IgnoreList主要是针对robust这种到处存在的代码,在指针分析的时候,直接忽略,认为这些调用不存在。 Library 是认为被调用的对象是库函数,不跟进去分析,也不生成SSA
掌握了Java反射的基本用法哈哈
这部分完成,师傅可以看一下
允许调试多条规则,当指定为“all”时表示全部