diff --git a/images/databoard.png b/images/databoard.png index 9b76c60..eaf47ba 100644 Binary files a/images/databoard.png and b/images/databoard.png differ diff --git a/src/main/java/burp/BurpExtender.java b/src/main/java/burp/BurpExtender.java index ee5b7f9..fa407e2 100644 --- a/src/main/java/burp/BurpExtender.java +++ b/src/main/java/burp/BurpExtender.java @@ -34,7 +34,7 @@ public class BurpExtender implements IBurpExtender, IHttpListener, IMessageEdito this.callbacks = callbacks; BurpExtender.helpers = callbacks.getHelpers(); - String version = "2.4.4"; + String version = "2.4.5"; callbacks.setExtensionName(String.format("HaE (%s) - Highlighter and Extractor", version)); // 定义输出 stdout = new PrintWriter(callbacks.getStdout(), true); @@ -104,7 +104,6 @@ public class BurpExtender implements IBurpExtender, IHttpListener, IMessageEdito messageInfo.setHighlight(color); String addComment = String.join(", ", result.get(1).get("comment")); - stdout.println(addComment); String resComment = !Objects.equals(originalComment, "") ? String.format("%s, %s", originalComment, addComment) : addComment; messageInfo.setComment(resComment); diff --git a/src/main/java/burp/action/ExtractContent.java b/src/main/java/burp/action/ExtractContent.java index 500674b..266f5c9 100644 --- a/src/main/java/burp/action/ExtractContent.java +++ b/src/main/java/burp/action/ExtractContent.java @@ -99,15 +99,16 @@ public class ExtractContent { map.keySet().forEach(i -> { Map tmpMap = map.get(i); List dataList = Arrays.asList(tmpMap.get("data").toString().split("\n")); + // 组合通配符Host + String anyHost = host.replace(host.split("\\.")[0], "*"); // 判断Host是否存在,如存在则进行数据更新,反之则新增数据 if (Config.globalDataMap.containsKey(host)) { Map> gRuleMap = Config.globalDataMap.get(host); // 判断匹配规则是否存在(逻辑同Host判断) if (gRuleMap.containsKey(i)) { List gDataList = gRuleMap.get(i); - List mergeDataList = new ArrayList<>(); + List mergeDataList = new ArrayList<>(gDataList); // 合并两个List - mergeDataList.addAll(gDataList); mergeDataList.addAll(dataList); // 去重操作 HashSet tmpList = new HashSet(mergeDataList); @@ -118,9 +119,14 @@ public class ExtractContent { } else { gRuleMap.put(i, dataList); } - } else { + } else if (!Config.globalDataMap.containsKey(anyHost)) { + // 添加通配符Host + Config.globalDataMap.put(anyHost, new HashMap<>()); + } + else { Map> ruleMap = new HashMap<>(); ruleMap.put(i, dataList); + // 添加单一Host Config.globalDataMap.put(host, ruleMap); } }); diff --git a/src/main/java/burp/ui/Databoard.java b/src/main/java/burp/ui/Databoard.java index 45d740d..d00dde5 100644 --- a/src/main/java/burp/ui/Databoard.java +++ b/src/main/java/burp/ui/Databoard.java @@ -1,6 +1,8 @@ package burp.ui; import burp.Config; +import java.util.HashMap; +import java.util.HashSet; import java.util.List; import javax.swing.table.DefaultTableModel; import org.jetbrains.annotations.NotNull; @@ -14,7 +16,7 @@ import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; /** - * @author LinChen + * @author LinChen && EvilChen */ public class Databoard extends JPanel { @@ -22,11 +24,33 @@ public class Databoard extends JPanel { initComponents(); } + /** + * 清空数据 + */ + private void clearActionPerformed(ActionEvent e) { + // 清空页面 + dataTabbedPane.removeAll(); + // 判断通配符Host/单一Host + String host = hostTextField.getText(); + if(host.contains("*")){ + Map>> ruleMap = Config.globalDataMap; + Map> selectHost = new HashMap<>(); + ruleMap.keySet().forEach(i -> { + if (i.contains(host.replace("*.", ""))) { + Config.globalDataMap.remove(i); + } + }); + } else { + Config.globalDataMap.remove(host); + } + } + private void initComponents() { // JFormDesigner - Component initialization - DO NOT MODIFY //GEN-BEGIN:initComponents hostLabel = new JLabel(); hostTextField = new JTextField(); dataTabbedPane = new JTabbedPane(); + clearButton = new JButton(); //======== this ======== setLayout(new GridBagLayout()); @@ -43,7 +67,11 @@ public class Databoard extends JPanel { add(hostTextField, new GridBagConstraints(2, 0, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(8, 0, 5, 5), 0, 0)); - + clearButton.setText("Clear"); + clearButton.addActionListener(this::clearActionPerformed); + add(clearButton, new GridBagConstraints(3, 0, 1, 1, 0.0, 0.0, + GridBagConstraints.CENTER, GridBagConstraints.BOTH, + new Insets(8, 0, 5, 5), 0, 0)); add(dataTabbedPane, new GridBagConstraints(1, 1, 3, 2, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(8, 0, 0, 5), 0, 0)); @@ -56,9 +84,7 @@ public class Databoard extends JPanel { */ private static List getHostByList(){ List hostList = new ArrayList<>(); - Config.globalDataMap.keySet().forEach(i -> { - hostList.add(i); - }); + hostList.addAll(Config.globalDataMap.keySet()); return hostList; } @@ -164,9 +190,36 @@ public class Databoard extends JPanel { private static void getInfoByHost(@NotNull JComboBox hostComboBox, JTabbedPane tabbedPane, JTextField textField) { if (hostComboBox.getSelectedItem() != null) { Map>> ruleMap = Config.globalDataMap; - Map> selectUrl = ruleMap.get(hostComboBox.getSelectedItem()); + Map> selectHost = new HashMap<>(); + String host = hostComboBox.getSelectedItem().toString(); + if (host.contains("*")) { + // 通配符数据 + Map> finalSelectHost = selectHost; + ruleMap.keySet().forEach(i -> { + if (i.contains(host.replace("*.", ""))) { + ruleMap.get(i).keySet().forEach(e -> { + if (finalSelectHost.containsKey(e)) { + // 合并操作 + List newList = new ArrayList<>(finalSelectHost.get(e)); + newList.addAll(ruleMap.get(i).get(e)); + // 去重操作 + HashSet tmpList = new HashSet(newList); + newList.clear(); + newList.addAll(tmpList); + // 添加操作 + finalSelectHost.put(e, newList); + } else { + finalSelectHost.put(e, ruleMap.get(i).get(e)); + } + }); + } + }); + } else { + selectHost = ruleMap.get(host); + } + tabbedPane.removeAll(); - for(Map.Entry> entry: selectUrl.entrySet()){ + for(Map.Entry> entry: selectHost.entrySet()){ tabbedPane.addTab(entry.getKey(), new JScrollPane(new HitRuleDataList(entry.getValue()))); } textField.setText(hostComboBox.getSelectedItem().toString()); @@ -177,6 +230,7 @@ public class Databoard extends JPanel { private JLabel hostLabel; private JTextField hostTextField; private JTabbedPane dataTabbedPane; + private JButton clearButton; // JFormDesigner - End of variables declaration //GEN-END:variables // 是否自动匹配Host diff --git a/src/main/java/burp/ui/MainUI.java b/src/main/java/burp/ui/MainUI.java index db28cfd..89f05e7 100644 --- a/src/main/java/burp/ui/MainUI.java +++ b/src/main/java/burp/ui/MainUI.java @@ -18,7 +18,7 @@ import java.awt.event.*; import java.util.Map; /** - * @author LinChen + * @author LinChen && EvilChen */ public class MainUI extends JPanel{ @@ -45,24 +45,29 @@ public class MainUI extends JPanel{ } private void onlineUpdateActionPerformed(ActionEvent e) { - String url = "https://raw.githubusercontent.com/gh0stkey/HaE/gh-pages/Config.yml"; - OkHttpClient httpClient = new OkHttpClient(); - Request httpRequest = new Request.Builder().url(url).get().build(); - try { - Response httpResponse = httpClient.newCall(httpRequest).execute(); - // 获取官方规则文件,在线更新写入 - String configFile = configTextField.getText(); - FileOutputStream fileOutputStream = new FileOutputStream(configFile); - fileOutputStream.write(httpResponse.body().bytes()); - JOptionPane.showMessageDialog(null, "Config file updated successfully!", "Error", - JOptionPane.INFORMATION_MESSAGE); - } catch (Exception ignored) { - JOptionPane.showMessageDialog(null, "Please check your network!", "Error", - JOptionPane.ERROR_MESSAGE); - } + // 添加提示框防止用户误触导致配置更新 + int retCode = JOptionPane.showConfirmDialog(null, "Do you want to update config?", "Info", + JOptionPane.YES_NO_CANCEL_OPTION); + if (retCode == JOptionPane.YES_OPTION) { + String url = "https://raw.githubusercontent.com/gh0stkey/HaE/gh-pages/Config.yml"; + OkHttpClient httpClient = new OkHttpClient(); + Request httpRequest = new Request.Builder().url(url).get().build(); + try { + Response httpResponse = httpClient.newCall(httpRequest).execute(); + // 获取官方规则文件,在线更新写入 + String configFile = configTextField.getText(); + FileOutputStream fileOutputStream = new FileOutputStream(configFile); + fileOutputStream.write(httpResponse.body().bytes()); + JOptionPane.showMessageDialog(null, "Config file updated successfully!", "Error", + JOptionPane.INFORMATION_MESSAGE); + } catch (Exception ignored) { + JOptionPane.showMessageDialog(null, "Please check your network!", "Error", + JOptionPane.ERROR_MESSAGE); + } - new LoadConfig(); - reloadRule(); + new LoadConfig(); + reloadRule(); + } } private void reloadRule(){