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 'net.sourceforge.jregex:jregex:1.2_01'
|
||||
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.ui.MainUI;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
@@ -33,7 +34,7 @@ public class BurpExtender implements IBurpExtender, IHttpListener, IMessageEdito
|
||||
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 @@ public class BurpExtender implements IBurpExtender, IHttpListener, IMessageEdito
|
||||
private final IMessageEditorController controller;
|
||||
private Map<String, String> extractRequestMap;
|
||||
private Map<String, String> extractResponseMap;
|
||||
private ArrayList<String> titleList = new ArrayList<>();
|
||||
|
||||
public MarkInfoTab(IMessageEditorController controller, boolean editable) {
|
||||
this.controller = controller;
|
||||
@@ -197,6 +199,7 @@ public class BurpExtender implements IBurpExtender, IHttpListener, IMessageEdito
|
||||
* 创建MarkInfo表单
|
||||
*/
|
||||
public void makeTable(Map<String, String> dataMap) {
|
||||
ArrayList<String> 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 class BurpExtender implements IBurpExtender, IHttpListener, IMessageEdito
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -94,7 +94,7 @@ public class ExtractContent {
|
||||
}
|
||||
});
|
||||
|
||||
// host: {Name, List}
|
||||
// 将提取的数据存放到全局变量中
|
||||
if (!host.isEmpty()) {
|
||||
map.keySet().forEach(i -> {
|
||||
Map<String, Object> tmpMap = map.get(i);
|
||||
|
||||
@@ -4,12 +4,15 @@ import burp.Config;
|
||||
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 class MainUI extends JPanel{
|
||||
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 class MainUI extends JPanel{
|
||||
}
|
||||
}
|
||||
|
||||
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 @@ public class MainUI extends JPanel{
|
||||
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 @@ public class MainUI extends JPanel{
|
||||
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 class MainUI extends JPanel{
|
||||
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 class MainUI extends JPanel{
|
||||
private JPanel rulePanel;
|
||||
private JTextField configTextField;
|
||||
private JLabel configLabel;
|
||||
private JButton selectFileButton;
|
||||
private JButton onlineUpdateButton;
|
||||
private JButton reloadButton;
|
||||
private JLabel excludeSuffixLabel;
|
||||
private JTextField excludeSuffixTextField;
|
||||
|
||||
@@ -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 class LoadConfig {
|
||||
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){
|
||||
|
||||
Reference in New Issue
Block a user