- Notifications
You must be signed in to change notification settings - Fork 310
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)