Version: 2.4.1 Update

This commit is contained in:
AnonymousUser
2022-06-29 15:17:42 +08:00
parent 17a84fc19e
commit 7e0e3054be
5 changed files with 48 additions and 40 deletions

View File

@@ -30,4 +30,5 @@ dependencies {
compile group: 'org.yaml', name: 'snakeyaml', version: '1.28' compile group: 'org.yaml', name: 'snakeyaml', version: '1.28'
compile 'net.sourceforge.jregex:jregex:1.2_01' compile 'net.sourceforge.jregex:jregex:1.2_01'
compile 'dk.brics.automaton:automaton:1.11-8' compile 'dk.brics.automaton:automaton:1.11-8'
compile 'com.squareup.okhttp:okhttp:2.7.5'
} }

View File

@@ -3,6 +3,7 @@ package burp;
import burp.action.*; import burp.action.*;
import burp.ui.MainUI; import burp.ui.MainUI;
import java.util.HashMap;
import java.util.Map; import java.util.Map;
import javax.swing.*; import javax.swing.*;
import java.awt.*; import java.awt.*;
@@ -33,7 +34,7 @@ public class BurpExtender implements IBurpExtender, IHttpListener, IMessageEdito
this.callbacks = callbacks; this.callbacks = callbacks;
BurpExtender.helpers = callbacks.getHelpers(); BurpExtender.helpers = callbacks.getHelpers();
String version = "2.4"; String version = "2.4.1";
callbacks.setExtensionName(String.format("HaE (%s) - Highlighter and Extractor", version)); callbacks.setExtensionName(String.format("HaE (%s) - Highlighter and Extractor", version));
// 定义输出 // 定义输出
stdout = new PrintWriter(callbacks.getStdout(), true); stdout = new PrintWriter(callbacks.getStdout(), true);
@@ -115,6 +116,7 @@ public class BurpExtender implements IBurpExtender, IHttpListener, IMessageEdito
private final IMessageEditorController controller; private final IMessageEditorController controller;
private Map<String, String> extractRequestMap; private Map<String, String> extractRequestMap;
private Map<String, String> extractResponseMap; private Map<String, String> extractResponseMap;
private ArrayList<String> titleList = new ArrayList<>();
public MarkInfoTab(IMessageEditorController controller, boolean editable) { public MarkInfoTab(IMessageEditorController controller, boolean editable) {
this.controller = controller; this.controller = controller;
@@ -197,6 +199,7 @@ public class BurpExtender implements IBurpExtender, IHttpListener, IMessageEdito
* 创建MarkInfo表单 * 创建MarkInfo表单
*/ */
public void makeTable(Map<String, String> dataMap) { public void makeTable(Map<String, String> dataMap) {
ArrayList<String> lTitleList = new ArrayList<>();
dataMap.keySet().forEach(i->{ dataMap.keySet().forEach(i->{
String[] extractData = dataMap.get(i).split("\n"); String[] extractData = dataMap.get(i).split("\n");
Object[][] data = new Object[extractData.length][1]; Object[][] data = new Object[extractData.length][1];
@@ -204,14 +207,23 @@ public class BurpExtender implements IBurpExtender, IHttpListener, IMessageEdito
data[x][0] = extractData[x]; data[x][0] = extractData[x];
// stdout.println(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); 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) { if (indexOfTab != -1) {
this.jTabbedPane.remove(indexOfTab); this.jTabbedPane.removeTabAt(indexOfTab);
} }
}); });
titleList = lTitleList;
} }
} }

View File

