Skip to content

Commit fdd4bf4

Browse files
committed
fix #2 #3 #5
1 parent b8d65ba commit fdd4bf4

14 files changed

+56
-14
lines changed
Binary file not shown.
Binary file not shown.

.gradle/7.4/fileHashes/fileHashes.bin

100 Bytes
Binary file not shown.
0 Bytes
Binary file not shown.
782 Bytes
Binary file not shown.
Binary file not shown.

.gradle/file-system.probe

0 Bytes
Binary file not shown.

README.md

+10-4
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,10 @@ Options:
1717
--allow-phantom Allow phantom classes.
1818
-d <directory> Specify where to generate output fact files.
1919
-i <archive> Find classes in <archive>.
20+
-i-dir <directory> Find classes/jar in <directory>.
2021
-l <archive> Find library classes in <archive>.
2122
-ld <archive> Find dependency classes in <archive>.
23+
-ld-dir <directory> Find dependency classes/jar in <directory>.
2224
-lsystem Find classes in default system classes.
2325
--facts-subset <subset> Produce facts only for a subset of the given classes [APP, APP_N_DEPS, PLATFORM].
2426
--ignore-factgen-errors Continue with the analysis even if fact generation fails.
@@ -50,7 +52,11 @@ java -jar soot-fact-generator.jar -i input.jar -l /usr/lib/jvm/java-8-oracle/jr
5052
其中
5153
- `-i` 指定待分析的jar包
5254
- `-l` 指定依赖库
53-
- `--generate-jimple` 表示生成中间语言jimple
54-
- `--allow-phantom` 大概是允许解析依赖不存在的类
55-
- `--full` 表示对所有class进行解析
56-
- `-d` 指定输出目录
55+
- `--generate-jimple` 表示生成中间语言jimple
56+
- `--allow-phantom` 大概是允许解析依赖不存在的类
57+
- `--full` 表示对所有class进行解析
58+
- `-d` 指定输出目录
59+
60+
另外还额外增加了
61+
- `-i-dir` 指定待分析的jar目录
62+
- `-ld-dir` 指定待分析的依赖目录

src/main/java/org/clyze/doop/common/BasicJavaSupport.java

