Version: 2.4.1 Update
This commit is contained in:
@@ -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'
|
||||||
}
|
}
|
||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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){
|
||||||
|
|||||||
Reference in New Issue
Block a user