From 7e0e3054bef4a2224f02a3f295885a12d03560e9 Mon Sep 17 00:00:00 2001 From: AnonymousUser Date: Wed, 29 Jun 2022 15:17:42 +0800 Subject: [PATCH] Version: 2.4.1 Update --- build.gradle | 1 + src/main/java/burp/BurpExtender.java | 22 ++++++-- src/main/java/burp/action/ExtractContent.java | 2 +- src/main/java/burp/ui/MainUI.java | 50 +++++++++++-------- src/main/java/burp/yaml/LoadConfig.java | 13 ----- 5 files changed, 48 insertions(+), 40 deletions(-) diff --git a/build.gradle b/build.gradle index 41badb5..a4e1472 100644 --- a/build.gradle +++ b/build.gradle @@ -30,4 +30,5 @@ dependencies { compile group: 'org.yaml', name: 'snakeyaml', version: '1.28' compile 'net.sourceforge.jregex:jregex:1.2_01' compile 'dk.brics.automaton:automaton:1.11-8' + compile 'com.squareup.okhttp:okhttp:2.7.5' } \ No newline at end of file diff --git a/src/main/java/burp/BurpExtender.java b/src/main/java/burp/BurpExtender.java index d1be700..c6dba75 100644 --- a/src/main/java/burp/BurpExtender.java +++ b/src/main/java/burp/BurpExtender.java @@ -3,6 +3,7 @@ import burp.action.*; import burp.ui.MainUI; +import java.util.HashMap; import java.util.Map; import javax.swing.*; import java.awt.*; @@ -33,7 +34,7 @@ public void registerExtenderCallbacks(final IBurpExtenderCallbacks callbacks) this.callbacks = callbacks; BurpExtender.helpers = callbacks.getHelpers(); - String version = "2.4"; + String version = "2.4.1"; callbacks.setExtensionName(String.format("HaE (%s) - Highlighter and Extractor", version)); // 定义输出 stdout = new PrintWriter(callbacks.getStdout(), true); @@ -115,6 +116,7 @@ class MarkInfoTab implements IMessageEditorTab { private final IMessageEditorController controller; private Map extractRequestMap; private Map extractResponseMap; + private ArrayList titleList = new ArrayList<>(); public MarkInfoTab(IMessageEditorController controller, boolean editable) { this.controller = controller; @@ -197,6 +199,7 @@ public void setMessage(byte[] content, boolean isRequest) { * 创建MarkInfo表单 */ public void makeTable(Map dataMap) { + ArrayList lTitleList = new ArrayList<>(); dataMap.keySet().forEach(i->{ String[] extractData = dataMap.get(i).split("\n"); Object[][] data = new Object[extractData.length][1]; @@ -204,14 +207,23 @@ public void makeTable(Map dataMap) { data[x][0] = extractData[x]; // stdout.println(extractData[x]); } - int indexOfTab = this.jTabbedPane.indexOfTab(i); - JScrollPane jScrollPane = new JScrollPane(new JTable(data, new Object[] {"Information"})); + JScrollPane jScrollPane = new JScrollPane(new JTable(data, new Object[]{"Information"})); + lTitleList.add(i); this.jTabbedPane.addTab(i, jScrollPane); - // 使用removeAll会导致UI出现空白的情况,为了改善用户侧体验,采用remove的方式进行删除 + }); + + /* + * 使用removeAll会导致MarkInfo UI出现空白的情况,为了改善用户侧体验,采用remove的方式进行删除; + * 采用全局ArrayList的方式遍历删除Tab,以此应对BurpSuite缓存机制导致的MarkInfo UI错误展示。 + */ + titleList.forEach(t->{ + int indexOfTab = this.jTabbedPane.indexOfTab(t); if (indexOfTab != -1) { - this.jTabbedPane.remove(indexOfTab); + this.jTabbedPane.removeTabAt(indexOfTab); } }); + + titleList = lTitleList; } } diff --git a/src/main/java/burp/action/ExtractContent.java b/src/main/java/burp/action/ExtractContent.java index 48a0dc1..500674b 100644 --- a/src/main/java/burp/action/ExtractContent.java +++ b/src/main/java/burp/action/ExtractContent.java @@ -94,7 +94,7 @@ public Map> matchRegex(byte[] content, String header } }); - // host: {Name, List} + // 将提取的数据存放到全局变量中 if (!host.isEmpty()) { map.keySet().forEach(i -> { Map tmpMap = map.get(i); diff --git a/src/main/java/burp/ui/MainUI.java b/src/main/java/burp/ui/MainUI.java index bee2247..70f58cd 100644 --- a/src/main/java/burp/ui/MainUI.java +++ b/src/main/java/burp/ui/MainUI.java @@ -4,12 +4,15 @@ import burp.yaml.LoadConfig; import burp.yaml.SetConfig; +import com.squareup.okhttp.OkHttpClient; +import com.squareup.okhttp.Request; +import com.squareup.okhttp.Response; +import java.io.FileOutputStream; import javax.swing.*; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; -import javax.swing.filechooser.FileNameExtensionFilter; import java.awt.*; import java.awt.event.*; import java.util.Map; @@ -32,7 +35,7 @@ public void closeTabActionPerformed(ActionEvent e){ setConn.deleteRules(ruleTabbedPane.getTitleAt(ruleTabbedPane.getSelectedIndex())); ruleTabbedPane.remove(ruleTabbedPane.getSelectedIndex()); ruleTabbedPane.setSelectedIndex(ruleTabbedPane.getSelectedIndex()-1); - }else{ + } else { SetConfig setConn = new SetConfig(); setConn.deleteRules(ruleTabbedPane.getTitleAt(ruleTabbedPane.getSelectedIndex())); ruleTabbedPane.remove(ruleTabbedPane.getSelectedIndex()); @@ -41,18 +44,23 @@ public void closeTabActionPerformed(ActionEvent e){ } } - private void selectFileMouseClicked(MouseEvent e) { - JFileChooser selectFile = new JFileChooser(); - selectFile.setFileSelectionMode(JFileChooser.FILES_ONLY); - FileNameExtensionFilter filter = new FileNameExtensionFilter("Yaml File (.yml/.yaml)","yaml", "yml"); - selectFile.setFileFilter(filter); - int selectFrame = selectFile.showDialog(new JLabel(),"Select"); - if (selectFrame == JFileChooser.APPROVE_OPTION){ - String configPath = selectFile.getSelectedFile().toString(); - reloadRule(); - loadConn.setConfigPath(configPath); - configTextField.setText(configPath); + private void onlineUpdateMouseClicked(MouseEvent 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); } + new LoadConfig(); } @@ -84,7 +92,7 @@ private void initComponents() { rulePanel = new JPanel(); configTextField = new JTextField(); configLabel = new JLabel(); - selectFileButton = new JButton(); + onlineUpdateButton = new JButton(); reloadButton = new JButton(); excludeSuffixLabel = new JLabel(); excludeSuffixTextField = new JTextField(); @@ -111,19 +119,19 @@ private void initComponents() { GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(5, 0, 5, 5), 0, 0)); - configLabel.setText("Config File Path:"); + configLabel.setText("Config Path:"); rulePanel.add(configLabel, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.VERTICAL, new Insets(5, 5, 5, 5), 0, 0)); - selectFileButton.setText("Select File ..."); - selectFileButton.addMouseListener(new MouseAdapter() { + onlineUpdateButton.setText("Online Update"); + onlineUpdateButton.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { - selectFileMouseClicked(e); + onlineUpdateMouseClicked(e); } }); - rulePanel.add(selectFileButton, new GridBagConstraints(2, 0, 1, 1, 0.0, 0.0, + rulePanel.add(onlineUpdateButton, new GridBagConstraints(2, 0, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(5, 0, 5, 5), 0, 0)); @@ -139,7 +147,7 @@ public void mouseClicked(MouseEvent e) { GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(5, 0, 5, 5), 0, 0)); - excludeSuffixLabel.setText("ExcludeSuffix:"); + excludeSuffixLabel.setText("Exclude Suffix:"); rulePanel.add(excludeSuffixLabel, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0, GridBagConstraints.SOUTHWEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0)); @@ -184,7 +192,7 @@ public void mouseClicked(MouseEvent e) { private JPanel rulePanel; private JTextField configTextField; private JLabel configLabel; - private JButton selectFileButton; + private JButton onlineUpdateButton; private JButton reloadButton; private JLabel excludeSuffixLabel; private JTextField excludeSuffixTextField; diff --git a/src/main/java/burp/yaml/LoadConfig.java b/src/main/java/burp/yaml/LoadConfig.java index 68cc52f..3bd68c1 100644 --- a/src/main/java/burp/yaml/LoadConfig.java +++ b/src/main/java/burp/yaml/LoadConfig.java @@ -23,7 +23,6 @@ public class LoadConfig { public LoadConfig() { // 构造函数,初始化配置 - File HaEConfigPathFile = new File(HaEConfigPath); if (!(HaEConfigPathFile.exists() && HaEConfigPathFile.isDirectory())) { HaEConfigPathFile.mkdirs(); @@ -146,18 +145,6 @@ public static Map getRules(){ return resRule; } - // 设置配置路径 - public void setConfigPath(String filePath){ - Map r = new HashMap<>(); - r.put("configPath", filePath); - r.put("excludeSuffix", getExcludeSuffix()); - try{ - Writer ws = new OutputStreamWriter(new FileOutputStream(SettingPath), StandardCharsets.UTF_8); - yaml.dump(r, ws); - }catch (Exception ex){ - ex.printStackTrace(); - } - } // 设置不包含的后缀名 public void setExcludeSuffix(String excludeSuffix){