+14-7
Original file line numberDiff line numberDiff line change
@@ -86,20 +86,27 @@ else if ((isJar || isAar || isZip || isWar) && entryName.endsWith(".xml")) {
8686
XMLFactGenerator.processFile(xmlTmpFile, db, "", parameters._debug);
8787
}
8888
};
89+
8990
if (isWar) {
9091
System.out.println("Processing WAR: " + filename);
9192
// Process WAR inputs.
9293
parameters.processFatArchives(tmpDirs);
93-
}
94-
95-
if (isSpringBoot) {
94+
}else if (isSpringBoot) {
9695
System.out.println("Processing springBoot: " + filename);
9796
parameters.processSpringBootArchives(tmpDirs, filename);
98-
}
99-
100-
if (isJar || isApk || isZip || isWar)
97+
parameters.getInputs().forEach(file -> {
98+
try{
99+
// System.out.println(file);
100+
artScanner.processArchive(file, classSet::add, gProc);
101+
}catch (Exception e){
102+
e.printStackTrace();
103+
}
104+
});
105+
artScanner.processArchive(filename, classSet::add, gProc);
106+
}else if (isJar || isApk || isZip || isWar)
107+
{
101108
artScanner.processArchive(filename, classSet::add, gProc);
102-
else if (isClass) {
109+
} else if (isClass) {
103110
File f = new File(filename);
104111
try (FileInputStream fis = new FileInputStream(f)) {
105112
artScanner.processClass(fis, f, classSet::add);

src/main/java/org/clyze/doop/common/Parameters.java

+18-2
Original file line numberDiff line numberDiff line change
@@ -161,13 +161,13 @@ protected int processNextArg(String[] args, int i) throws DoopErrorCodeException
161161
i = shift(args, i);
162162
_inputs.add(args[i]);
163163
break;
164-
case "-idir":
164+
case "-i-dir":
165165
i = shift(args, i);
166166
File inputDir = new File(args[i]);
167167
File[] files = inputDir.listFiles();
168168
if (files != null) {
169169
for (File file : files) {
170-
if (file.getName().endsWith(".jar")) {
170+
if (file.getName().endsWith(".jar") || file.getName().endsWith(".class")) {
171171
try{
172172
_inputs.add(file.getCanonicalPath());
173173
}catch (Exception e){
@@ -191,6 +191,22 @@ protected int processNextArg(String[] args, int i) throws DoopErrorCodeException
191191
i = shift(args, i);
192192
_dependencies.add(args[i]);
193193
break;
194+
case "-ld-dir":
195+
i = shift(args, i);
196+
File dependencyDir = new File(args[i]);
197+
File[] dependencies = dependencyDir.listFiles();
198+
if (dependencies != null) {
199+
for (File file : dependencies) {
200+
if (file.getName().endsWith(".jar") || file.getName().endsWith(".class")) {
201+
try{
202+
_dependencies.add(file.getCanonicalPath());
203+
}catch (Exception e){
204+
e.printStackTrace();
205+
}
206+
}
207+
}
208+
}
209+
break;
194210
case "-d":
195211
i = shift(args, i);
196212
setOutputDir(args[i]);

src/main/java/org/clyze/doop/common/XMLFactGenerator.java

+3
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,9 @@ public static void processFile(File xmlFile, Database db, String topDir, boolean
9191

9292
private void parse(boolean debug) throws IOException, SAXException, ParserConfigurationException {
9393
SAXParserFactory spf = SAXParserFactory.newInstance();
94+
spf.setFeature("http://xml.org/sax/features/external-general-entities", false);
95+
spf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
96+
spf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
9497
spf.setNamespaceAware(true);
9598
XMLReader xmlReader = spf.newSAXParser().getXMLReader();
9699
xmlReader.setContentHandler(this);

src/main/java/org/clyze/doop/soot/BasicJavaSupport_Soot.java

+1
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ private static void addBasicClasses(Scene scene) {
7373
* input fact generation thus leading to different analysis results
7474
*/
7575
scene.addBasicClass("sun.net.www.protocol.ftp.FtpURLConnection", SootClass.HIERARCHY);
76+
scene.addBasicClass("io.netty.channel.ChannelFutureListener", SootClass.HIERARCHY);
7677
scene.addBasicClass("javax.crypto.extObjectInputStream");
7778
/*
7879
* For simulating the FileSystem class, we need the implementation

src/main/java/org/clyze/doop/soot/Main.java

+8
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,11 @@ public static void main(String[] args) throws Exception {
3535
return;
3636
}
3737

38+
if ((args.length == 1) && (args[0].equals("--help") || args[0].equals("-h"))){
39+
SootParameters.showHelp();
40+
return;
41+
}
42+
3843
try {
3944
produceFacts(args);
4045
} catch (Exception ex) {
@@ -187,7 +192,10 @@ private static void invokeSoot(SootParameters sootParameters, Database db, Set<S
187192
Options.v().set_main_class(mainClass);
188193

189194
if (sootParameters._mode == SootParameters.Mode.FULL)
195+
{
190196
Options.v().set_full_resolver(true);
197+
Options.v().set_whole_program(true);
198+
}
191199

192200
if (sootParameters._allowPhantom)
193201
Options.v().set_allow_phantom_refs(true);

src/main/java/org/clyze/doop/soot/SootParameters.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -90,9 +90,10 @@ static void showHelp() {
9090
System.err.println(" --allow-phantom Allow phantom classes.");
9191
System.err.println(" -d <directory> Specify where to generate output fact files.");
9292
System.err.println(" -i <archive> Find classes in <archive>.");
93-
System.err.println(" -idir <directory> Find classes/jar in <directory>.");
93+
System.err.println(" -i-dir <directory> Find classes/jar in <directory>.");
9494
System.err.println(" -l <archive> Find library classes in <archive>.");
9595
System.err.println(" -ld <archive> Find dependency classes in <archive>.");
96+
System.err.println(" -ld-dir <directory> Find dependency classes/jar in <directory>.");
9697
System.err.println(" -lsystem Find classes in default system classes.");
9798
System.err.println(" --facts-subset <subset> Produce facts only for a subset of the given classes " + Arrays.asList(Parameters.FactsSubSet.values()) + ".");
9899
System.err.println(" --ignore-factgen-errors Continue with the analysis even if fact generation fails.");

0 commit comments

Comments
 (0)