Description
Hi,
I'm having issues running FlowDroid inside a Java Application. The issue is that the SourcesAndSinks file does not seem to be loading, even though I know that there is content in the file (because it is printing it)
` File tempApkFile = null;
try {
System.out.println("Creating temporary APK file...");
tempApkFile = File.createTempFile("uploaded", ".apk");
Files.copy(apkFile.getInputStream(), tempApkFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
System.out.println("Temporary APK file created at: " + tempApkFile.getAbsolutePath());
// Initialize FlowDroid SetupApplication
System.out.println("Initializing FlowDroid SetupApplication...");
SetupApplication app = new SetupApplication(androidJarPath, tempApkFile.getAbsolutePath());
System.out.println("Loading SourcesAndSinks.txt from classpath...");
ClassPathResource resource = new ClassPathResource("SourcesAndSinks.txt");
InputStream inputStream = resource.getInputStream();
String sourcesAndSinksContent = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8))
.lines().collect(Collectors.joining("\n"));
if (sourcesAndSinksContent.isEmpty()) {
System.out.println("Error: SourcesAndSinks.txt is empty!");
return "Error: SourcesAndSinks.txt is empty!";
}
System.out.println("SourcesAndSinks.txt loaded successfully. Contents:");
System.out.println(sourcesAndSinksContent);
System.out.println("Loading EasyTaintWrapper with SourcesAndSinks.txt...");
EasyTaintWrapper wrapper = new EasyTaintWrapper(new File(resource.getURI()));
// Set the wrapper
app.setTaintWrapper(wrapper);
try {
Field sourcesField = wrapper.getClass().getDeclaredField("sources");
sourcesField.setAccessible(true);
Object sources = sourcesField.get(wrapper);
System.out.println("Sources: " + sources);
Field sinksField = wrapper.getClass().getDeclaredField("sinks");
sinksField.setAccessible(true);
Object sinks = sinksField.get(wrapper);
System.out.println("Sinks: " + sinks);
} catch (NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
}
System.out.println("Starting taint analysis...");
InfoflowResults results = app.runInfoflow();
System.out.println("Taint analysis completed.");
System.out.println("Results: " + results);
return results.toString();
} catch (IOException | XmlPullParserException e) {
System.err.println("Error during FlowDroid execution: " + e.getMessage());
e.printStackTrace();
return "Error during taint analysis: " + e.getMessage();
} catch (Exception e) {
System.err.println("Unexpected error: " + e.getMessage());
e.printStackTrace();
return "Unexpected error: " + e.getMessage();
} finally {
// ensure the temporary APK file is deleted
if (tempApkFile != null && tempApkFile.exists()) {
System.out.println("Deleting temporary APK file: " + tempApkFile.getAbsolutePath());
tempApkFile.delete();
}
System.out.println("Finished execution.");
}
}`
I get these two error messages:
java.lang.NoSuchFieldException: sources at java.base/java.lang.Class.getDeclaredField(Class.java:2841) at com.example.disso_demo.controller.FilesController.runFlowDroid(FilesController.java:108) at com.example.disso_demo.controller.FilesController.uploadFile(FilesController.java:55) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) at java.base/java.lang.reflect.Method.invoke(Method.java:580)
Unexpected error: No source/sink file specified for the data flow analysis java.lang.RuntimeException: No source/sink file specified for the data flow analysis at soot.jimple.infoflow.android.SetupApplication.runInfoflow(SetupApplication.java:1460) at com.example.disso_demo.controller.FilesController.runFlowDroid(FilesController.java:125) at com.example.disso_demo.controller.FilesController.uploadFile(FilesController.java:55) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) at java.base/java.lang.reflect.Method.invoke(Method.java:580)