@@ -94,7 +94,7 @@ public class ExtractContent {
} }
}); });
// host: {Name, List} // 将提取的数据存放到全局变量中
if (!host.isEmpty()) { if (!host.isEmpty()) {
map.keySet().forEach(i -> { map.keySet().forEach(i -> {
Map<String, Object> tmpMap = map.get(i); Map<String, Object> tmpMap = map.get(i);

View File

@@ -4,12 +4,15 @@ import burp.Config;
import burp.yaml.LoadConfig; import burp.yaml.LoadConfig;
import burp.yaml.SetConfig; 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.*;
import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener; import javax.swing.event.ChangeListener;
import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener; import javax.swing.event.DocumentListener;
import javax.swing.filechooser.FileNameExtensionFilter;
import java.awt.*; import java.awt.*;
import java.awt.event.*; import java.awt.event.*;
import java.util.Map; import java.util.Map;
@@ -32,7 +35,7 @@ public class MainUI extends JPanel{
setConn.deleteRules(ruleTabbedPane.getTitleAt(ruleTabbedPane.getSelectedIndex())); setConn.deleteRules(ruleTabbedPane.getTitleAt(ruleTabbedPane.getSelectedIndex()));
ruleTabbedPane.remove(ruleTabbedPane.getSelectedIndex()); ruleTabbedPane.remove(ruleTabbedPane.getSelectedIndex());
ruleTabbedPane.setSelectedIndex(ruleTabbedPane.getSelectedIndex()-1); ruleTabbedPane.setSelectedIndex(ruleTabbedPane.getSelectedIndex()-1);
}else{ } else {
SetConfig setConn = new SetConfig(); SetConfig setConn = new SetConfig();
setConn.deleteRules(ruleTabbedPane.getTitleAt(ruleTabbedPane.getSelectedIndex())); setConn.deleteRules(ruleTabbedPane.getTitleAt(ruleTabbedPane.getSelectedIndex()));
ruleTabbedPane.remove(ruleTabbedPane.getSelectedIndex()); ruleTabbedPane.remove(ruleTabbedPane.getSelectedIndex());
@@ -41,18 +44,23 @@ public class MainUI extends JPanel{
} }
} }
private void selectFileMouseClicked(MouseEvent e) { private void onlineUpdateMouseClicked(MouseEvent e) {
JFileChooser selectFile = new JFileChooser(); String url = "https://raw.githubusercontent.com/gh0stkey/HaE/gh-pages/Config.yml";
selectFile.setFileSelectionMode(JFileChooser.FILES_ONLY); OkHttpClient httpClient = new OkHttpClient();
FileNameExtensionFilter filter = new FileNameExtensionFilter("Yaml File (.yml/.yaml)","yaml", "yml"); Request httpRequest = new Request.Builder().url(url).get().build();
selectFile.setFileFilter(filter); try {
int selectFrame = selectFile.showDialog(new JLabel(),"Select"); Response httpResponse = httpClient.newCall(httpRequest).execute();
if (selectFrame == JFileChooser.APPROVE_OPTION){ // 获取官方规则文件,在线更新写入
String configPath = selectFile.getSelectedFile().toString(); String configFile = configTextField.getText();
reloadRule(); FileOutputStream fileOutputStream = new FileOutputStream(configFile);
loadConn.setConfigPath(configPath); fileOutputStream.write(httpResponse.body().bytes());
configTextField.setText(configPath); 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(); new LoadConfig();
} }
@@ -84,7 +92,7 @@ public class MainUI extends JPanel{
rulePanel = new JPanel(); rulePanel = new JPanel();
configTextField = new JTextField(); configTextField = new JTextField();
configLabel = new JLabel(); configLabel = new JLabel();
selectFileButton = new JButton(); onlineUpdateButton = new JButton();
reloadButton = new JButton(); reloadButton = new JButton();
excludeSuffixLabel = new JLabel(); excludeSuffixLabel = new JLabel();
excludeSuffixTextField = new JTextField(); excludeSuffixTextField = new JTextField();
@@ -111,19 +119,19 @@ public class MainUI extends JPanel{
GridBagConstraints.CENTER, GridBagConstraints.BOTH, GridBagConstraints.CENTER, GridBagConstraints.BOTH,
new Insets(5, 0, 5, 5), 0, 0)); 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, rulePanel.add(configLabel, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0,
GridBagConstraints.WEST, GridBagConstraints.VERTICAL, GridBagConstraints.WEST, GridBagConstraints.VERTICAL,
new Insets(5, 5, 5, 5), 0, 0)); new Insets(5, 5, 5, 5), 0, 0));
selectFileButton.setText("Select File ..."); onlineUpdateButton.setText("Online Update");
selectFileButton.addMouseListener(new MouseAdapter() { onlineUpdateButton.addMouseListener(new MouseAdapter() {
@Override @Override
public void mouseClicked(MouseEvent e) { 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, GridBagConstraints.CENTER, GridBagConstraints.BOTH,
new Insets(5, 0, 5, 5), 0, 0)); new Insets(5, 0, 5, 5), 0, 0));
@@ -139,7 +147,7 @@ public class MainUI extends JPanel{
GridBagConstraints.CENTER, GridBagConstraints.BOTH, GridBagConstraints.CENTER, GridBagConstraints.BOTH,
new Insets(5, 0, 5, 5), 0, 0)); 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, rulePanel.add(excludeSuffixLabel, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0,
GridBagConstraints.SOUTHWEST, GridBagConstraints.NONE, GridBagConstraints.SOUTHWEST, GridBagConstraints.NONE,
new Insets(0, 5, 5, 5), 0, 0)); new Insets(0, 5, 5, 5), 0, 0));
@@ -184,7 +192,7 @@ public class MainUI extends JPanel{
private JPanel rulePanel; private JPanel rulePanel;
private JTextField configTextField; private JTextField configTextField;
private JLabel configLabel; private JLabel configLabel;
private JButton selectFileButton; private JButton onlineUpdateButton;
private JButton reloadButton; private JButton reloadButton;
private JLabel excludeSuffixLabel; private JLabel excludeSuffixLabel;
private JTextField excludeSuffixTextField; private JTextField excludeSuffixTextField;

View File

@@ -23,7 +23,6 @@ public class LoadConfig {
public LoadConfig() { public LoadConfig() {
// 构造函数,初始化配置 // 构造函数,初始化配置
File HaEConfigPathFile = new File(HaEConfigPath); File HaEConfigPathFile = new File(HaEConfigPath);
if (!(HaEConfigPathFile.exists() && HaEConfigPathFile.isDirectory())) { if (!(HaEConfigPathFile.exists() && HaEConfigPathFile.isDirectory())) {
HaEConfigPathFile.mkdirs(); HaEConfigPathFile.mkdirs();
@@ -146,18 +145,6 @@ public class LoadConfig {
return resRule; return resRule;
} }
// 设置配置路径
public void setConfigPath(String filePath){
Map<String,Object> 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){ public void setExcludeSuffix(String excludeSuffix){