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 f3f1e5f03..ff5a32fdc 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 @@ -15,7 +15,7 @@ public class QuarkReportData { public List permissions; List native_api; - List combination; + List combination; List> register; } 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 a18871a30..f7e2687e8 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 @@ -56,21 +56,24 @@ public class QuarkReportNode extends JNode { @Override public ContentPanel getContentPanel(TabbedPane tabbedPane) { - QuarkReportData data; try { - data = GSON.fromJson(Files.newBufferedReader(apkFile), QuarkReportData.class); + QuarkReportData data = GSON.fromJson(Files.newBufferedReader(apkFile), QuarkReportData.class); + return new QuarkReportPanel(tabbedPane, this, data); } catch (Exception e) { LOG.error("Quark report parse error", e); StringEscapeUtils.Builder builder = StringEscapeUtils.builder(StringEscapeUtils.ESCAPE_HTML4); builder.append("

"); builder.escape("Quark analysis failed!"); - builder.append("

");
+			builder.append("");
+			builder.append("

"); + builder.append("Error: ").escape(e.getMessage()); + builder.append("

"); + builder.append("
");
 			builder.escape(ExceptionUtils.getStackTrace(e));
 			builder.append("
"); errorContent = builder.toString(); return new HtmlPanel(tabbedPane, this); } - return new QuarkReportPanel(tabbedPane, this, data); } @Override 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 78decd177..7fff7076c 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 @@ -8,6 +8,7 @@ import java.awt.event.MouseEvent; import java.util.Comparator; import java.util.Enumeration; import java.util.IdentityHashMap; +import java.util.List; import java.util.Map; import javax.swing.BorderFactory; @@ -238,20 +239,25 @@ public class QuarkReportPanel extends ContentPanel { if (Utils.notEmpty(crime.permissions)) { add(new TextTreeNode("Permissions: " + Strings.join(", ", crime.permissions))); } - if (Utils.notEmpty(crime.combination)) { + if (Utils.notEmpty(crime.native_api)) { TextTreeNode node = new TextTreeNode("Native API"); - for (QuarkReportData.Method method : crime.combination) { + for (QuarkReportData.Method method : crime.native_api) { node.add(new TextTreeNode(method.toString())); } add(node); - } else { - if (Utils.notEmpty(crime.native_api)) { - TextTreeNode node = new TextTreeNode("Native API"); - for (QuarkReportData.Method method : crime.native_api) { - node.add(new TextTreeNode(method.toString())); + } + List combination = crime.combination; + if (Utils.notEmpty(combination)) { + TextTreeNode node = new TextTreeNode("Combination"); + int size = combination.size(); + for (int i = 0; i < size; i++) { + TextTreeNode set = new TextTreeNode("Set " + i); + for (String mth : combination.get(i)) { + set.add(resolveMethod(mth)); } - add(node); + node.add(set); } + add(node); } if (Utils.notEmpty(crime.register)) { TextTreeNode node = new TextTreeNode("Invocations");