diff --git a/jadx-gui/src/main/java/jadx/gui/plugins/quark/QuarkReportData.java b/jadx-gui/src/main/java/jadx/gui/plugins/quark/QuarkReportData.java index 9514561078881d1dfb5755e6505264f04477d692..eae4c9c6758edf7f0c8e2bf89805709fd669a348 100644 --- a/jadx-gui/src/main/java/jadx/gui/plugins/quark/QuarkReportData.java +++ b/jadx-gui/src/main/java/jadx/gui/plugins/quark/QuarkReportData.java @@ -10,6 +10,7 @@ import jadx.core.utils.Utils; @SuppressWarnings("MemberName") public class QuarkReportData { + public static class Crime { public String crime; public String confidence; @@ -18,6 +19,23 @@ public class QuarkReportData { List native_api; List combination; List> register; + + public int parseConfidence() { + return Integer.parseInt(confidence.replace("%", "")); + } + + @Override + public String toString() { + final StringBuffer sb = new StringBuffer("Crime{"); + sb.append("crime='").append(crime).append('\''); + sb.append(", confidence='").append(confidence).append('\''); + sb.append(", permissions=").append(permissions); + sb.append(", native_api=").append(native_api); + sb.append(", combination=").append(combination); + sb.append(", register=").append(register); + sb.append('}'); + return sb.toString(); + } } public static class Method { @@ -46,4 +64,22 @@ public class QuarkReportData { String threat_level; int total_score; List crimes; + + public void validate() { + if (crimes == null) { + throw new RuntimeException("Invalid data: \"crimes\" list missing"); + } + for (Crime crime : crimes) { + if (crime.confidence == null) { + throw new RuntimeException("Confidence value missing: " + crime); + } + try { + crime.parseConfidence(); + } catch (Exception e) { + throw new RuntimeException("Invalid crime entry: " + crime); + } + } + + } + } diff --git a/jadx-gui/src/main/java/jadx/gui/plugins/quark/QuarkReportNode.java b/jadx-gui/src/main/java/jadx/gui/plugins/quark/QuarkReportNode.java index 43c295ada1ef51eca55006ad9ff6513c76dc84e7..91cb2ce94b18f2bec1e16051725410c826dbfbf3 100644 --- a/jadx-gui/src/main/java/jadx/gui/plugins/quark/QuarkReportNode.java +++ b/jadx-gui/src/main/java/jadx/gui/plugins/quark/QuarkReportNode.java @@ -1,5 +1,6 @@ package jadx.gui.plugins.quark; +import java.io.BufferedReader; import java.nio.file.Files; import java.nio.file.Path; @@ -33,12 +34,12 @@ public class QuarkReportNode extends JNode { private static final ImageIcon ICON = UiUtils.openSvgIcon("ui/quark"); - private final Path apkFile; + private final Path reportFile; private ICodeInfo errorContent; - public QuarkReportNode(Path apkFile) { - this.apkFile = apkFile; + public QuarkReportNode(Path reportFile) { + this.reportFile = reportFile; } @Override @@ -59,7 +60,11 @@ public class QuarkReportNode extends JNode { @Override public ContentPanel getContentPanel(TabbedPane tabbedPane) { try { - QuarkReportData data = GSON.fromJson(Files.newBufferedReader(apkFile), QuarkReportData.class); + QuarkReportData data; + try (BufferedReader reader = Files.newBufferedReader(reportFile)) { + data = GSON.fromJson(reader, QuarkReportData.class); + } + data.validate(); return new QuarkReportPanel(tabbedPane, this, data); } catch (Exception e) { LOG.error("Quark report parse error", e); diff --git a/jadx-gui/src/main/java/jadx/gui/plugins/quark/QuarkReportPanel.java b/jadx-gui/src/main/java/jadx/gui/plugins/quark/QuarkReportPanel.java index 5d6800608862327b801307e45625552aed3867e5..8507cc39f7040daf232665d2bba4f46f3a615807 100644 --- a/jadx-gui/src/main/java/jadx/gui/plugins/quark/QuarkReportPanel.java +++ b/jadx-gui/src/main/java/jadx/gui/plugins/quark/QuarkReportPanel.java @@ -70,7 +70,7 @@ public class QuarkReportPanel extends ContentPanel { } private void prepareData() { - data.crimes.sort(Comparator.comparingInt(c -> -Integer.parseInt(c.confidence.replace("%", "")))); + data.crimes.sort(Comparator.comparingInt(c -> -c.parseConfidence())); } private void initUI() { @@ -290,7 +290,7 @@ public class QuarkReportPanel extends ContentPanel { } return new MethodTreeNode(javaMethod); } catch (Exception e) { - LOG.error("Failed to parse method descriptor string", e); + LOG.error("Failed to parse method descriptor string: {}", descr, e); return new TextTreeNode(descr); } }