From e68619d1c2068f964464d59f1b093058ea7bcb7c Mon Sep 17 00:00:00 2001 From: gh0stkey <24655118+gh0stkey@users.noreply.github.com> Date: Thu, 12 Oct 2023 21:38:27 +0800 Subject: [PATCH] Version: 2.5 Update --- README.md | 34 +- images/config.png | Bin 57023 -> 50652 bytes images/databoard.png | Bin 55887 -> 103024 bytes images/{16000720732854.png => markinfo.png} | Bin images/{16000719723284.jpg => rgperson.jpg} | Bin src/main/java/burp/BurpExtender.java | 73 +++- src/main/java/burp/action/DoAction.java | 38 -- src/main/java/burp/action/ExtractContent.java | 146 ------- src/main/java/burp/action/GetColorKey.java | 29 -- src/main/java/burp/action/MatchHTTP.java | 20 - .../{Config.java => config/ConfigEntry.java} | 10 +- src/main/java/burp/config/ConfigLoader.java | 131 +++++++ src/main/java/burp/core/GlobalCachePool.java | 26 ++ .../processor/ColorProcessor.java} | 40 +- .../core/processor/DataProcessingUnit.java | 201 ++++++++++ .../processor/MessageProcessor.java} | 56 +-- .../java/burp/core/utils/HashCalculator.java | 28 ++ src/main/java/burp/core/utils/MatchTool.java | 24 ++ .../java/burp/core/utils/StringHelper.java | 30 ++ src/main/java/burp/rule/RuleProcessor.java | 98 +++++ src/main/java/burp/rule/model/Rule.java | 35 ++ src/main/java/burp/rule/model/RuleGroup.java | 37 ++ src/main/java/burp/rule/utils/RuleTool.java | 35 ++ src/main/java/burp/rule/utils/YamlTool.java | 35 ++ src/main/java/burp/ui/Databoard.java | 248 ------------ .../java/burp/ui/JTabbedPaneCloseButton.java | 114 ------ src/main/java/burp/ui/MainUI.java | 125 +++--- src/main/java/burp/ui/RuleSetting.java | 118 ------ .../ui/board/CustomTableCellRenderer.java | 64 ++++ src/main/java/burp/ui/board/Databoard.java | 358 ++++++++++++++++++ src/main/java/burp/ui/board/LogEntry.java | 47 +++ src/main/java/burp/ui/board/MessagePanel.java | 345 +++++++++++++++++ .../java/burp/ui/{ => rule}/RulePane.java | 84 ++-- src/main/java/burp/ui/rule/RuleSetting.java | 71 ++++ src/main/java/burp/yaml/LoadConfig.java | 162 -------- src/main/java/burp/yaml/RulesConfig.java | 12 - src/main/java/burp/yaml/SetConfig.java | 101 ----- src/main/java/burp/yaml/template/Rule.java | 93 ----- src/main/java/burp/yaml/template/Rules.java | 37 -- 39 files changed, 1776 insertions(+), 1329 deletions(-) rename images/{16000720732854.png => markinfo.png} (100%) rename images/{16000719723284.jpg => rgperson.jpg} (100%) delete mode 100644 src/main/java/burp/action/DoAction.java delete mode 100644 src/main/java/burp/action/ExtractContent.java delete mode 100644 src/main/java/burp/action/GetColorKey.java delete mode 100644 src/main/java/burp/action/MatchHTTP.java rename src/main/java/burp/{Config.java => config/ConfigEntry.java} (91%) create mode 100644 src/main/java/burp/config/ConfigLoader.java create mode 100644 src/main/java/burp/core/GlobalCachePool.java rename src/main/java/burp/{action/UpgradeColor.java => core/processor/ColorProcessor.java} (52%) create mode 100644 src/main/java/burp/core/processor/DataProcessingUnit.java rename src/main/java/burp/{action/ProcessMessage.java => core/processor/MessageProcessor.java} (62%) create mode 100644 src/main/java/burp/core/utils/HashCalculator.java create mode 100644 src/main/java/burp/core/utils/MatchTool.java create mode 100644 src/main/java/burp/core/utils/StringHelper.java create mode 100644 src/main/java/burp/rule/RuleProcessor.java create mode 100644 src/main/java/burp/rule/model/Rule.java create mode 100644 src/main/java/burp/rule/model/RuleGroup.java create mode 100644 src/main/java/burp/rule/utils/RuleTool.java create mode 100644 src/main/java/burp/rule/utils/YamlTool.java delete mode 100644 src/main/java/burp/ui/Databoard.java delete mode 100644 src/main/java/burp/ui/JTabbedPaneCloseButton.java delete mode 100644 src/main/java/burp/ui/RuleSetting.java create mode 100644 src/main/java/burp/ui/board/CustomTableCellRenderer.java create mode 100644 src/main/java/burp/ui/board/Databoard.java create mode 100644 src/main/java/burp/ui/board/LogEntry.java create mode 100644 src/main/java/burp/ui/board/MessagePanel.java rename src/main/java/burp/ui/{ => rule}/RulePane.java (79%) create mode 100644 src/main/java/burp/ui/rule/RuleSetting.java delete mode 100644 src/main/java/burp/yaml/LoadConfig.java delete mode 100644 src/main/java/burp/yaml/RulesConfig.java delete mode 100644 src/main/java/burp/yaml/SetConfig.java delete mode 100644 src/main/java/burp/yaml/template/Rule.java delete mode 100644 src/main/java/burp/yaml/template/Rules.java diff --git a/README.md b/README.md index 511674b..6190bab 100644 --- a/README.md +++ b/README.md @@ -4,12 +4,11 @@
第一作者: EvilChen(中孚信息元亨实验室), 第二作者: 0chencc(米斯特安全团队)
- ## 项目介绍 -**HaE**是基于 `BurpSuite Java插件API` 开发的请求高亮标记与信息提取的辅助型框架式插件,该插件可以通过自定义正则的方式匹配响应报文或请求报文,并对满足正则匹配的报文进行信息高亮与提取。 +**HaE**是一个基于`BurpSuite Java插件API`开发的辅助型框架式插件,旨在实现对HTTP消息的高亮标记和信息提取。该插件通过自定义正则表达式匹配响应报文或请求报文,并对匹配成功的报文进行标记和提取。 -现代化Web应用走上前后端分离开发模式,这就导致在日常测试时候会有许多的流量,如果你想要尽可能全面的对一个Web应用进行测试评估,将花费大量精力浪费在无用的报文上;**HaE的出现正是为了解决这一类似场景**,借助HaE你可以**有效的减少**测试的时间,将更多的精力放在**有价值、有意义**的报文上,**提高漏洞挖掘效率**。 +随着现代化Web应用采用前后端分离的开发模式,日常漏洞挖掘的过程中,捕获的HTTP请求流量也相应增加。若想全面评估一个Web应用,会花费大量时间在无用的报文上。**HaE的出现旨在解决这类情况**,借助HaE,您能够**有效减少**测试时间,将更多精力集中在**有价值且有意义**的报文上,从而**提高漏洞挖掘效率**。 **注**: 要想灵活的使用`HaE`,你需要掌握正则表达式阅读、编写、修改能力;由于`Java`正则表达式的库并没有`Python`的优雅或方便,所以HaE要求使用者必须用`()`将所需提取的表达式内容包含;例如你要匹配一个**Shiro应用**的响应报文,正常匹配规则为`rememberMe=delete`,如果你要提取这段内容的话就需要变成`(rememberMe=delete)`。 @@ -22,35 +21,32 @@ 1. Linux/Mac用户的配置文件目录:`~/.config/HaE/` 2. Windows用户的配置文件目录:`%USERPROFILE%/.config/HaE/` - ## 优势特点 -1. **精细化配置项**:高自由度配置更适配精细化场景需求; -2. **简洁可视界面**:简洁的可视化界面让你更加清晰了解HaE的各项配置,操作更轻松,使用更简单; -3. **颜色升级算法**:内置颜色升级算法,避免“屠龙者终成恶龙”场景,突出最具价值的请求; -4. **标签化规则项**:标签化你的正则规则,让规则可分类,让管理更轻松; -5. **数据集合面板**:将所有匹配数据集合到Databoard中,使得测试、梳理更高效; -6. **高亮标记一体**:在Proxy - History页面你可以通过颜色高亮与Comment判断请求价值; -7. **实战化官方库**:基于实战化场景、案例进行输出的官方规则库,提升测试实战性; -8. **配置文件易读**:配置文件使用YAML格式存储,更加便于阅读与修改。 +1. 精细配置:高度自由的配置选项,以满足各类精细化场景需求。 +2. 分类标签:使用标签对规则进行分类,便于管理和组织规则。 +3. 高亮标记:在HTTP History页面,通过颜色高亮和注释判断请求的价值。 +4. 易读配置:使用易读的YAML格式存储配置文件,方便阅读和修改。 +5. 数据集合:将匹配到的数据、请求和响应集中在数据面板中,提高测试和梳理效率。 +6. 简洁可视:清晰可视的界面设计,更轻松地了解和配置HaE,操作简单、使用便捷。 +7. 颜色升级:内置颜色升级算法,避免“屠龙者终成恶龙”场景,突出最具价值的请求。 +8. 实战规则:官方规则库是基于实战化场景总结输出,提升数据发现的有效性、精准性。 | 界面名称 | 界面展示 | -| ------------------------- | ----------------------------------------------------- | +| ------------------------ | ---------------------------------------------------- | | Rules(规则信息管理) | | | Config(配置信息管理) | | | Databoard(数据集合面板) | | - - ## 实际使用 使用 RGPerson 生成测试数据,放入网站根目录文件中: -![-w467](images/16000719723284.jpg) +![-w467](images/rgperson.jpg) -访问该地址,在`Proxy - HTTP History`中可以看见高亮请求,响应标签页中含有`MarkINFO`标签,其中将匹配到的信息提取了出来。 +访问该地址,在`Proxy - HTTP History`中可以看见高亮请求,响应标签页中含有`MarkInfo`标签,其中将匹配到的信息提取了出来。 -![-w1047](images/16000720732854.png) +![-w1047](images/markinfo.png) ## 文末随笔 @@ -68,4 +64,4 @@ `HaE` 是 404Team [星链计划2.0](https://github.com/knownsec/404StarLink2.0-Galaxy) 中的一环,如果对 `HaE` 有任何疑问又或是想要找小伙伴交流,可以参考星链计划的加群方式。 -- [https://github.com/knownsec/404StarLink2.0-Galaxy#community](https://github.com/knownsec/404StarLink2.0-Galaxy#community) +- [https://github.com/knownsec/404StarLink2.0-Galaxy#community](https://github.com/knownsec/404StarLink2.0-Galaxy#community) \ No newline at end of file diff --git a/images/config.png b/images/config.png index f0106bd9ef4c9060e00df68dc32fbcb0e3b95f4c..451b0cf8fb9cdf286d81ffd735a1f9a335c241f9 100644 GIT binary patch literal 50652 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

FD*|Bu9hV0dw--aL&OY7u^t_kWjtNvGR2V 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 YsqCswU0Ws0c_sMR+qhUWcKJm83vk9~mH+?% literal 55887 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 K-hw@zzx^K^RLdd& diff --git a/images/16000720732854.png b/images/markinfo.png similarity index 100% rename from images/16000720732854.png rename to images/markinfo.png diff --git a/images/16000719723284.jpg b/images/rgperson.jpg similarity index 100% rename from images/16000719723284.jpg rename to images/rgperson.jpg diff --git a/src/main/java/burp/BurpExtender.java b/src/main/java/burp/BurpExtender.java index 29da5ad..1f47093 100644 --- a/src/main/java/burp/BurpExtender.java +++ b/src/main/java/burp/BurpExtender.java @@ -1,8 +1,10 @@ package burp; -import burp.action.*; +import burp.core.processor.ColorProcessor; +import burp.core.processor.MessageProcessor; import burp.ui.MainUI; - +import burp.ui.board.MessagePanel; +import java.security.NoSuchAlgorithmException; import java.util.Map; import java.util.Objects; import javax.swing.*; @@ -19,14 +21,14 @@ import javax.swing.event.ChangeListener; */ public class BurpExtender implements IBurpExtender, IHttpListener, IMessageEditorTabFactory, ITab { - private final MainUI main = new MainUI(); + private MainUI main; // stdout变成公开属性,便于其他类调用输出调试信息 public static PrintWriter stdout; private IBurpExtenderCallbacks callbacks; private static IExtensionHelpers helpers; - GetColorKey gck = new GetColorKey(); - UpgradeColor uc = new UpgradeColor(); - ProcessMessage pm = new ProcessMessage(); + ColorProcessor colorProcessor = new ColorProcessor(); + MessageProcessor messageProcessor = new MessageProcessor(); + private MessagePanel messagePanel; @Override public void registerExtenderCallbacks(final IBurpExtenderCallbacks callbacks) @@ -34,21 +36,31 @@ public class BurpExtender implements IBurpExtender, IHttpListener, IMessageEdito this.callbacks = callbacks; BurpExtender.helpers = callbacks.getHelpers(); - String version = "2.4.7"; + String version = "2.5"; callbacks.setExtensionName(String.format("HaE (%s) - Highlighter and Extractor", version)); + // 定义输出 stdout = new PrintWriter(callbacks.getStdout(), true); - stdout.println("@First Author: EvilChen"); - stdout.println("@Second Author: 0chencc"); - stdout.println("@Github: https://github.com/gh0stkey/HaE"); + stdout.println("[ HACK THE WORLD - TO DO IT ]"); + stdout.println("[#] Author: EvilChen & 0chencc"); + stdout.println("[#] Github: https://github.com/gh0stkey/HaE"); + // UI - SwingUtilities.invokeLater(this::initialize); + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + initialize(); + } + }); callbacks.registerHttpListener(BurpExtender.this); callbacks.registerMessageEditorTabFactory(BurpExtender.this); + } private void initialize(){ + messagePanel = new MessagePanel(callbacks, helpers); + main = new MainUI(messagePanel); callbacks.customizeUiComponent(main); callbacks.addSuiteTab(BurpExtender.this); } @@ -71,6 +83,7 @@ public class BurpExtender implements IBurpExtender, IHttpListener, IMessageEdito // 判断是否是响应,且该代码作用域为:REPEATER、INTRUDER、PROXY(分别对应toolFlag 64、32、4) if (toolFlag == 64 || toolFlag == 32 || toolFlag == 4) { byte[] content; + if (messageIsRequest) { content = messageInfo.getRequest(); } else { @@ -78,20 +91,29 @@ public class BurpExtender implements IBurpExtender, IHttpListener, IMessageEdito } IHttpService iHttpService = null; + try { iHttpService = messageInfo.getHttpService(); } catch (Exception ignored) { } + // 获取请求主机信息 assert iHttpService != null; String host = iHttpService.getHost(); String c = new String(content, StandardCharsets.UTF_8).intern(); - List> result = pm.processMessageByContent(helpers, content, messageIsRequest, true, host); + List> result = null; + try { + result = messageProcessor.processMessage(helpers, content, messageIsRequest, true, host); + } catch (NoSuchAlgorithmException e) { + throw new RuntimeException(e); + } + String resComment = ""; + String resColor = ""; + String originalColor = messageInfo.getHighlight(); + String originalComment = messageInfo.getComment(); if (result != null && !result.isEmpty() && result.size() > 0) { - String originalColor = messageInfo.getHighlight(); - String originalComment = messageInfo.getComment(); List colorList = new ArrayList<>(); if (originalColor != null) { @@ -99,15 +121,20 @@ public class BurpExtender implements IBurpExtender, IHttpListener, IMessageEdito } colorList.add(result.get(0).get("color")); - String color = uc.getEndColor(gck.getColorKeys(colorList)); - - messageInfo.setHighlight(color); + resColor = colorProcessor.retrieveFinalColor(colorProcessor.retrieveColorIndices(colorList)); + messageInfo.setHighlight(resColor); String addComment = String.join(", ", result.get(1).get("comment")); - String resComment = !Objects.equals(originalComment, "") ? String.format("%s, %s", originalComment, addComment) : addComment; - + resComment = !Objects.equals(originalComment, "") ? String.format("%s, %s", originalComment, addComment) : addComment; messageInfo.setComment(resComment); } + + String endComment = resComment.isEmpty() ? originalComment : resComment; + String endColor = resColor.isEmpty() ? originalColor : resColor; + + if (!messageIsRequest && !endComment.isEmpty() && !endColor.isEmpty()) { + messagePanel.add(messageInfo, endComment, String.valueOf(content.length), endColor); + } } } @@ -142,7 +169,12 @@ public class BurpExtender implements IBurpExtender, IHttpListener, IMessageEdito @Override public boolean isEnabled(byte[] content, boolean isRequest) { String c = new String(content, StandardCharsets.UTF_8).intern(); - List> result = pm.processMessageByContent(helpers, content, isRequest, false, ""); + List> result = null; + try { + result = messageProcessor.processMessage(helpers, content, isRequest, false, ""); + } catch (NoSuchAlgorithmException e) { + throw new RuntimeException(e); + } if (result != null && !result.isEmpty()) { Map dataMap = result.get(0); @@ -207,7 +239,6 @@ public class BurpExtender implements IBurpExtender, IHttpListener, IMessageEdito Object[][] data = new Object[extractData.length][1]; for (int x = 0; x < extractData.length; x++) { data[x][0] = extractData[x]; - // stdout.println(extractData[x]); } JTable infoTable = new JTable(data, new Object[]{"Information"}); infoTable.setAutoCreateRowSorter(true); diff --git a/src/main/java/burp/action/DoAction.java b/src/main/java/burp/action/DoAction.java deleted file mode 100644 index 89d2f87..0000000 --- a/src/main/java/burp/action/DoAction.java +++ /dev/null @@ -1,38 +0,0 @@ -package burp.action; - -import burp.BurpExtender; -import java.util.HashMap; -import java.util.Map; -import java.util.ArrayList; -import java.util.List; - -/** - * @author EvilChen - */ - -public class DoAction { - public Map extractString(Map> obj) { - Map resultMap = new HashMap<>(); - obj.keySet().forEach(i->{ - Map tmpMap = obj.get(i); - String data = tmpMap.get("data").toString(); - resultMap.put(i, data); - }); - return resultMap; - } - - public List> highlightAndComment(Map> obj) { - List colorList = new ArrayList<>(); - List commentList = new ArrayList<>(); - List> result = new ArrayList<>(); - obj.keySet().forEach(i->{ - Map tmpMap = obj.get(i); - String color = tmpMap.get("color").toString(); - colorList.add(color); - commentList.add(i); - }); - result.add(colorList); - result.add(commentList); - return result; - } -} \ No newline at end of file diff --git a/src/main/java/burp/action/ExtractContent.java b/src/main/java/burp/action/ExtractContent.java deleted file mode 100644 index 6d3109b..0000000 --- a/src/main/java/burp/action/ExtractContent.java +++ /dev/null @@ -1,146 +0,0 @@ -package burp.action; - -import burp.BurpExtender; -import java.nio.charset.StandardCharsets; -import java.util.*; -import burp.Config; -import dk.brics.automaton.Automaton; -import dk.brics.automaton.AutomatonMatcher; -import dk.brics.automaton.RegExp; -import dk.brics.automaton.RunAutomaton; -import jregex.Matcher; -import jregex.Pattern; - -/** - * @author EvilChen - */ - -public class ExtractContent { - - public Map> matchRegex(byte[] content, String headers, byte[] body, String scopeString, String host) { - Map> map = new HashMap<>(); // 最终返回的结果 - Config.ruleConfig.keySet().forEach(i -> { - for (Object[] objects : Config.ruleConfig.get(i)) { - // 多线程执行,一定程度上减少阻塞现象 - Thread t = new Thread(() -> { - String matchContent = ""; - // 遍历获取规则 - List result = new ArrayList<>(); - Map tmpMap = new HashMap<>(); - - String name = objects[1].toString(); - boolean loaded = (Boolean) objects[0]; - String regex = objects[2].toString(); - String color = objects[3].toString(); - String scope = objects[4].toString(); - String engine = objects[5].toString(); - boolean sensitive = (Boolean) objects[6]; - // 判断规则是否开启与作用域 - if (loaded && (scope.contains(scopeString) || scope.contains("any"))) { - switch (scope) { - case "any": - case "request": - case "response": - matchContent = new String(content, StandardCharsets.UTF_8).intern(); - break; - case "any header": - case "request header": - case "response header": - matchContent = headers; - break; - case "any body": - case "request body": - case "response body": - matchContent = new String(body, StandardCharsets.UTF_8).intern(); - break; - default: - break; - } - - if ("nfa".equals(engine)) { - Pattern pattern; - // 判断规则是否大小写敏感 - if (sensitive) { - pattern = new Pattern(regex); - } else { - pattern = new Pattern(regex, Pattern.IGNORE_CASE); - } - - Matcher matcher = pattern.matcher(matchContent); - while (matcher.find()) { - // 添加匹配数据至list - // 强制用户使用()包裹正则 - result.add(matcher.group(1)); - } - } else { - RegExp regexp = new RegExp(regex); - Automaton auto = regexp.toAutomaton(); - RunAutomaton runAuto = new RunAutomaton(auto, true); - AutomatonMatcher autoMatcher = runAuto.newMatcher(matchContent); - while (autoMatcher.find()) { - // 添加匹配数据至list - // 强制用户使用()包裹正则 - result.add(autoMatcher.group()); - } - } - - // 去除重复内容 - HashSet tmpList = new HashSet(result); - result.clear(); - result.addAll(tmpList); - - String nameAndSize = String.format("%s (%s)", name, result.size()); - if (!result.isEmpty()) { - tmpMap.put("color", color); - String dataStr = String.join("\n", result); - tmpMap.put("data", dataStr); - map.put(nameAndSize, tmpMap); - - // 添加到全局变量中,便于Databoard检索 - if (!host.isEmpty()) { - String[] splitHost = host.split("\\."); - String anyHost = (splitHost.length > 2 && !host.matches("\\b(?:\\d{1,3}\\.){3}\\d{1,3}\\b")) ? host.replace(splitHost[0], "*") : ""; - List dataList = Arrays.asList(dataStr.split("\n")); - if (Config.globalDataMap.containsKey(host)) { - Map> gRuleMap = new HashMap<>(Config.globalDataMap.get(host)); - if (gRuleMap.containsKey(name)) { - List gDataList = gRuleMap.get(name); - gDataList.addAll(dataList); - gDataList = new ArrayList<>(new HashSet<>(gDataList)); - gRuleMap.replace(name, gDataList); - } else { - gRuleMap.put(name, dataList); - } - Config.globalDataMap.remove(host); - Config.globalDataMap.put(host, gRuleMap); - } else { - Map> ruleMap = new HashMap<>(); - ruleMap.put(name, dataList); - // 添加单一Host - Config.globalDataMap.put(host, ruleMap); - } - - if (!Config.globalDataMap.containsKey(anyHost) && anyHost.length() > 0) { - // 添加通配符Host,实际数据从查询哪里将所有数据提取 - Config.globalDataMap.put(anyHost, new HashMap<>()); - } else if (!Config.globalDataMap.containsKey("*")) { - // 添加通配符全匹配,同上 - Config.globalDataMap.put("*", new HashMap<>()); - } - } - } - } - }); - t.start(); - try { - t.join(); - } catch (InterruptedException e) { - BurpExtender.stdout.println(e); - } - - - } - }); - return map; - } -} diff --git a/src/main/java/burp/action/GetColorKey.java b/src/main/java/burp/action/GetColorKey.java deleted file mode 100644 index e4754e9..0000000 --- a/src/main/java/burp/action/GetColorKey.java +++ /dev/null @@ -1,29 +0,0 @@ -package burp.action; - -import burp.Config; -import java.util.ArrayList; -import java.util.List; - -/** - * @author EvilChen - */ - -public class GetColorKey { - /** - * 颜色下标获取 - */ - public List getColorKeys(List keys){ - List result = new ArrayList<>(); - String[] colorArray = Config.colorArray; - int size = colorArray.length; - // 根据颜色获取下标 - for (String key : keys) { - for (int v = 0; v < size; v++) { - if (colorArray[v].equals(key)) { - result.add(v); - } - } - } - return result; - } -} diff --git a/src/main/java/burp/action/MatchHTTP.java b/src/main/java/burp/action/MatchHTTP.java deleted file mode 100644 index 60b0499..0000000 --- a/src/main/java/burp/action/MatchHTTP.java +++ /dev/null @@ -1,20 +0,0 @@ -package burp.action; - -import jregex.Matcher; -import jregex.Pattern; -import jregex.REFlags; -import burp.yaml.LoadConfig; - -/** - * @author EvilChen - */ - -public class MatchHTTP { - // 匹配后缀 - LoadConfig lc = new LoadConfig(); - public boolean matchSuffix(String str) { - Pattern pattern = new Pattern(String.format("[\\w]+[\\.](%s)", lc.getExcludeSuffix()), REFlags.IGNORE_CASE); - Matcher matcher = pattern.matcher(str); - return matcher.find(); - } -} diff --git a/src/main/java/burp/Config.java b/src/main/java/burp/config/ConfigEntry.java similarity index 91% rename from src/main/java/burp/Config.java rename to src/main/java/burp/config/ConfigEntry.java index 03b6545..29e1f4a 100644 --- a/src/main/java/burp/Config.java +++ b/src/main/java/burp/config/ConfigEntry.java @@ -1,14 +1,10 @@ -package burp; - -/** - * @author EvilChen - */ +package burp.config; import java.util.HashMap; import java.util.List; import java.util.Map; -public class Config { +public class ConfigEntry { public static String excludeSuffix = "3g2|3gp|7z|aac|abw|aif|aifc|aiff|apk|arc|au|avi|azw|bat|bin|bmp|bz|bz2|cmd|cmx|cod|com|csh|css|csv|dll|doc|docx|ear|eot|epub|exe|flac|flv|gif|gz|ico|ics|ief|jar|jfif|jpe|jpeg|jpg|less|m3u|mid|midi|mjs|mkv|mov|mp2|mp3|mp4|mpa|mpe|mpeg|mpg|mpkg|mpp|mpv2|odp|ods|odt|oga|ogg|ogv|ogx|otf|pbm|pdf|pgm|png|pnm|ppm|ppt|pptx|ra|ram|rar|ras|rgb|rmi|rtf|scss|sh|snd|svg|swf|tar|tif|tiff|ttf|vsd|war|wav|weba|webm|webp|wmv|woff|woff2|xbm|xls|xlsx|xpm|xul|xwd|zip"; public static String[] scopeArray = new String[] { @@ -40,7 +36,7 @@ public class Config { "gray" }; - public static Map ruleConfig = null; + public static Map globalRules = null; public static Map>> globalDataMap = new HashMap<>(); } \ No newline at end of file diff --git a/src/main/java/burp/config/ConfigLoader.java b/src/main/java/burp/config/ConfigLoader.java new file mode 100644 index 0000000..10000a8 --- /dev/null +++ b/src/main/java/burp/config/ConfigLoader.java @@ -0,0 +1,131 @@ +package burp.config; + +import burp.rule.utils.RuleTool; +import burp.rule.utils.YamlTool; +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.ArrayList; +import org.yaml.snakeyaml.Yaml; + +/** + * @author EvilChen + */ + +public class ConfigLoader { + private static final Yaml yaml = YamlTool.newStandardYaml(); + private static final String HaEConfigPath = String.format("%s/.config/HaE", System.getProperty("user.home")); + private static final String RulesFilePath = String.format("%s/%s", HaEConfigPath, "Rules.yml"); + private static final String ConfigFilePath = String.format("%s/%s", HaEConfigPath, "Config.yml"); + + public ConfigLoader() { + // 构造函数,初始化配置 + File HaEConfigPathFile = new File(HaEConfigPath); + if (!(HaEConfigPathFile.exists() && HaEConfigPathFile.isDirectory())) { + HaEConfigPathFile.mkdirs(); + } + + File configFilePath = new File(ConfigFilePath); + + if (!(configFilePath.exists() && configFilePath.isFile())) { + initConfig(); + initRules(); + } + ConfigEntry.globalRules = ConfigLoader.getRules(); + } + + public void initConfig() { + Map r = new LinkedHashMap<>(); + r.put("rulesPath", RulesFilePath); + r.put("excludeSuffix", getExcludeSuffix()); + try { + Writer ws = new OutputStreamWriter(Files.newOutputStream(Paths.get(ConfigFilePath)), StandardCharsets.UTF_8); + yaml.dump(r, ws); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + public void initRules() { + RuleTool rt = new RuleTool(RulesFilePath); + rt.getRulesFromSite(); + } + + public static String getRulesFilePath() { + try { + Map r = YamlTool.loadYaml(ConfigFilePath); + return r.get("rulesPath").toString(); + } catch (Exception e) { + e.printStackTrace(); + return RulesFilePath; + } + } + + public String getExcludeSuffix(){ + String excludeSuffix = ""; + File yamlSetting = new File(ConfigFilePath); + if (yamlSetting.exists() && yamlSetting.isFile()) { + try { + InputStream inorder = Files.newInputStream(Paths.get(ConfigFilePath)); + Map r = yaml.load(inorder); + excludeSuffix = r.get("excludeSuffix").toString(); + } catch (Exception e) { + // e.printStackTrace(); + excludeSuffix = ConfigEntry.excludeSuffix; + } + } else { + excludeSuffix = ConfigEntry.excludeSuffix; + } + return excludeSuffix; + } + + // 获取规则配置 + public static Map getRules() { + Map rulesMap = YamlTool.loadYaml(getRulesFilePath()); + Map resRule = new HashMap<>(); + String[] fieldKeys = {"loaded", "name", "regex", "color", "scope", "engine", "sensitive"}; + + Object rulesObj = rulesMap.get("rules"); + if (rulesObj instanceof List) { + List> groupData = (List>) rulesObj; + for (Map groupFields : groupData) { + ArrayList data = new ArrayList<>(); + + Object ruleObj = groupFields.get("rule"); + if (ruleObj instanceof List) { + List> ruleData = (List>) ruleObj; + for (Map ruleFields : ruleData) { + Object[] valuesArray = new Object[fieldKeys.length]; + for (int i = 0; i < fieldKeys.length; i++) { + valuesArray[i] = ruleFields.get(fieldKeys[i]); + } + data.add(valuesArray); + } + } + + Object[][] dataArray = data.toArray(new Object[data.size()][]); + resRule.put(groupFields.get("group").toString(), dataArray); + } + } + + return resRule; + } + + public void setExcludeSuffix(String excludeSuffix){ + Map r = new LinkedHashMap<>(); + r.put("rulesPath", getRulesFilePath()); + r.put("excludeSuffix", excludeSuffix); + try{ + Writer ws = new OutputStreamWriter(Files.newOutputStream(Paths.get(RulesFilePath)), StandardCharsets.UTF_8); + yaml.dump(r, ws); + }catch (Exception ex){ + ex.printStackTrace(); + } + } + +} \ No newline at end of file diff --git a/src/main/java/burp/core/GlobalCachePool.java b/src/main/java/burp/core/GlobalCachePool.java new file mode 100644 index 0000000..3844026 --- /dev/null +++ b/src/main/java/burp/core/GlobalCachePool.java @@ -0,0 +1,26 @@ +package burp.core; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author EvilChen + */ + +public class GlobalCachePool { + // 用于缓存匹配结果,以请求/响应的MD5 Hash作为索引 + private static final Map>> cache = new HashMap<>(); + + public static void addToCache(String key, Map> value) { + cache.put(key, value); + } + + public static Map> getFromCache(String key) { + return cache.get(key); + } + + public static void removeFromCache(String key) { + cache.remove(key); + } + +} \ No newline at end of file diff --git a/src/main/java/burp/action/UpgradeColor.java b/src/main/java/burp/core/processor/ColorProcessor.java similarity index 52% rename from src/main/java/burp/action/UpgradeColor.java rename to src/main/java/burp/core/processor/ColorProcessor.java index eca7b59..8ee6a14 100644 --- a/src/main/java/burp/action/UpgradeColor.java +++ b/src/main/java/burp/core/processor/ColorProcessor.java @@ -1,6 +1,6 @@ -package burp.action; +package burp.core.processor; -import burp.Config; +import burp.config.ConfigEntry; import java.util.*; @@ -8,14 +8,30 @@ import java.util.*; * @author EvilChen */ -public class UpgradeColor { - private String endColor = ""; +public class ColorProcessor { + private String finalColor = ""; + + public List retrieveColorIndices(List colors){ + List indices = new ArrayList<>(); + String[] colorArray = ConfigEntry.colorArray; + int size = colorArray.length; + + for (String color : colors) { + for (int i = 0; i < size; i++) { + if (colorArray[i].equals(color)) { + indices.add(i); + } + } + } + return indices; + } + /** * 颜色升级递归算法 */ - private void colorUpgrade(List colorList) { + private void upgradeColors(List colorList) { int colorSize = colorList.size(); - String[] colorArray = Config.colorArray; + String[] colorArray = ConfigEntry.colorArray; colorList.sort(Comparator.comparingInt(Integer::intValue)); int i = 0; List stack = new ArrayList<>(); @@ -36,17 +52,17 @@ public class UpgradeColor { if (stack.size() == tmpList.size()) { stack.sort(Comparator.comparingInt(Integer::intValue)); if(stack.get(0) < 0) { - this.endColor = colorArray[0]; + this.finalColor = colorArray[0]; } else { - this.endColor = colorArray[stack.get(0)]; + this.finalColor = colorArray[stack.get(0)]; } } else { - this.colorUpgrade(stack); + this.upgradeColors(stack); } } - public String getEndColor(List colorList) { - colorUpgrade(colorList); - return endColor; + public String retrieveFinalColor(List colorList) { + upgradeColors(colorList); + return finalColor; } } diff --git a/src/main/java/burp/core/processor/DataProcessingUnit.java b/src/main/java/burp/core/processor/DataProcessingUnit.java new file mode 100644 index 0000000..54732fb --- /dev/null +++ b/src/main/java/burp/core/processor/DataProcessingUnit.java @@ -0,0 +1,201 @@ +package burp.core.processor; + +import burp.core.GlobalCachePool; +import burp.core.utils.HashCalculator; +import burp.core.utils.MatchTool; +import burp.config.ConfigEntry; +import burp.core.utils.StringHelper; +import dk.brics.automaton.Automaton; +import dk.brics.automaton.AutomatonMatcher; +import dk.brics.automaton.RegExp; +import dk.brics.automaton.RunAutomaton; +import java.nio.charset.StandardCharsets; +import java.security.NoSuchAlgorithmException; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.ArrayList; +import java.util.List; +import jregex.Matcher; +import jregex.Pattern; + +/** + * @author EvilChen + */ + +public class DataProcessingUnit { + public Map extractDataFromMap(Map> inputData) { + Map extractedData = new HashMap<>(); + inputData.keySet().forEach(key -> { + Map tempMap = inputData.get(key); + String data = tempMap.get("data").toString(); + extractedData.put(key, data); + }); + return extractedData; + } + + public List> extractColorsAndComments(Map> inputData) { + List colorList = new ArrayList<>(); + List commentList = new ArrayList<>(); + inputData.keySet().forEach(key -> { + Map tempMap = inputData.get(key); + String color = tempMap.get("color").toString(); + colorList.add(color); + commentList.add(key); + }); + List> result = new ArrayList<>(); + result.add(colorList); + result.add(commentList); + return result; + } + + public Map> matchContentByRegex(byte[] content, String headers, byte[] body, String scopeString, String host) + throws NoSuchAlgorithmException { + // 先从池子里判断是否有已经匹配好的结果 + String messageIndex = HashCalculator.calculateHash(content); + Map> map = GlobalCachePool.getFromCache(messageIndex); + if (map != null) { + return map; + } else { + // 最终返回的结果 + Map> finalMap = new HashMap<>(); + ConfigEntry.globalRules.keySet().forEach(i -> { + for (Object[] objects : ConfigEntry.globalRules.get(i)) { + // 多线程执行,一定程度上减少阻塞现象 + Thread t = new Thread(() -> { + String matchContent = ""; + // 遍历获取规则 + List result = new ArrayList<>(); + Map tmpMap = new HashMap<>(); + + String name = objects[1].toString(); + boolean loaded = (Boolean) objects[0]; + String regex = objects[2].toString(); + String color = objects[3].toString(); + String scope = objects[4].toString(); + String engine = objects[5].toString(); + boolean sensitive = (Boolean) objects[6]; + // 判断规则是否开启与作用域 + if (loaded && (scope.contains(scopeString) || scope.contains("any"))) { + switch (scope) { + case "any": + case "request": + case "response": + matchContent = new String(content, StandardCharsets.UTF_8).intern(); + break; + case "any header": + case "request header": + case "response header": + matchContent = headers; + break; + case "any body": + case "request body": + case "response body": + matchContent = new String(body, StandardCharsets.UTF_8).intern(); + break; + default: + break; + } + + if ("nfa".equals(engine)) { + Pattern pattern; + // 判断规则是否大小写敏感 + if (sensitive) { + pattern = new Pattern(regex); + } else { + pattern = new Pattern(regex, Pattern.IGNORE_CASE); + } + + Matcher matcher = pattern.matcher(matchContent); + while (matcher.find()) { + // 添加匹配数据至list + // 强制用户使用()包裹正则 + result.add(matcher.group(1)); + } + } else { + RegExp regexp = new RegExp(regex); + Automaton auto = regexp.toAutomaton(); + RunAutomaton runAuto = new RunAutomaton(auto, true); + AutomatonMatcher autoMatcher = runAuto.newMatcher(matchContent); + while (autoMatcher.find()) { + // 添加匹配数据至list + // 强制用户使用()包裹正则 + result.add(autoMatcher.group()); + } + } + + // 去除重复内容 + HashSet tmpList = new HashSet(result); + result.clear(); + result.addAll(tmpList); + + String nameAndSize = String.format("%s (%s)", name, result.size()); + if (!result.isEmpty()) { + tmpMap.put("color", color); + String dataStr = String.join("\n", result); + tmpMap.put("data", dataStr); + finalMap.put(nameAndSize, tmpMap); + + // 添加到全局变量中,便于Databoard检索 + if (!host.isEmpty()) { + List dataList = Arrays.asList(dataStr.split("\n")); + if (ConfigEntry.globalDataMap.containsKey(host)) { + Map> gRuleMap = new HashMap<>(ConfigEntry.globalDataMap.get(host)); + if (gRuleMap.containsKey(name)) { + // gDataList为不可变列表,因此需要重新创建一个列表以便于使用addAll方法 + List gDataList = gRuleMap.get(name); + List newDataList = new ArrayList<>(gDataList); + newDataList.addAll(dataList); + newDataList = new ArrayList<>(new HashSet<>(newDataList)); + gRuleMap.remove(name); + gRuleMap.put(name, newDataList); + } else { + gRuleMap.put(name, dataList); + } + ConfigEntry.globalDataMap.remove(host); + ConfigEntry.globalDataMap.put(host, gRuleMap); + } else { + Map> ruleMap = new HashMap<>(); + ruleMap.put(name, dataList); + // 添加单一Host + ConfigEntry.globalDataMap.put(host, ruleMap); + } + + String[] splitHost = host.split("\\."); + + String anyHost = (splitHost.length > 2 && !MatchTool.matchIP(host)) ? StringHelper.replaceFirstOccurrence(host, splitHost[0], "*") : ""; + + if (!ConfigEntry.globalDataMap.containsKey(anyHost) && anyHost.length() > 0) { + // 添加通配符Host,实际数据从查询哪里将所有数据提取 + ConfigEntry.globalDataMap.put(anyHost, new HashMap<>()); + } + + if (!ConfigEntry.globalDataMap.containsKey("*")) { + // 添加通配符全匹配,同上 + ConfigEntry.globalDataMap.put("*", new HashMap<>()); + } + + if (!ConfigEntry.globalDataMap.containsKey("**")) { + // 添加通配符全匹配,同上 + ConfigEntry.globalDataMap.put("**", new HashMap<>()); + } + } + } + } + }); + t.start(); + try { + t.join(); + } catch (Exception e) { + e.printStackTrace(); + } + + } + }); + GlobalCachePool.addToCache(messageIndex, finalMap); + return finalMap; + } + + } +} \ No newline at end of file diff --git a/src/main/java/burp/action/ProcessMessage.java b/src/main/java/burp/core/processor/MessageProcessor.java similarity index 62% rename from src/main/java/burp/action/ProcessMessage.java rename to src/main/java/burp/core/processor/MessageProcessor.java index b9f6b57..6da2b37 100644 --- a/src/main/java/burp/action/ProcessMessage.java +++ b/src/main/java/burp/core/processor/MessageProcessor.java @@ -1,92 +1,78 @@ -package burp.action; +package burp.core.processor; -import burp.BurpExtender; import burp.IExtensionHelpers; +import burp.core.utils.MatchTool; +import java.security.NoSuchAlgorithmException; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; -public class ProcessMessage { - MatchHTTP mh = new MatchHTTP(); - ExtractContent ec = new ExtractContent(); - DoAction da = new DoAction(); - GetColorKey gck = new GetColorKey(); - UpgradeColor uc = new UpgradeColor(); +public class MessageProcessor { + MatchTool matcher = new MatchTool(); + DataProcessingUnit dataProcessingUnit = new DataProcessingUnit(); + ColorProcessor colorProcessor = new ColorProcessor(); - public List> processMessageByContent(IExtensionHelpers helpers, byte[] content, boolean isRequest, boolean messageInfo, String host) { - List> result = new ArrayList<>();; + public List> processMessage(IExtensionHelpers helpers, byte[] content, boolean isRequest, boolean messageInfo, String host) + throws NoSuchAlgorithmException { + List> result = new ArrayList<>(); Map> obj; if (isRequest) { - - // 获取报文头 List requestTmpHeaders = helpers.analyzeRequest(content).getHeaders(); String requestHeaders = String.join("\n", requestTmpHeaders); try { - // 流量清洗 String urlString = requestTmpHeaders.get(0).split(" ")[1]; urlString = urlString.indexOf("?") > 0 ? urlString.substring(0, urlString.indexOf("?")) : urlString; - - // 正则判断 - if (mh.matchSuffix(urlString)) { + if (matcher.matchUrlSuffix(urlString)) { return result; } } catch (Exception e) { return result; } - // 获取报文主体 int requestBodyOffset = helpers.analyzeRequest(content).getBodyOffset(); byte[] requestBody = Arrays.copyOfRange(content, requestBodyOffset, content.length); - - obj = ec.matchRegex(content, requestHeaders, requestBody, "request", host); + obj = dataProcessingUnit.matchContentByRegex(content, requestHeaders, requestBody, "request", host); } else { try { - // 流量清洗 String inferredMimeType = String.format("hae.%s", helpers.analyzeResponse(content).getInferredMimeType().toLowerCase()); String statedMimeType = String.format("hae.%s", helpers.analyzeResponse(content).getStatedMimeType().toLowerCase()); - // 正则判断 - if (mh.matchSuffix(statedMimeType) || mh.matchSuffix(inferredMimeType)) { + if (matcher.matchUrlSuffix(statedMimeType) || matcher.matchUrlSuffix(inferredMimeType)) { return result; } } catch (Exception e) { return result; } - // 获取报文头 List responseTmpHeaders = helpers.analyzeResponse(content).getHeaders(); String responseHeaders = String.join("\n", responseTmpHeaders); - - // 获取报文主体 int responseBodyOffset = helpers.analyzeResponse(content).getBodyOffset(); byte[] responseBody = Arrays.copyOfRange(content, responseBodyOffset, content.length); - obj = ec.matchRegex(content, responseHeaders, responseBody, "response", host); + obj = dataProcessingUnit.matchContentByRegex(content, responseHeaders, responseBody, "response", host); } if (obj.size() > 0) { if (messageInfo) { - List> resultList = da.highlightAndComment(obj); + List> resultList = dataProcessingUnit.extractColorsAndComments(obj); List colorList = resultList.get(0); List commentList = resultList.get(1); - if (colorList.size() != 0 && commentList.size() != 0) { - String color = uc.getEndColor(gck.getColorKeys(colorList)); - Map colorMap = new HashMap(){{ + if (!colorList.isEmpty() && !commentList.isEmpty()) { + String color = colorProcessor.retrieveFinalColor(colorProcessor.retrieveColorIndices(colorList)); + Map colorMap = new HashMap() {{ put("color", color); }}; - Map commentMap = new HashMap(){{ + Map commentMap = new HashMap() {{ put("comment", String.join(", ", commentList)); }}; result.add(colorMap); result.add(commentMap); } } else { - result.add(da.extractString(obj)); + result.add(dataProcessingUnit.extractDataFromMap(obj)); } } - return result; - } -} \ No newline at end of file +} diff --git a/src/main/java/burp/core/utils/HashCalculator.java b/src/main/java/burp/core/utils/HashCalculator.java new file mode 100644 index 0000000..a61f35f --- /dev/null +++ b/src/main/java/burp/core/utils/HashCalculator.java @@ -0,0 +1,28 @@ +package burp.core.utils; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +/** + * @author EvilChen + */ + +public class HashCalculator { + public static String calculateHash(byte[] bytes) throws NoSuchAlgorithmException { + MessageDigest digest = MessageDigest.getInstance("MD5"); + byte[] hashBytes = digest.digest(bytes); + return bytesToHex(hashBytes); + } + + private static String bytesToHex(byte[] bytes) { + StringBuilder hexString = new StringBuilder(); + for (byte b : bytes) { + String hex = Integer.toHexString(0xff & b); + if (hex.length() == 1) { + hexString.append('0'); + } + hexString.append(hex); + } + return hexString.toString(); + } +} diff --git a/src/main/java/burp/core/utils/MatchTool.java b/src/main/java/burp/core/utils/MatchTool.java new file mode 100644 index 0000000..3b1a39e --- /dev/null +++ b/src/main/java/burp/core/utils/MatchTool.java @@ -0,0 +1,24 @@ +package burp.core.utils; + +import jregex.Pattern; +import jregex.REFlags; +import burp.config.ConfigLoader; + +/** + * @author EvilChen + */ + +public class MatchTool { + // 匹配后缀 + ConfigLoader configLoader = new ConfigLoader(); + + public boolean matchUrlSuffix(String str) { + Pattern pattern = new Pattern(String.format("[\\w]+[\\.](%s)", configLoader.getExcludeSuffix()), REFlags.IGNORE_CASE); + jregex.Matcher matcher = pattern.matcher(str); + return matcher.find(); + } + + public static boolean matchIP(String str) { + return str.matches("\\b(?:\\d{1,3}\\.){3}\\d{1,3}\\b"); + } +} diff --git a/src/main/java/burp/core/utils/StringHelper.java b/src/main/java/burp/core/utils/StringHelper.java new file mode 100644 index 0000000..0e640be --- /dev/null +++ b/src/main/java/burp/core/utils/StringHelper.java @@ -0,0 +1,30 @@ +package burp.core.utils; + +public class StringHelper { + public static String replaceFirstOccurrence(String original, String find, String replace) { + int index = original.indexOf(find); + if (index != -1) { + return original.substring(0, index) + replace + original.substring(index + find.length()); + } + return original; + } + + public static boolean matchFromEnd(String input, String pattern) { + int inputLength = input.length(); + int patternLength = pattern.length(); + + int inputIndex = inputLength - 1; + int patternIndex = patternLength - 1; + + while (inputIndex >= 0 && patternIndex >= 0) { + if (input.charAt(inputIndex) != pattern.charAt(patternIndex)) { + return false; + } + inputIndex--; + patternIndex--; + } + + // 如果patternIndex为-1,表示pattern字符串已经完全匹配 + return patternIndex == -1; + } +} diff --git a/src/main/java/burp/rule/RuleProcessor.java b/src/main/java/burp/rule/RuleProcessor.java new file mode 100644 index 0000000..5f655ed --- /dev/null +++ b/src/main/java/burp/rule/RuleProcessor.java @@ -0,0 +1,98 @@ +package burp.rule; + +import burp.config.ConfigEntry; +import burp.config.ConfigLoader; +import burp.rule.model.Rule; +import burp.rule.model.RuleGroup; +import burp.rule.utils.YamlTool; +import java.io.IOException; +import java.nio.file.Files; +import java.util.stream.Collectors; +import org.yaml.snakeyaml.Yaml; +import java.io.File; +import java.io.OutputStreamWriter; +import java.io.Writer; +import java.nio.charset.StandardCharsets; +import java.util.*; + +/** + * @author EvilChen + */ + +public class RuleProcessor { + public void rulesFormatAndSave() { + Yaml yaml = YamlTool.newStandardYaml(); + List ruleGroupList = new ArrayList<>(); + + ConfigEntry.globalRules.forEach((k, v) -> { + List ruleList = Arrays.stream(v) + .map(objects -> new Rule( + (boolean) objects[0], + (String) objects[1], + (String) objects[2], + (String) objects[3], + (String) objects[4], + (String) objects[5], + (boolean) objects[6])) + .collect(Collectors.toList()); + ruleGroupList.add(new RuleGroup(k, ruleList)); + }); + + List> outputGroupsMap = ruleGroupList.stream() + .map(RuleGroup::getFields) + .collect(Collectors.toList()); + + Map outputMap = new LinkedHashMap<>(); + outputMap.put("rules", outputGroupsMap); + + File f = new File(ConfigLoader.getRulesFilePath()); + try (Writer ws = new OutputStreamWriter(Files.newOutputStream(f.toPath()), StandardCharsets.UTF_8)) { + yaml.dump(outputMap, ws); + } catch (IOException ex) { + ex.printStackTrace(); + } + } + + public void changeRule(Vector data, int select, String type) { + ConfigEntry.globalRules.get(type)[select] = data.toArray(); + this.rulesFormatAndSave(); + } + + public void addRule(Vector data, String type) { + ArrayList x = new ArrayList<>(Arrays.asList(ConfigEntry.globalRules.get(type))); + x.add(data.toArray()); + ConfigEntry.globalRules.put(type,x.toArray(new Object[x.size()][])); + this.rulesFormatAndSave(); + } + public void removeRule(int select,String type) { + ArrayList x = new ArrayList<>(Arrays.asList(ConfigEntry.globalRules.get(type))); + x.remove(select); + ConfigEntry.globalRules.put(type,x.toArray(new Object[x.size()][])); + this.rulesFormatAndSave(); + } + + public void renameRuleGroup(String oldName, String newName) { + ConfigEntry.globalRules.put(newName, ConfigEntry.globalRules.remove(oldName)); + this.rulesFormatAndSave(); + } + + public void deleteRuleGroup(String Rules) { + ConfigEntry.globalRules.remove(Rules); + this.rulesFormatAndSave(); + } + public String newRule() { + int i = 0; + String name = "New "; + Object[][] data = new Object[][] { + { + false, "New Name", "(New Regex)", "gray", "any", "nfa", false + } + }; + while (ConfigEntry.globalRules.containsKey(name + i)) { + i++; + } + ConfigEntry.globalRules.put(name + i, data); + this.rulesFormatAndSave(); + return name + i; + } +} diff --git a/src/main/java/burp/rule/model/Rule.java b/src/main/java/burp/rule/model/Rule.java new file mode 100644 index 0000000..fcc5191 --- /dev/null +++ b/src/main/java/burp/rule/model/Rule.java @@ -0,0 +1,35 @@ +package burp.rule.model; + +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * @author EvilChen + */ + +public class Rule { + private Map fields; + + public Rule(boolean loaded, String name, String regex, String color, String scope, String engine, boolean sensitive) { + fields = new LinkedHashMap<>(); + fields.put("name", name); + fields.put("loaded", loaded); + fields.put("regex", regex); + fields.put("color", color); + fields.put("scope", scope); + fields.put("engine", engine); + fields.put("sensitive", sensitive); + } + + public Rule() { + + } + + public Map getFields() { + return fields; + } + + public void loadFields(Map fields) { + this.fields = fields; + } +} \ No newline at end of file diff --git a/src/main/java/burp/rule/model/RuleGroup.java b/src/main/java/burp/rule/model/RuleGroup.java new file mode 100644 index 0000000..1c9e9a1 --- /dev/null +++ b/src/main/java/burp/rule/model/RuleGroup.java @@ -0,0 +1,37 @@ +package burp.rule.model; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * @author EvilChen + */ + +public class RuleGroup { + private Map fields; + + public RuleGroup(String groupName, List rules) { + List> ruleList = new ArrayList<>(); + for (Rule rule : rules) { + ruleList.add(rule.getFields()); + } + + fields = new LinkedHashMap<>(); + fields.put("group", groupName); + fields.put("rule", ruleList); + } + + public RuleGroup() { + + } + + public Map getFields() { + return fields; + } + + public void loadFields(Map fields) { + this.fields = fields; + } +} \ No newline at end of file diff --git a/src/main/java/burp/rule/utils/RuleTool.java b/src/main/java/burp/rule/utils/RuleTool.java new file mode 100644 index 0000000..d65ff87 --- /dev/null +++ b/src/main/java/burp/rule/utils/RuleTool.java @@ -0,0 +1,35 @@ +package burp.rule.utils; + +import com.squareup.okhttp.OkHttpClient; +import com.squareup.okhttp.Request; +import com.squareup.okhttp.Response; +import java.io.FileOutputStream; +import javax.swing.JOptionPane; + +/** + * @author EvilChen + */ +public class RuleTool { + private String rulesFilePath; + + public RuleTool(String rulesFilePath) { + this.rulesFilePath = rulesFilePath; + } + + public void getRulesFromSite() { + String url = "https://cdn.jsdelivr.net/gh/gh0stkey/HaE@gh-pages/Rules.yml"; + OkHttpClient httpClient = new OkHttpClient(); + Request httpRequest = new Request.Builder().url(url).get().build(); + try { + Response httpResponse = httpClient.newCall(httpRequest).execute(); + // 获取官方规则文件,在线更新写入 + FileOutputStream fileOutputStream = new FileOutputStream(this.rulesFilePath); + 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); + } + } +} diff --git a/src/main/java/burp/rule/utils/YamlTool.java b/src/main/java/burp/rule/utils/YamlTool.java new file mode 100644 index 0000000..ff8c7be --- /dev/null +++ b/src/main/java/burp/rule/utils/YamlTool.java @@ -0,0 +1,35 @@ +package burp.rule.utils; + +import java.util.Map; +import org.yaml.snakeyaml.DumperOptions; +import org.yaml.snakeyaml.Yaml; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.InputStream; +import org.yaml.snakeyaml.representer.Representer; + +/** + * @author EvilChen + */ + +public class YamlTool { + + public static Yaml newStandardYaml() { + DumperOptions dop = new DumperOptions(); + dop.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); + Representer representer = new Representer(); + return new Yaml(representer, dop); + } + + public static Map loadYaml(String filePath) { + try { + InputStream inputStream = new FileInputStream(filePath); + Yaml yaml = newStandardYaml(); + return yaml.load(inputStream); + } catch (FileNotFoundException e) { + e.printStackTrace(); + return null; + } + } +} + diff --git a/src/main/java/burp/ui/Databoard.java b/src/main/java/burp/ui/Databoard.java deleted file mode 100644 index 3562b53..0000000 --- a/src/main/java/burp/ui/Databoard.java +++ /dev/null @@ -1,248 +0,0 @@ -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; - -import java.awt.*; -import java.awt.event.*; -import java.util.ArrayList; -import java.util.Map; -import javax.swing.*; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; - -/** - * @author LinChen && EvilChen - */ - -public class Databoard extends JPanel { - public Databoard() { - initComponents(); - } - - /** - * 清空数据 - */ - private void clearActionPerformed(ActionEvent e) { - // 清空页面 - dataTabbedPane.removeAll(); - String host = hostTextField.getText(); - if (host.contains("*")) { - Map>> ruleMap = Config.globalDataMap; - ruleMap.keySet().forEach(i -> { - if (i.contains(host.replace("*.", "")) || host.equals("*")) { - 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()); - ((GridBagLayout)getLayout()).columnWidths = new int[] {25, 0, 0, 0, 20, 0}; - ((GridBagLayout)getLayout()).rowHeights = new int[] {0, 65, 20, 0}; - ((GridBagLayout)getLayout()).columnWeights = new double[] {0.0, 0.0, 1.0, 0.0, 0.0, 1.0E-4}; - ((GridBagLayout)getLayout()).rowWeights = new double[] {0.0, 1.0, 0.0, 1.0E-4}; - - //---- hostLabel ---- - hostLabel.setText("Host:"); - add(hostLabel, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0, - GridBagConstraints.CENTER, GridBagConstraints.BOTH, - new Insets(8, 0, 5, 5), 0, 0)); - 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)); - - setAutoMatch(hostTextField, dataTabbedPane); - } - - /** - * 获取Host列表 - */ - private static List getHostByList(){ - List hostList = new ArrayList<>(); - hostList.addAll(Config.globalDataMap.keySet()); - return hostList; - } - - /** - * 设置输入自动匹配 - */ - public static void setAutoMatch(JTextField textField, JTabbedPane tabbedPane) { - final DefaultComboBoxModel comboBoxModel = new DefaultComboBoxModel(); - - final JComboBox hostComboBox = new JComboBox(comboBoxModel) { - @Override - public Dimension getPreferredSize() { - return new Dimension(super.getPreferredSize().width, 0); - } - }; - - isMatchHost = false; - - for (String host : getHostByList()) { - comboBoxModel.addElement(host); - } - - hostComboBox.setSelectedItem(null); - - hostComboBox.addActionListener(e -> { - if (!isMatchHost) { - if (hostComboBox.getSelectedItem() != null) { - textField.setText(hostComboBox.getSelectedItem().toString()); - getInfoByHost(hostComboBox, tabbedPane, textField); - } - } - }); - - // 事件监听 - textField.addKeyListener(new KeyAdapter() { - @Override - public void keyPressed(KeyEvent e) { - isMatchHost = true; - if (e.getKeyCode() == KeyEvent.VK_SPACE) { - if (hostComboBox.isPopupVisible()) { - e.setKeyCode(KeyEvent.VK_ENTER); - } - } - if (e.getKeyCode() == KeyEvent.VK_ENTER - || e.getKeyCode() == KeyEvent.VK_UP - || e.getKeyCode() == KeyEvent.VK_DOWN) { - e.setSource(hostComboBox); - hostComboBox.dispatchEvent(e); - if (e.getKeyCode() == KeyEvent.VK_ENTER) { - textField.setText(hostComboBox.getSelectedItem().toString()); - getInfoByHost(hostComboBox, tabbedPane, textField); - hostComboBox.setPopupVisible(false); - } - } - if (e.getKeyCode() == KeyEvent.VK_ESCAPE) { - hostComboBox.setPopupVisible(false); - } - isMatchHost = false; - } - }); - - textField.getDocument().addDocumentListener(new DocumentListener() { - @Override - public void insertUpdate(DocumentEvent e) { - updateList(); - } - - @Override - public void removeUpdate(DocumentEvent e) { - updateList(); - } - - @Override - public void changedUpdate(DocumentEvent e) { - updateList(); - } - - private void updateList() { - isMatchHost = true; - comboBoxModel.removeAllElements(); - String input = textField.getText(); - if (!input.isEmpty()){ - for (String host : getHostByList()) { - if (host.toLowerCase().contains(input.toLowerCase())) { - if (host.length() == input.length()){ - comboBoxModel.insertElementAt(host,0); - comboBoxModel.setSelectedItem(host); - }else{ - comboBoxModel.addElement(host); - } - } - } - } - hostComboBox.setPopupVisible(comboBoxModel.getSize() > 0); - isMatchHost = false; - } - }); - - textField.setLayout(new BorderLayout()); - textField.add(hostComboBox, BorderLayout.SOUTH); - } - - private static void getInfoByHost(@NotNull JComboBox hostComboBox, JTabbedPane tabbedPane, JTextField textField) { - if (hostComboBox.getSelectedItem() != null) { - Map>> ruleMap = Config.globalDataMap; - Map> selectHost = new HashMap<>(); - String host = hostComboBox.getSelectedItem().toString(); - if (host.contains("*")) { - // 通配符数据 - Map> finalSelectHost = selectHost; - ruleMap.keySet().forEach(i -> { - if (i.contains(host.replace("*.", "")) || host.equals("*")) { - 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: selectHost.entrySet()){ - tabbedPane.addTab(String.format("%s (%s)", entry.getKey(), entry.getValue().size()), new JScrollPane(new HitRuleDataList(entry.getValue()))); - } - textField.setText(hostComboBox.getSelectedItem().toString()); - } - } - - // JFormDesigner - Variables declaration - DO NOT MODIFY //GEN-BEGIN:variables - private JLabel hostLabel; - private JTextField hostTextField; - private JTabbedPane dataTabbedPane; - private JButton clearButton; - // JFormDesigner - End of variables declaration //GEN-END:variables - - // 是否自动匹配Host - private static Boolean isMatchHost = false; -} -class HitRuleDataList extends JTable { - public HitRuleDataList(List list){ - DefaultTableModel model = new DefaultTableModel(); - Object[][] data = new Object[list.size()][1]; - for (int x = 0; x < list.size(); x++) { - data[x][0] = list.get(x); - } - model.setDataVector(data, new Object[]{"Information"}); - this.setAutoCreateRowSorter(true); - this.setModel(model); - } -} diff --git a/src/main/java/burp/ui/JTabbedPaneCloseButton.java b/src/main/java/burp/ui/JTabbedPaneCloseButton.java deleted file mode 100644 index 4bd8ccb..0000000 --- a/src/main/java/burp/ui/JTabbedPaneCloseButton.java +++ /dev/null @@ -1,114 +0,0 @@ -package burp.ui; - -import javax.swing.*; -import javax.swing.plaf.metal.MetalIconFactory; -import java.awt.*; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; - -/** - * @author 6dc - * - * A class which creates a JTabbedPane and auto sets a close button when you add a tab - */ - -public class JTabbedPaneCloseButton extends JTabbedPane { - - public JTabbedPaneCloseButton() { - super(); - } - - /** Override Addtab in order to add the close Button everytime */ - @Override - public void addTab(String title, Icon icon, Component component, String tip) { - super.addTab(title, icon, component, tip); - int count = this.getTabCount() - 1; - setTabComponentAt(count, new CloseButtonTab(component, title, icon)); - } - - @Override - public void addTab(String title, Icon icon, Component component) { - addTab(title, icon, component, null); - } - - @Override - public void addTab(String title, Component component) { - addTab(title, null, component); - } - - - public void addTab(String title,Component component,Boolean closewith){ - if (closewith){ - addTab(title,component); - }else{ - super.addTab(title,null,component,null); - } - } - - /** addTabNoExit */ - public void addTabNoExit(String title, Icon icon, Component component, String tip) { - super.addTab(title, icon, component, tip); - } - - public void addTabNoExit(String title, Icon icon, Component component) { - addTabNoExit(title, icon, component, null); - } - - public void addTabNoExit(String title, Component component) { - addTabNoExit(title, null, component); - } - - /** Button */ - public class CloseButtonTab extends JPanel { - public CloseButtonTab(final Component tab, String title, Icon icon) { - setOpaque(false); - FlowLayout flowLayout = new FlowLayout(FlowLayout.CENTER, 3, 3); - setLayout(flowLayout); - JLabel jLabel = new JLabel(title); - jLabel.setIcon(icon); - add(jLabel); - JButton button = new JButton(MetalIconFactory.getInternalFrameCloseIcon(2)); - button.setMargin(new Insets(0, 0, 0, 0)); - button.addMouseListener(new CloseListener(tab)); - add(button); - } - } - /** ClickListener */ - public class CloseListener implements MouseListener - { - private final Component tab; - - public CloseListener(Component tab){ - this.tab=tab; - } - - @Override - public void mouseClicked(MouseEvent e) { - if(e.getSource() instanceof JButton){ - JButton clickedButton = (JButton) e.getSource(); - JTabbedPane tabbedPane = (JTabbedPane) clickedButton.getParent().getParent().getParent(); - tabbedPane.remove(tab); - } - } - - @Override - public void mousePressed(MouseEvent e) {} - - @Override - public void mouseReleased(MouseEvent e) {} - - @Override - public void mouseEntered(MouseEvent e) { - if(e.getSource() instanceof JButton){ - JButton clickedButton = (JButton) e.getSource(); - } - } - - @Override - public void mouseExited(MouseEvent e) { - if(e.getSource() instanceof JButton){ - JButton clickedButton = (JButton) e.getSource(); - } - } - } -} \ No newline at end of file diff --git a/src/main/java/burp/ui/MainUI.java b/src/main/java/burp/ui/MainUI.java index bca2d83..b6e46bd 100644 --- a/src/main/java/burp/ui/MainUI.java +++ b/src/main/java/burp/ui/MainUI.java @@ -1,13 +1,12 @@ package burp.ui; -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 burp.config.ConfigEntry; +import burp.config.ConfigLoader; +import burp.rule.RuleProcessor; +import burp.rule.utils.RuleTool; +import burp.ui.board.Databoard; +import burp.ui.board.MessagePanel; +import burp.ui.rule.RulePane; import javax.swing.*; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; @@ -21,26 +20,22 @@ import java.util.Map; * @author LinChen && EvilChen */ -public class MainUI extends JPanel{ - private final LoadConfig loadConn = new LoadConfig(); +public class MainUI extends JPanel { + private final ConfigLoader loadConn = new ConfigLoader(); + private MessagePanel messagePanel; - public MainUI() { + public MainUI(MessagePanel messagePanel) { + this.messagePanel = messagePanel; + databoardPanel = new Databoard(this.messagePanel); initComponents(); } - public void closeTabActionPerformed(ActionEvent e){ - if (ruleTabbedPane.getTabCount()>2){ - if (ruleTabbedPane.getSelectedIndex()!=0){ - SetConfig setConn = new SetConfig(); - setConn.deleteRules(ruleTabbedPane.getTitleAt(ruleTabbedPane.getSelectedIndex())); - ruleTabbedPane.remove(ruleTabbedPane.getSelectedIndex()); - ruleTabbedPane.setSelectedIndex(ruleTabbedPane.getSelectedIndex()-1); - } else { - SetConfig setConn = new SetConfig(); - setConn.deleteRules(ruleTabbedPane.getTitleAt(ruleTabbedPane.getSelectedIndex())); - ruleTabbedPane.remove(ruleTabbedPane.getSelectedIndex()); - ruleTabbedPane.setSelectedIndex(ruleTabbedPane.getSelectedIndex()); - } + public void closeTabActionPerformed(ActionEvent e) { + if (ruleTabbedPane.getTabCount() > 2 && ruleTabbedPane.getSelectedIndex() != 0) { + String title = ruleTabbedPane.getTitleAt(ruleTabbedPane.getSelectedIndex()); + new RuleProcessor().deleteRuleGroup(title); + ruleTabbedPane.remove(ruleTabbedPane.getSelectedIndex()); + ruleTabbedPane.setSelectedIndex(ruleTabbedPane.getSelectedIndex() - 1); } } @@ -49,23 +44,10 @@ public class MainUI extends JPanel{ 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://cdn.jsdelivr.net/gh/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(); + String rulesFilePath = rulesPathTextField.getText(); + RuleTool rt = new RuleTool(rulesFilePath); + rt.getRulesFromSite(); + new ConfigLoader(); reloadRule(); } } @@ -73,12 +55,13 @@ public class MainUI extends JPanel{ private void reloadRule(){ ruleTabbedPane.removeAll(); ruleSwitch.setListen(false); - Map rules = LoadConfig.getRules(); + Map rules = ConfigLoader.getRules(); rules.keySet().forEach( - i-> ruleTabbedPane.addTab( + i -> ruleTabbedPane.addTab( i, new RulePane(rules.get(i), ruleTabbedPane) ) + ); ruleTabbedPane.addTab("...", new JLabel()); ruleSwitch.setListen(true); @@ -89,20 +72,20 @@ public class MainUI extends JPanel{ } private void excludeSuffixSaveActionPerformed(ActionEvent e) { - LoadConfig loadCon = new LoadConfig(); + ConfigLoader loadCon = new ConfigLoader(); loadCon.setExcludeSuffix(excludeSuffixTextField.getText()); } private void initComponents() { - mainTabbedPane = new JTabbedPane(); + JTabbedPane mainTabbedPane = new JTabbedPane(); ruleTabbedPane = new JTabbedPane(); - rulePanel = new JPanel(); - configTextField = new JTextField(); - configLabel = new JLabel(); - onlineUpdateButton = new JButton(); - reloadButton = new JButton(); - excludeSuffixLabel = new JLabel(); + JPanel rulePanel = new JPanel(); + rulesPathTextField = new JTextField(); + JLabel rulesPathLabel = new JLabel(); + JButton onlineUpdateButton = new JButton(); + JButton reloadButton = new JButton(); + JLabel excludeSuffixLabel = new JLabel(); excludeSuffixTextField = new JTextField(); - excludeSuffixSaveButton = new JButton(); + JButton excludeSuffixSaveButton = new JButton(); setLayout(new GridBagLayout()); ((GridBagLayout)getLayout()).columnWidths = new int[] {0, 0}; @@ -120,13 +103,13 @@ public class MainUI extends JPanel{ ((GridBagLayout) rulePanel.getLayout()).columnWeights = new double[] {0.0, 1.0, 0.0, 0.0, 1.0E-4}; ((GridBagLayout) rulePanel.getLayout()).rowWeights = new double[] {0.0, 0.0, 1.0E-4}; - configTextField.setEditable(false); - rulePanel.add(configTextField, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0, + rulesPathTextField.setEditable(false); + rulePanel.add(rulesPathTextField, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(5, 0, 5, 5), 0, 0)); - configLabel.setText("Config Path:"); - rulePanel.add(configLabel, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0, + rulesPathLabel.setText("Rules Path:"); + rulePanel.add(rulesPathLabel, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.VERTICAL, new Insets(5, 5, 5, 5), 0, 0)); @@ -158,39 +141,33 @@ public class MainUI extends JPanel{ new Insets(0, 0, 0, 5), 0, 0)); } mainTabbedPane.addTab("Config", rulePanel); - mainTabbedPane.addTab("Databoard", databoardPanel); + mainTabbedPane.addTab("Databoard", this.databoardPanel); } add(mainTabbedPane, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0)); - Config.ruleConfig.keySet().forEach(i-> ruleTabbedPane.addTab(i,new RulePane(Config.ruleConfig.get(i), + ConfigEntry.globalRules.keySet().forEach(i-> ruleTabbedPane.addTab(i, new RulePane( + ConfigEntry.globalRules.get(i), ruleTabbedPane))); ruleTabbedPane.addTab("...",new JLabel()); - configTextField.setText(LoadConfig.getConfigPath()); + rulesPathTextField.setText(ConfigLoader.getRulesFilePath()); excludeSuffixTextField.setText(loadConn.getExcludeSuffix()); ruleSwitch = new TabTitleEditListener(ruleTabbedPane); ruleTabbedPane.addChangeListener(ruleSwitch); ruleTabbedPane.addMouseListener(ruleSwitch); - closeTabMenuItem.addActionListener(this::closeTabActionPerformed); - tabMenu.add(closeTabMenuItem); + deleteMenuItem.addActionListener(this::closeTabActionPerformed); + tabMenu.add(deleteMenuItem); } - private JTabbedPane mainTabbedPane; private JTabbedPane ruleTabbedPane; - private JPanel rulePanel; - private JTextField configTextField; - private JLabel configLabel; - private JButton onlineUpdateButton; - private JButton reloadButton; - private JLabel excludeSuffixLabel; + private JTextField rulesPathTextField; private JTextField excludeSuffixTextField; - private JButton excludeSuffixSaveButton; - private Databoard databoardPanel = new Databoard(); + private Databoard databoardPanel; protected static JPopupMenu tabMenu = new JPopupMenu(); - private JMenuItem closeTabMenuItem = new JMenuItem("Delete"); + private final JMenuItem deleteMenuItem = new JMenuItem("Delete"); private TabTitleEditListener ruleSwitch; } @@ -203,7 +180,7 @@ class TabTitleEditListener extends MouseAdapter implements ChangeListener, Docum protected Dimension dim; protected Component tabComponent; protected Boolean isRenameOk = false; - protected SetConfig setConfig = new SetConfig(); + protected RuleProcessor ruleProcessor = new RuleProcessor(); protected final Action startEditing = new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { @@ -227,7 +204,7 @@ class TabTitleEditListener extends MouseAdapter implements ChangeListener, Docum if (editingIndex >= 0 && !title.isEmpty()) { String oldName = ruleEditTabbedPane.getTitleAt(editingIndex); ruleEditTabbedPane.setTitleAt(editingIndex, title); - setConfig.rename(oldName,title); + ruleProcessor.renameRuleGroup(oldName,title); } cancelEditing.actionPerformed(null); } @@ -285,7 +262,7 @@ class TabTitleEditListener extends MouseAdapter implements ChangeListener, Docum public void newTab(){ Object[][] data = new Object[][]{{false, "New Name", "(New Regex)", "gray", "any", "nfa", false}}; - insertTab(ruleEditTabbedPane, setConfig.newRules(),data); + insertTab(ruleEditTabbedPane, ruleProcessor.newRule(),data); } public void insertTab(JTabbedPane pane,String title,Object[][] data){ diff --git a/src/main/java/burp/ui/RuleSetting.java b/src/main/java/burp/ui/RuleSetting.java deleted file mode 100644 index 20aff1c..0000000 --- a/src/main/java/burp/ui/RuleSetting.java +++ /dev/null @@ -1,118 +0,0 @@ -package burp.ui; - -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.ItemEvent; -import java.awt.event.ItemListener; -import javax.swing.*; -import java.awt.*; -import burp.Config; - -/** - * @author LinChen - */ - -public class RuleSetting extends JPanel { - public RuleSetting() { - initComponents(); - } - - public void initComponents() { - sensitiveLabel = new JLabel(); - engineLabel = new JLabel(); - scopeLabel = new JLabel(); - regexTextField = new JTextField(); - regexLabel = new JLabel(); - nameLabel = new JLabel(); - ruleNameTextField = new JTextField(); - scopeComboBox = new JComboBox<>(); - engineComboBox = new JComboBox<>(); - colorLabel = new JLabel(); - colorComboBox = new JComboBox<>(); - sensitiveComboBox = new JComboBox<>(); - - setLayout(null); - - engineLabel.setText("Engine:"); - add(engineLabel); - engineLabel.setBounds(new Rectangle(new Point(10, 175), engineLabel.getPreferredSize())); - - sensitiveLabel.setText("Sensitive:"); - add(sensitiveLabel); - sensitiveLabel.setBounds(new Rectangle(new Point(10,215), sensitiveLabel.getPreferredSize())); - - scopeLabel.setText("Scope:"); - add(scopeLabel); - scopeLabel.setBounds(new Rectangle(new Point(10, 135), scopeLabel.getPreferredSize())); - add(regexTextField); - regexTextField.setBounds(70, 50, 265, 30); - - regexLabel.setText("Regex:"); - add(regexLabel); - regexLabel.setBounds(new Rectangle(new Point(10, 55), regexLabel.getPreferredSize())); - - nameLabel.setText("Name:"); - add(nameLabel); - nameLabel.setBounds(new Rectangle(new Point(10, 15), nameLabel.getPreferredSize())); - add(ruleNameTextField); - ruleNameTextField.setBounds(70, 10, 265, 30); - - scopeComboBox.setModel(new DefaultComboBoxModel<>(Config.scopeArray)); - add(scopeComboBox); - scopeComboBox.setBounds(70, 130, 265, scopeComboBox.getPreferredSize().height); - - engineComboBox.setModel(new DefaultComboBoxModel<>(Config.engineArray)); - engineComboBox.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - String engineValue = engineComboBox.getSelectedItem().toString(); - if (engineValue.equals("nfa")) { - sensitiveComboBox.setEnabled(true); - } else { - sensitiveComboBox.setEnabled(false); - } - } - }); - add(engineComboBox); - engineComboBox.setBounds(70, 170, 265, engineComboBox.getPreferredSize().height); - - colorLabel.setText("Color:"); - add(colorLabel); - colorLabel.setBounds(new Rectangle(new Point(10, 95), colorLabel.getPreferredSize())); - - colorComboBox.setModel(new DefaultComboBoxModel<>(Config.colorArray)); - add(colorComboBox); - colorComboBox.setBounds(70, 90, 265, colorComboBox.getPreferredSize().height); - - sensitiveComboBox.setModel(new DefaultComboBoxModel<>(new Boolean[]{true, false})); - add(sensitiveComboBox); - sensitiveComboBox.setBounds(70,210,265,sensitiveComboBox.getPreferredSize().height); - - { - Dimension preferredSize = new Dimension(); - for(int i = 0; i < getComponentCount(); i++) { - Rectangle bounds = getComponent(i).getBounds(); - preferredSize.width = Math.max(bounds.x + bounds.width, preferredSize.width); - preferredSize.height = Math.max(bounds.y + bounds.height, preferredSize.height); - } - Insets insets = getInsets(); - preferredSize.width += insets.right; - preferredSize.height += insets.bottom; - setMinimumSize(preferredSize); - setPreferredSize(preferredSize); - } - } - - private JLabel engineLabel; - private JLabel sensitiveLabel; - private JLabel scopeLabel; - public JTextField regexTextField; - private JLabel regexLabel; - private JLabel nameLabel; - public JTextField ruleNameTextField; - public JComboBox scopeComboBox; - public JComboBox engineComboBox; - private JLabel colorLabel; - public JComboBox colorComboBox; - public JComboBox sensitiveComboBox; -} diff --git a/src/main/java/burp/ui/board/CustomTableCellRenderer.java b/src/main/java/burp/ui/board/CustomTableCellRenderer.java new file mode 100644 index 0000000..6b22c15 --- /dev/null +++ b/src/main/java/burp/ui/board/CustomTableCellRenderer.java @@ -0,0 +1,64 @@ +package burp.ui.board; + +import java.awt.Color; +import java.awt.Component; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.swing.JTable; +import javax.swing.table.DefaultTableCellRenderer; + +public class CustomTableCellRenderer extends DefaultTableCellRenderer { + + private List log; + private Map colorMap = new HashMap<>(); + private JTable table; // 保存对表格的引用 + + public CustomTableCellRenderer(List log, JTable table) { + this.log = log; + this.colorMap.put("red", Color.RED); + this.colorMap.put("orange", Color.ORANGE); + this.colorMap.put("yellow", Color.YELLOW); + this.colorMap.put("green", Color.GREEN); + this.colorMap.put("cyan", Color.CYAN); + this.colorMap.put("blue", Color.BLUE); + this.colorMap.put("pink", Color.PINK); + this.colorMap.put("magenta", Color.MAGENTA); + this.colorMap.put("gray", Color.GRAY); + this.table = table; + } + + @Override + public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, + boolean hasFocus, int row, int column) { + Component component = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); + + LogEntry logEntry = log.get(table.convertRowIndexToModel(row)); // 使用convertRowIndexToModel方法转换行索引 + + // 设置颜色 + String colorByLog = logEntry.getColor(); + Color color = colorMap.get(colorByLog); + + if (isSelected) { + // 如果行被选中,设置阴影颜色 + component.setBackground(new Color(173, 216, 230)); // Light Blue + } else { + // 否则使用原始颜色 + component.setBackground(color); + } + + return component; + } + + @Override + public void firePropertyChange(String propertyName, Object oldValue, Object newValue) { + super.firePropertyChange(propertyName, oldValue, newValue); + // 监听表格排序的属性变化 + if ("tableCellRenderer".equals(propertyName)) { + // 更新每一行数据的颜色 + for (int i = 0; i < table.getRowCount(); i++) { + table.repaint(table.getCellRect(i, 0, true)); + } + } + } +} diff --git a/src/main/java/burp/ui/board/Databoard.java b/src/main/java/burp/ui/board/Databoard.java new file mode 100644 index 0000000..88fc39f --- /dev/null +++ b/src/main/java/burp/ui/board/Databoard.java @@ -0,0 +1,358 @@ +package burp.ui.board; + +import burp.config.ConfigEntry; +import burp.core.utils.StringHelper; +import burp.ui.board.MessagePanel.Table; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import javax.swing.table.DefaultTableModel; +import javax.swing.table.TableColumn; +import javax.swing.table.TableColumnModel; +import javax.swing.table.TableModel; +import javax.swing.table.TableRowSorter; +import java.awt.*; +import java.awt.event.*; +import java.util.ArrayList; +import java.util.Map; +import javax.swing.*; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; + +/** + * @author LinChen && EvilChen + */ + +public class Databoard extends JPanel { + private static Boolean isMatchHost = false; + private JLabel hostLabel; + private JTextField hostTextField; + private JTabbedPane dataTabbedPaneA; + private JTabbedPane dataTabbedPaneB; + private JButton clearButton; + private JSplitPane splitPane; + private MessagePanel messagePanel; + private Table table; + + public Databoard(MessagePanel messagePanel) { + this.messagePanel = messagePanel; + initComponents(); + } + + private void cleanUI() { + dataTabbedPaneA.removeAll(); + dataTabbedPaneB.removeAll(); + splitPane.setVisible(false); + } + + private void clearActionPerformed(ActionEvent e) { + cleanUI(); + + String host = hostTextField.getText(); + String cleanedHost = StringHelper.replaceFirstOccurrence(host, "*.", ""); + + if (host.contains("*")) { + ConfigEntry.globalDataMap.keySet().removeIf(i -> i.contains(cleanedHost) || cleanedHost.equals("**")); + } else { + ConfigEntry.globalDataMap.remove(host); + } + + messagePanel.deleteByHost(cleanedHost); + } + + + private void initComponents() { + // JFormDesigner - Component initialization - DO NOT MODIFY //GEN-BEGIN:initComponents + hostLabel = new JLabel(); + hostTextField = new JTextField(); + dataTabbedPaneA = new JTabbedPane(JTabbedPane.TOP); + dataTabbedPaneB = new JTabbedPane(JTabbedPane.TOP); + clearButton = new JButton(); + + //======== this ======== + setLayout(new GridBagLayout()); + ((GridBagLayout)getLayout()).columnWidths = new int[] {25, 0, 0, 0, 20, 0}; + ((GridBagLayout)getLayout()).rowHeights = new int[] {0, 65, 20, 0}; + ((GridBagLayout)getLayout()).columnWeights = new double[] {0.0, 0.0, 1.0, 0.0, 0.0, 1.0E-4}; + ((GridBagLayout)getLayout()).rowWeights = new double[] {0.0, 1.0, 0.0, 1.0E-4}; + + //---- hostLabel ---- + hostLabel.setText("Host:"); + add(hostLabel, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0, + GridBagConstraints.CENTER, GridBagConstraints.BOTH, + new Insets(8, 0, 5, 5), 0, 0)); + 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)); + + splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT); + splitPane.setVisible(false); + + add(splitPane, new GridBagConstraints(1, 1, 3, 2, 0.0, 0.0, + GridBagConstraints.CENTER, GridBagConstraints.BOTH, + new Insets(8, 0, 5, 5), 0, 0)); + + setAutoMatch(); + } + + private static List getHostByList() { + return new ArrayList<>(ConfigEntry.globalDataMap.keySet()); + } + + /** + * 设置输入自动匹配 + */ + private void setAutoMatch() { + final DefaultComboBoxModel comboBoxModel = new DefaultComboBoxModel(); + + final JComboBox hostComboBox = new JComboBox(comboBoxModel) { + @Override + public Dimension getPreferredSize() { + return new Dimension(super.getPreferredSize().width, 0); + } + }; + + isMatchHost = false; + + for (String host : getHostByList()) { + comboBoxModel.addElement(host); + } + + hostComboBox.setSelectedItem(null); + + hostComboBox.addActionListener(e -> { + if (!isMatchHost) { + if (hostComboBox.getSelectedItem() != null) { + hostTextField.setText(hostComboBox.getSelectedItem().toString()); + populateTabbedPaneByHost(hostComboBox); + } + } + }); + + // 事件监听 + hostTextField.addKeyListener(new KeyAdapter() { + @Override + public void keyPressed(KeyEvent e) { + isMatchHost = true; + int keyCode = e.getKeyCode(); + + if (keyCode == KeyEvent.VK_SPACE && hostComboBox.isPopupVisible()) { + e.setKeyCode(KeyEvent.VK_ENTER); + } + + if (keyCode == KeyEvent.VK_ENTER || keyCode == KeyEvent.VK_UP || keyCode == KeyEvent.VK_DOWN) { + e.setSource(hostComboBox); + hostComboBox.dispatchEvent(e); + + if (keyCode == KeyEvent.VK_ENTER) { + String selectedItem = hostComboBox.getSelectedItem().toString(); + hostTextField.setText(selectedItem); + populateTabbedPaneByHost(hostComboBox); + hostComboBox.setPopupVisible(false); + return; + } + } + + if (keyCode == KeyEvent.VK_ESCAPE) { + hostComboBox.setPopupVisible(false); + } + + isMatchHost = false; + } + }); + + hostTextField.getDocument().addDocumentListener(new DocumentListener() { + @Override + public void insertUpdate(DocumentEvent e) { + updateList(); + + } + + @Override + public void removeUpdate(DocumentEvent e) { + updateList(); + } + + @Override + public void changedUpdate(DocumentEvent e) { + updateList(); + } + + private void updateList() { + isMatchHost = true; + comboBoxModel.removeAllElements(); + String input = hostTextField.getText().toLowerCase(); + if (!input.isEmpty()){ + for (String host : getHostByList()) { + String lowerCaseHost = host.toLowerCase(); + if (lowerCaseHost.contains(input)) { + if (host.length() == input.length()){ + comboBoxModel.insertElementAt(host,0); + comboBoxModel.setSelectedItem(host); + } else { + comboBoxModel.addElement(host); + } + } + } + } + hostComboBox.setPopupVisible(comboBoxModel.getSize() > 0); + isMatchHost = false; + } + }); + + hostTextField.setLayout(new BorderLayout()); + hostTextField.add(hostComboBox, BorderLayout.SOUTH); + } + + private void applyHostFilter(String filterText) { + TableRowSorter sorter = (TableRowSorter) table.getRowSorter(); + if (filterText.contains("*.")) { + filterText = StringHelper.replaceFirstOccurrence(filterText, "*.", ""); + } else if (filterText.contains("*")) { + filterText = ""; + } + RowFilter filter = RowFilter.regexFilter(filterText, 1); + sorter.setRowFilter(filter); + filterText = filterText.isEmpty() ? "*" : filterText; + + messagePanel.applyHostFilter(filterText); + } + + private void populateTabbedPaneByHost(JComboBox hostComboBox) { + if (hostComboBox.getSelectedItem() != null) { + String selectedHost = hostComboBox.getSelectedItem().toString(); + Map>> dataMap = ConfigEntry.globalDataMap; + Map> selectedDataMap; + + if (selectedHost.contains("*")) { + // 通配符数据 + selectedDataMap = new HashMap<>(); + String hostPattern = StringHelper.replaceFirstOccurrence(selectedHost, "*.", ""); + for (String key : dataMap.keySet()) { + if (key.contains(hostPattern) || selectedHost.equals("*")) { + Map> ruleMap = dataMap.get(key); + for (String ruleKey : ruleMap.keySet()) { + List dataList = ruleMap.get(ruleKey); + if (selectedDataMap.containsKey(ruleKey)) { + List mergedList = new ArrayList<>(selectedDataMap.get(ruleKey)); + mergedList.addAll(dataList); + HashSet uniqueSet = new HashSet<>(mergedList); + selectedDataMap.put(ruleKey, new ArrayList<>(uniqueSet)); + } else { + selectedDataMap.put(ruleKey, dataList); + } + } + } + } + } else { + selectedDataMap = dataMap.get(selectedHost); + } + + // 由于removeChangeListener不知什么原因不生效,因此建立两个tabbedPane + dataTabbedPaneA.removeAll(); + dataTabbedPaneB.removeAll(); + + ChangeListener changeListenerInstance = new ChangeListener() { + @Override + public void stateChanged(ChangeEvent e) { + int selectedIndex = dataTabbedPaneA.getSelectedIndex(); + String selectedTitle = ""; + if (selectedIndex != -1) { + selectedTitle = dataTabbedPaneA.getTitleAt(selectedIndex); + } + applyHostFilter(selectedTitle); + } + }; + + if (selectedHost.equals("**")) { + dataTabbedPaneA.setPreferredSize(new Dimension(500,0)); + dataTabbedPaneA.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT); + splitPane.setLeftComponent(dataTabbedPaneA); + for (Map.Entry>> entry : dataMap.entrySet()) { + JTabbedPane newTabbedPane = new JTabbedPane(); + newTabbedPane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT); + for (Map.Entry> entrySet : entry.getValue().entrySet()) { + Thread t = new Thread(() -> { + String tabTitle = String.format("%s (%s)", entrySet.getKey(), entrySet.getValue().size()); + newTabbedPane.addTab(tabTitle, new JScrollPane(new DataTable(entrySet.getKey(), entrySet.getValue()))); + dataTabbedPaneA.addTab(entry.getKey(), newTabbedPane); + }); + t.start(); + try { + t.join(); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + dataTabbedPaneA.addChangeListener(changeListenerInstance); + } else { + dataTabbedPaneB.setPreferredSize(new Dimension(500,0)); + dataTabbedPaneB.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT); + splitPane.setLeftComponent(dataTabbedPaneB); + for (Map.Entry> entry : selectedDataMap.entrySet()) { + String tabTitle = String.format("%s (%s)", entry.getKey(), entry.getValue().size()); + dataTabbedPaneB.addTab(tabTitle, new JScrollPane(new DataTable(entry.getKey(), entry.getValue()))); + } + } + + // 展示请求消息表单 + JSplitPane messageSplitPane = this.messagePanel.getPanel(); + this.splitPane.setRightComponent(messageSplitPane); + // 获取字段 + table = this.messagePanel.getTable(); + + // 设置对应字段宽度 + TableColumnModel columnModel = table.getColumnModel(); + TableColumn column = columnModel.getColumn(1); + column.setPreferredWidth(300); + column = columnModel.getColumn(2); + column.setPreferredWidth(300); + + splitPane.setVisible(true); + applyHostFilter(selectedHost); + + // 主动调用一次stateChanged,使得dataTabbedPane可以精准展示内容 + if (selectedHost.equals("**")) { + changeListenerInstance.stateChanged(null); + } + + hostTextField.setText(selectedHost); + } + } + + + class DataTable extends JTable { + public DataTable(String tableName, List list){ + DefaultTableModel model = new DefaultTableModel(); + Object[][] data = new Object[list.size()][1]; + for (int x = 0; x < list.size(); x++) { + data[x][0] = list.get(x); + } + model.setDataVector(data, new Object[]{"Information"}); + setAutoCreateRowSorter(true); + setModel(model); + setDefaultEditor(Object.class, null); + + addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + if (e.getClickCount() == 2) { + int selectedRow = getSelectedRow(); + if (selectedRow != -1) { + String rowData = getValueAt(selectedRow, 0).toString(); + messagePanel.applyMessageFilter(tableName, rowData); + } + } + } + }); + } + } +} diff --git a/src/main/java/burp/ui/board/LogEntry.java b/src/main/java/burp/ui/board/LogEntry.java new file mode 100644 index 0000000..6b0f39a --- /dev/null +++ b/src/main/java/burp/ui/board/LogEntry.java @@ -0,0 +1,47 @@ +package burp.ui.board; + +import burp.IHttpRequestResponsePersisted; +import java.net.URL; + +public class LogEntry { + + private final String comment; + private final IHttpRequestResponsePersisted requestResponse; + private final URL url; + private final String length; + private final String color; + private final String method; + + LogEntry(IHttpRequestResponsePersisted requestResponse, String method, URL url, String comment, String length, String color) { + this.requestResponse = requestResponse; + this.method = method; + this.url = url; + this.comment = comment; + this.length = length; + this.color = color; + } + + public String getColor() { + return this.color; + } + + public URL getUrl() { + return this.url; + } + + public String getLength() { + return this.length; + } + + public String getComment() { + return this.comment; + } + + public String getMethod() { + return this.method; + } + + public IHttpRequestResponsePersisted getRequestResponse() { + return this.requestResponse; + } +} diff --git a/src/main/java/burp/ui/board/MessagePanel.java b/src/main/java/burp/ui/board/MessagePanel.java new file mode 100644 index 0000000..9031881 --- /dev/null +++ b/src/main/java/burp/ui/board/MessagePanel.java @@ -0,0 +1,345 @@ +package burp.ui.board; + +import burp.IBurpExtenderCallbacks; +import burp.IExtensionHelpers; +import burp.IHttpRequestResponse; +import burp.IHttpRequestResponsePersisted; +import burp.IHttpService; +import burp.IMessageEditor; +import burp.IMessageEditorController; +import burp.config.ConfigEntry; +import burp.core.utils.StringHelper; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.List; +import javax.swing.JScrollPane; +import javax.swing.JSplitPane; +import javax.swing.JTabbedPane; +import javax.swing.JTable; +import javax.swing.SwingUtilities; +import javax.swing.SwingWorker; +import javax.swing.table.AbstractTableModel; +import javax.swing.table.DefaultTableModel; +import javax.swing.table.TableModel; +import javax.swing.table.TableRowSorter; + +/** + * @author EvilChen + */ + +public class MessagePanel extends AbstractTableModel implements IMessageEditorController { + private JSplitPane splitPane; + private IMessageEditor requestViewer; + private IMessageEditor responseViewer; + private final IBurpExtenderCallbacks callbacks; + private final List log = new ArrayList(); + private final List filteredLog = new ArrayList(); + private IHttpRequestResponse currentlyDisplayedItem; + private final IExtensionHelpers helpers; + private Table logTable; + + public MessagePanel(IBurpExtenderCallbacks callbacks, IExtensionHelpers helpers) { + this.callbacks = callbacks; + this.helpers = helpers; + + splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT); + + logTable = new Table(MessagePanel.this); + logTable.setDefaultRenderer(Object.class, new CustomTableCellRenderer(filteredLog, logTable)); + logTable.setAutoCreateRowSorter(true); + + // Length字段根据大小进行排序 + TableRowSorter sorter = (TableRowSorter) logTable.getRowSorter(); + sorter.setComparator(3, new Comparator() { + @Override + public int compare(String s1, String s2) { + Integer age1 = Integer.parseInt(s1); + Integer age2 = Integer.parseInt(s2); + return age1.compareTo(age2); + } + }); + // Color字段根据颜色顺序进行排序 + sorter.setComparator(4, new Comparator() { + @Override + public int compare(String s1, String s2) { + int index1 = getIndex(s1); + int index2 = getIndex(s2); + return Integer.compare(index1, index2); + } + private int getIndex(String color) { + for (int i = 0; i < ConfigEntry.colorArray.length; i++) { + if (ConfigEntry.colorArray[i].equals(color)) { + return i; + } + } + return -1; + } + }); + + logTable.setRowSorter(sorter); + logTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); + + JScrollPane scrollPane = new JScrollPane(logTable); + scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); + scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); + splitPane.setLeftComponent(scrollPane); + + JTabbedPane tabs = new JTabbedPane(); + requestViewer = callbacks.createMessageEditor(MessagePanel.this, false); + + responseViewer = callbacks.createMessageEditor(MessagePanel.this, false); + tabs.addTab("Request", requestViewer.getComponent()); + tabs.addTab("Response", responseViewer.getComponent()); + splitPane.setRightComponent(tabs); + } + + public JSplitPane getPanel() { + return splitPane; + } + + public Table getTable() { + return logTable; + } + + public List getLogs() { + return log; + } + + @Override + public int getRowCount() + { + return filteredLog.size(); + } + + @Override + public int getColumnCount() + { + return 5; + } + + @Override + public String getColumnName(int columnIndex) + { + switch (columnIndex) + { + case 0: + return "Method"; + case 1: + return "URL"; + case 2: + return "Comment"; + case 3: + return "Length"; + case 4: + return "Color"; + default: + return ""; + } + } + + @Override + public Class getColumnClass(int columnIndex) + { + return String.class; + } + + @Override + public Object getValueAt(int rowIndex, int columnIndex) + { + LogEntry logEntry = filteredLog.get(rowIndex); + switch (columnIndex) + { + case 0: + return logEntry.getMethod(); + case 1: + return logEntry.getUrl().toString(); + case 2: + return logEntry.getComment(); + case 3: + return logEntry.getLength(); + case 4: + return logEntry.getColor(); + default: + return ""; + } + } + + public void applyHostFilter(String filterText) { + filteredLog.clear(); + fireTableDataChanged(); + for (LogEntry entry : log) { + String host = entry.getUrl().getHost(); + if (StringHelper.matchFromEnd(host, filterText) || filterText.contains("*")) { + filteredLog.add(entry); + } + } + fireTableDataChanged(); + } + + public void applyMessageFilter(String tableName, String filterText) { + filteredLog.clear(); + for (LogEntry entry : log) { + IHttpRequestResponsePersisted requestResponse = entry.getRequestResponse(); + byte[] requestByte = requestResponse.getRequest(); + byte[] responseByte = requestResponse.getResponse(); + + List requestTmpHeaders = helpers.analyzeRequest(requestByte).getHeaders(); + byte[] requestHeaders = helpers.stringToBytes(String.join("\n", requestTmpHeaders)); + int requestBodyOffset = helpers.analyzeRequest(requestByte).getBodyOffset(); + byte[] requestBody = Arrays.copyOfRange(requestByte, requestBodyOffset, requestByte.length); + + List responseTmpHeaders = helpers.analyzeResponse(responseByte).getHeaders(); + byte[] responseHeaders = helpers.stringToBytes(String.join("\n", responseTmpHeaders)); + int responseBodyOffset = helpers.analyzeResponse(responseByte).getBodyOffset(); + byte[] responseBody = Arrays.copyOfRange(responseByte, responseBodyOffset, responseByte.length); + + final boolean[] isMatched = {false}; // 标志变量,表示是否满足过滤条件 + + ConfigEntry.globalRules.keySet().forEach(i -> { + for (Object[] objects : ConfigEntry.globalRules.get(i)) { + String name = objects[1].toString(); + String scope = objects[4].toString(); + if (name.contains(tableName)) { + boolean match = false; // 标志变量,表示当前规则是否匹配 + + switch (scope) { + case "any": + match = helpers.indexOf(requestByte, helpers.stringToBytes(filterText), true, 0, requestByte.length) != -1 || helpers.indexOf(responseByte, helpers.stringToBytes(filterText), true, 0, responseByte.length) != -1; + break; + case "request": + match = helpers.indexOf(requestByte, helpers.stringToBytes(filterText), true, 0, requestByte.length) != -1; + break; + case "response": + match = helpers.indexOf(responseByte, helpers.stringToBytes(filterText), true, 0, responseByte.length) != -1; + break; + case "any header": + match = helpers.indexOf(requestHeaders, helpers.stringToBytes(filterText), true, 0, requestHeaders.length) != -1 || helpers.indexOf(responseHeaders, helpers.stringToBytes(filterText), true, 0, responseHeaders.length) != -1; + break; + case "request header": + match = helpers.indexOf(requestHeaders, helpers.stringToBytes(filterText), true, 0, requestHeaders.length) != -1; + break; + case "response header": + match = helpers.indexOf(responseHeaders, helpers.stringToBytes(filterText), true, 0, responseHeaders.length) != -1; + break; + case "any body": + match = helpers.indexOf(requestBody, helpers.stringToBytes(filterText), true, 0, requestBody.length) != -1 || helpers.indexOf(responseBody, helpers.stringToBytes(filterText), true, 0, responseBody.length) != -1; + break; + case "request body": + match = helpers.indexOf(requestBody, helpers.stringToBytes(filterText), true, 0, requestBody.length) != -1; + break; + case "response body": + match = helpers.indexOf(responseBody, helpers.stringToBytes(filterText), true, 0, responseBody.length) != -1; + break; + default: + break; + } + + if (match) { + isMatched[0] = true; + break; + } + } + } + }); + + if (isMatched[0]) { + filteredLog.add(entry); + } + } + fireTableDataChanged(); + } + + public void deleteByHost(String filterText) { + filteredLog.clear(); + List rowsToRemove = new ArrayList<>(); + for (int i = 0; i < log.size(); i++) { + LogEntry entry = log.get(i); + String host = entry.getUrl().getHost(); + if (StringHelper.matchFromEnd(host, filterText) || filterText.contains("*")) { + rowsToRemove.add(i); + } + } + + for (int i = rowsToRemove.size() - 1; i >= 0; i--) { + int row = rowsToRemove.get(i); + log.remove(row); + } + + if (!rowsToRemove.isEmpty()) { + int[] rows = rowsToRemove.stream().mapToInt(Integer::intValue).toArray(); + fireTableRowsDeleted(rows[0], rows[rows.length - 1]); + } + } + + @Override + public byte[] getRequest() + { + return currentlyDisplayedItem.getRequest(); + } + + @Override + public byte[] getResponse() + { + return currentlyDisplayedItem.getResponse(); + } + + @Override + public IHttpService getHttpService() + { + return currentlyDisplayedItem.getHttpService(); + } + + public void add(IHttpRequestResponse messageInfo, String comment, String length, String color) { + synchronized(log) + { + LogEntry logEntry = new LogEntry(callbacks.saveBuffersToTempFiles(messageInfo), helpers.analyzeRequest(messageInfo).getMethod(), + helpers.analyzeRequest(messageInfo).getUrl(), comment, length, color); + log.add(logEntry); + } + } + + public class Table extends JTable { + LogEntry logEntry; + private SwingWorker currentWorker; + + public Table(TableModel tableModel) { + super(tableModel); + } + + @Override + public void changeSelection(int row, int col, boolean toggle, boolean extend) { + logEntry = filteredLog.get(convertRowIndexToModel(row)); + requestViewer.setMessage("Loading...".getBytes(), true); + responseViewer.setMessage("Loading...".getBytes(), false); + currentlyDisplayedItem = logEntry.getRequestResponse(); + + // 取消之前的后台任务 + if (currentWorker != null && !currentWorker.isDone()) { + currentWorker.cancel(true); + } + // 在后台线程中执行耗时操作 + SwingWorker worker = new SwingWorker() { + @Override + protected Void doInBackground() throws Exception { + refreshMessage(); + return null; + } + }; + // 设置当前后台任务 + currentWorker = worker; + // 启动后台线程 + worker.execute(); + super.changeSelection(row, col, toggle, extend); + } + + private void refreshMessage() { + SwingUtilities.invokeLater(() -> { + requestViewer.setMessage(logEntry.getRequestResponse().getRequest(), true); + responseViewer.setMessage(logEntry.getRequestResponse().getResponse(), false); + }); + } + } + +} + diff --git a/src/main/java/burp/ui/RulePane.java b/src/main/java/burp/ui/rule/RulePane.java similarity index 79% rename from src/main/java/burp/ui/RulePane.java rename to src/main/java/burp/ui/rule/RulePane.java index 15cfaa5..4b66be2 100644 --- a/src/main/java/burp/ui/RulePane.java +++ b/src/main/java/burp/ui/rule/RulePane.java @@ -1,33 +1,54 @@ -package burp.ui; - -import burp.yaml.SetConfig; +package burp.ui.rule; +import burp.rule.RuleProcessor; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; import javax.swing.event.TableModelEvent; -import javax.swing.event.TableModelListener; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableRowSorter; import java.awt.*; import java.util.Vector; /** - * @author LinChen + * @author LinChen & EvilChen */ public class RulePane extends JPanel { + private RuleProcessor ruleProcessor = new RuleProcessor(); + private Boolean isEdit = false; + private DefaultTableModel model = createModel(); + private static final int YES_OPTION = JOptionPane.YES_OPTION; + private static final String[] TITLE = { + "Loaded", "Name", "Regex", "Color", "Scope", "Engine", "Sensitive" + }; + public RulePane(Object[][] data, JTabbedPane pane) { initComponents(data, pane); } - private SetConfig setConfig = new SetConfig(); - private Boolean isEdit = false; + private DefaultTableModel createModel() { + return new DefaultTableModel() { + @Override + public Class getColumnClass(int column) { + return (column == 0) ? Boolean.class : String.class; + } + + @Override + public boolean isCellEditable(int row, int column) { + return column == 0; + } + }; + } + + private void updateModel() { + model = (DefaultTableModel) ruleTable.getModel(); + } private void ruleAddActionPerformed(ActionEvent e, JTabbedPane pane) { RuleSetting ruleSettingPanel = new RuleSetting(); - int showState = JOptionPane.showConfirmDialog(null, ruleSettingPanel, "RuleSetting - Add Rule", JOptionPane.OK_OPTION); - if(showState == 0){ - Vector ruleData = new Vector(); + int showState = JOptionPane.showConfirmDialog(null, ruleSettingPanel, "Add Rule", JOptionPane.OK_OPTION); + if (showState == YES_OPTION) { + Vector ruleData = new Vector<>(); ruleData.add(false); ruleData.add(ruleSettingPanel.ruleNameTextField.getText()); ruleData.add(ruleSettingPanel.regexTextField.getText()); @@ -36,8 +57,8 @@ public class RulePane extends JPanel { ruleData.add(ruleSettingPanel.engineComboBox.getSelectedItem().toString()); ruleData.add(ruleSettingPanel.sensitiveComboBox.getSelectedItem()); model.insertRow(model.getRowCount(), ruleData); - model = (DefaultTableModel) ruleTable.getModel(); - setConfig.add(ruleData, pane.getTitleAt(pane.getSelectedIndex())); + updateModel(); + ruleProcessor.addRule(ruleData, pane.getTitleAt(pane.getSelectedIndex())); } } @@ -55,7 +76,7 @@ public class RulePane extends JPanel { ruleSettingPanel.engineComboBox.getSelectedItem().toString().equals("nfa") ); - int showState = JOptionPane.showConfirmDialog(null, ruleSettingPanel, "RuleSetting - Edit Rule", JOptionPane.OK_OPTION); + int showState = JOptionPane.showConfirmDialog(null, ruleSettingPanel, "Edit Rule", JOptionPane.OK_OPTION); if (showState == 0){ int select = ruleTable.convertRowIndexToModel(ruleTable.getSelectedRow()); model.setValueAt(ruleSettingPanel.ruleNameTextField.getText(), select, 1); @@ -65,19 +86,19 @@ public class RulePane extends JPanel { model.setValueAt(ruleSettingPanel.engineComboBox.getSelectedItem().toString(), select, 5); model.setValueAt(ruleSettingPanel.sensitiveComboBox.getSelectedItem(), select, 6); model = (DefaultTableModel) ruleTable.getModel(); - setConfig.edit((Vector) model.getDataVector().get(select), select, pane.getTitleAt(pane.getSelectedIndex())); + ruleProcessor.changeRule((Vector) model.getDataVector().get(select), select, pane.getTitleAt(pane.getSelectedIndex())); } } } private void ruleRemoveActionPerformed(ActionEvent e, JTabbedPane pane){ if (ruleTable.getSelectedRowCount() >= 1){ - int isOk = JOptionPane.showConfirmDialog(null, "Are your sure?", "RuleSetting - Delete Rule", JOptionPane.OK_OPTION); + int isOk = JOptionPane.showConfirmDialog(null, "Are your sure?", "Delete Rule", JOptionPane.OK_OPTION); if (isOk == 0){ int select = ruleTable.convertRowIndexToModel(ruleTable.getSelectedRow()); model.removeRow(select); model = (DefaultTableModel) ruleTable.getModel(); - setConfig.remove(select, pane.getTitleAt(pane.getSelectedIndex())); + ruleProcessor.removeRule(select, pane.getTitleAt(pane.getSelectedIndex())); } } } @@ -86,7 +107,7 @@ public class RulePane extends JPanel { if (e.getColumn() == 0 && ruleTable.getSelectedRow() != -1 && !isEdit){ model = (DefaultTableModel) ruleTable.getModel(); int select = ruleTable.convertRowIndexToModel(ruleTable.getSelectedRow()); - setConfig.edit((Vector) model.getDataVector().get(select), select, pane.getTitleAt(pane.getSelectedIndex())); + ruleProcessor.changeRule((Vector) model.getDataVector().get(select), select, pane.getTitleAt(pane.getSelectedIndex())); } } @@ -171,17 +192,10 @@ public class RulePane extends JPanel { GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 5, 3, 2), 0, 0)); - // JFormDesigner - End of component initialization //GEN-END:initComponents ruleTable.setModel(model); - model.setDataVector(data, title); - model.addTableModelListener(new TableModelListener() { - @Override - public void tableChanged(TableModelEvent e) { - ruleTableChange(e, pane); - } - }); - - ruleTable.setRowSorter(new TableRowSorter(model)); + model.setDataVector(data, TITLE); + model.addTableModelListener(e -> ruleTableChange(e, pane)); + ruleTable.setRowSorter(new TableRowSorter<>(model)); } // JFormDesigner - Variables declaration - DO NOT MODIFY //GEN-BEGIN:variables @@ -191,21 +205,5 @@ public class RulePane extends JPanel { public JTable ruleTable; public JButton removeButton; // JFormDesigner - End of variables declaration //GEN-END:variables - private final String[] title = new String[]{"Loaded", "Name", "Regex", "Color", "Scope", "Engine", "Sensitive"}; - private DefaultTableModel model = new DefaultTableModel() { - @Override - public Class getColumnClass (int column){ - if (column == 0) { - return Boolean.class; - }else{ - return String.class; - } - } - - @Override - public boolean isCellEditable(int row, int column){ - return column == 0; - } - }; } diff --git a/src/main/java/burp/ui/rule/RuleSetting.java b/src/main/java/burp/ui/rule/RuleSetting.java new file mode 100644 index 0000000..ca52ec3 --- /dev/null +++ b/src/main/java/burp/ui/rule/RuleSetting.java @@ -0,0 +1,71 @@ +package burp.ui.rule; + +import java.awt.*; +import javax.swing.*; +import burp.config.ConfigEntry; + +/** + * @author LinChen & EvilChen + */ + +public class RuleSetting extends JPanel { + + public JTextField regexTextField; + public JTextField ruleNameTextField; + public JComboBox scopeComboBox; + public JComboBox engineComboBox; + public JComboBox colorComboBox; + public JComboBox sensitiveComboBox; + + public RuleSetting() { + initComponents(); + } + + private void initComponents() { + setLayout(new GridBagLayout()); + GridBagConstraints c = new GridBagConstraints(); + c.fill = GridBagConstraints.BOTH; + + addLabel("Name:", 0, c); + ruleNameTextField = addTextField(0, c); + + addLabel("Regex:", 1, c); + regexTextField = addTextField(1, c); + + addLabel("Scope:", 2, c); + scopeComboBox = addComboBox(ConfigEntry.scopeArray, 2, c); + + addLabel("Engine:", 3, c); + engineComboBox = addComboBox(ConfigEntry.engineArray, 3, c); + engineComboBox.addActionListener(e -> sensitiveComboBox.setEnabled("nfa".equals(engineComboBox.getSelectedItem().toString()))); + + addLabel("Color:", 4, c); + colorComboBox = addComboBox(ConfigEntry.colorArray, 4, c); + + addLabel("Sensitive:", 5, c); + sensitiveComboBox = addComboBox(new Boolean[]{true, false}, 5, c); + } + + private void addLabel(String text, int y, GridBagConstraints c) { + JLabel label = new JLabel(text); + c.gridx = 0; + c.gridy = y; + add(label, c); + } + + private JTextField addTextField(int y, GridBagConstraints c) { + JTextField textField = new JTextField(35); + c.gridx = 1; + c.gridy = y; + add(textField, c); + return textField; + } + + private JComboBox addComboBox(T[] items, int y, GridBagConstraints c) { + JComboBox comboBox = new JComboBox<>(items); + c.gridx = 1; + c.gridy = y; + add(comboBox, c); + return comboBox; + } +} diff --git a/src/main/java/burp/yaml/LoadConfig.java b/src/main/java/burp/yaml/LoadConfig.java deleted file mode 100644 index 3bd68c1..0000000 --- a/src/main/java/burp/yaml/LoadConfig.java +++ /dev/null @@ -1,162 +0,0 @@ -package burp.yaml; - -import burp.Config; -import burp.yaml.template.*; - -import java.io.*; -import java.nio.charset.StandardCharsets; -import java.util.HashMap; -import java.util.Map; -import java.util.ArrayList; - -import org.yaml.snakeyaml.Yaml; -import org.yaml.snakeyaml.constructor.Constructor; -import org.yaml.snakeyaml.DumperOptions; -import org.yaml.snakeyaml.representer.Representer; -import org.yaml.snakeyaml.nodes.Tag; - -public class LoadConfig { - private static final Yaml yaml = new Yaml(); - private static String HaEConfigPath = String.format("%s/.config/HaE", System.getProperty("user.home")); - private static String SettingPath = String.format("%s/%s", HaEConfigPath, "Setting.yml"); - private static String ConfigPath = String.format("%s/%s", HaEConfigPath, "Config.yml"); - - public LoadConfig() { - // 构造函数,初始化配置 - File HaEConfigPathFile = new File(HaEConfigPath); - if (!(HaEConfigPathFile.exists() && HaEConfigPathFile.isDirectory())) { - HaEConfigPathFile.mkdirs(); - } - - File settingPathFile = new File(SettingPath); - if (!(settingPathFile.exists() && settingPathFile.isFile())) { - initSetting(); - initRules(); - } - Config.ruleConfig = LoadConfig.getRules(); - } - - - // 初始化设置信息 - public void initSetting() { - Map r = new HashMap<>(); - r.put("configPath", ConfigPath); - 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 initRules() { - Rule rule = new Rule(); - rule.setLoaded(true); - rule.setName("Email"); - rule.setColor("yellow"); - rule.setEngine("nfa"); - rule.setScope("response"); - rule.setRegex("(([a-zA-Z0-9][_|\\.])*[a-zA-Z0-9]+@([a-zA-Z0-9][-|_|\\.])*[a-zA-Z0-9]+\\.((?!js|css|jpg|jpeg|png|ico)[a-zA-Z]{2,}))"); - rule.setSensitive(false); - - Rules rules = new Rules(); - rules.setType("Basic Information"); - ArrayList rl = new ArrayList<>(); - rl.add(rule); - rules.setRule(rl); - ArrayList rls = new ArrayList<>(); - rls.add(rules); - RulesConfig config = new RulesConfig(); - config.setRules(rls); - - DumperOptions dop = new DumperOptions(); - dop.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); - Representer representer = new Representer(); - representer.addClassTag(Config.class, Tag.MAP); - - Yaml yaml = new Yaml(new Constructor(),representer,dop); - File f = new File(ConfigPath); - try{ - Writer ws = new OutputStreamWriter(new FileOutputStream(f), StandardCharsets.UTF_8); - yaml.dump(config,ws); - }catch (Exception ex){ - ex.printStackTrace(); - } - } - - // 获取配置路径 - public static String getConfigPath(){ - try { - InputStream inorder = new FileInputStream(SettingPath); - Map r = yaml.load(inorder); - return r.get("configPath").toString(); - } catch (FileNotFoundException e) { - e.printStackTrace(); - return ConfigPath; - } - - } - - // 获取不包含的后缀名 - public String getExcludeSuffix(){ - String excludeSuffix = ""; - File yamlSetting = new File(SettingPath); - if (yamlSetting.exists() && yamlSetting.isFile()) { - try { - InputStream inorder = new FileInputStream(SettingPath); - Map r = yaml.load(inorder); - excludeSuffix = r.get("excludeSuffix").toString(); - } catch (Exception e) { - // e.printStackTrace(); - excludeSuffix = ""; - } - } else { - excludeSuffix = Config.excludeSuffix; - } - return excludeSuffix; - } - - // 获取规则配置 - public static Map getRules(){ - InputStream inorder = null; - { - try { - inorder = new FileInputStream(getConfigPath()); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } - } - Yaml yaml = new Yaml(new Constructor(RulesConfig.class)); - RulesConfig rulesConfig = yaml.loadAs(inorder, RulesConfig.class); - Map resRule = new HashMap<>(); - rulesConfig.rules.forEach(i->{ - ArrayList data = new ArrayList<>(); - i.rule.forEach(j->{ - try { - data.add(j.getRuleObject()); - }catch (Exception e){ - e.printStackTrace(); - } - }); - resRule.put(i.getType(), data.toArray(new Object[data.size()][])); - }); - return resRule; - } - - - // 设置不包含的后缀名 - public void setExcludeSuffix(String excludeSuffix){ - Map r = new HashMap<>(); - r.put("configPath", getConfigPath()); - r.put("excludeSuffix", excludeSuffix); - try{ - Writer ws = new OutputStreamWriter(new FileOutputStream(SettingPath), StandardCharsets.UTF_8); - yaml.dump(r, ws); - }catch (Exception ex){ - ex.printStackTrace(); - } - } - -} \ No newline at end of file diff --git a/src/main/java/burp/yaml/RulesConfig.java b/src/main/java/burp/yaml/RulesConfig.java deleted file mode 100644 index 9f29549..0000000 --- a/src/main/java/burp/yaml/RulesConfig.java +++ /dev/null @@ -1,12 +0,0 @@ -package burp.yaml; - -import java.util.List; -import burp.yaml.template.Rules; - -public class RulesConfig { - public List rules; - - public void setRules(List rules) { - this.rules = rules; - } -} diff --git a/src/main/java/burp/yaml/SetConfig.java b/src/main/java/burp/yaml/SetConfig.java deleted file mode 100644 index ceacd0b..0000000 --- a/src/main/java/burp/yaml/SetConfig.java +++ /dev/null @@ -1,101 +0,0 @@ -package burp.yaml; - -import burp.Config; -import burp.yaml.template.Rule; -import burp.yaml.template.Rules; -import org.yaml.snakeyaml.DumperOptions; -import org.yaml.snakeyaml.Yaml; -import org.yaml.snakeyaml.constructor.Constructor; -import org.yaml.snakeyaml.nodes.Tag; -import org.yaml.snakeyaml.representer.Representer; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.OutputStreamWriter; -import java.io.Writer; -import java.nio.charset.StandardCharsets; -import java.util.*; - -public class SetConfig { - - public void format() { - DumperOptions dop = new DumperOptions(); - dop.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); - Representer representer = new Representer(); - representer.addClassTag(RulesConfig.class, Tag.MAP); - Yaml yaml = new Yaml(new Constructor(), representer, dop); - RulesConfig con = new RulesConfig(); - List rls = new ArrayList<>(); - - Config.ruleConfig.keySet().forEach(i-> - { - Rules rlsTmp = new Rules(); - rlsTmp.setType(i); - List rl = new ArrayList<>(); - for (Object[] objects : Config.ruleConfig.get(i)) { - Rule rlTmp = new Rule(); - rlTmp.setName((String) objects[1]); - rlTmp.setLoaded((Boolean) objects[0]); - rlTmp.setRegex((String) objects[2]); - rlTmp.setColor((String) objects[3]); - rlTmp.setScope((String) objects[4]); - rlTmp.setEngine((String) objects[5]); - rlTmp.setSensitive((Boolean) objects[6]); - rl.add(rlTmp); - } - rlsTmp.setRule(rl); - rls.add(rlsTmp); - }); - con.setRules(rls); - File f = new File(LoadConfig.getConfigPath()); - try{ - Writer ws = new OutputStreamWriter(new FileOutputStream(f), StandardCharsets.UTF_8); - yaml.dump(con,ws); - }catch (Exception ex){ - ex.printStackTrace(); - } - } - - public void edit(Vector data, int select, String type) { - Config.ruleConfig.get(type)[select] = data.toArray(); - this.format(); - } - - public void add(Vector data, String type) { - ArrayList x = new ArrayList<>(Arrays.asList(Config.ruleConfig.get(type))); - x.add(data.toArray()); - Config.ruleConfig.put(type,x.toArray(new Object[x.size()][])); - this.format(); - } - public void remove(int select,String type) { - ArrayList x = new ArrayList<>(Arrays.asList(Config.ruleConfig.get(type))); - x.remove(select); - Config.ruleConfig.put(type,x.toArray(new Object[x.size()][])); - this.format(); - } - - public void rename(String oldName, String newName) { - Config.ruleConfig.put(newName, Config.ruleConfig.remove(oldName)); - this.format(); - } - - public void deleteRules(String Rules) { - Config.ruleConfig.remove(Rules); - this.format(); - } - public String newRules() { - int i = 0; - String name = "New "; - Object[][] data = new Object[][]{ - { - false, "New Name", "(New Regex)", "gray", "any", "nfa", false - } - }; - while (Config.ruleConfig.containsKey(name + i)) { - i++; - } - Config.ruleConfig.put(name + i, data); - this.format(); - return name + i; - } -} diff --git a/src/main/java/burp/yaml/template/Rule.java b/src/main/java/burp/yaml/template/Rule.java deleted file mode 100644 index 7ec546b..0000000 --- a/src/main/java/burp/yaml/template/Rule.java +++ /dev/null @@ -1,93 +0,0 @@ -package burp.yaml.template; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author LinChen - */ - -public class Rule { - private String Name; - private Boolean Loaded; - private String Regex; - private String Color; - private String Engine; - private String Scope; - private Boolean Sensitive; - - public Boolean getLoaded() { - return Loaded; - } - public String getColor() { - return Color; - } - - public String getEngine() { - return Engine; - } - - public String getName() { - return Name; - } - - public String getRegex() { - return Regex; - } - - public String getScope() { - return Scope; - } - - public Boolean getSensitive(){ - return Sensitive = Sensitive; - } - public void setLoaded(Boolean loaded) { - this.Loaded = loaded; - } - - - public void setColor(String color) { - this.Color = color; - } - - public void setEngine(String engine) { - this.Engine = engine; - } - - public void setName(String name) { - this.Name = name; - } - - public void setRegex(String regex) { - this.Regex = regex; - } - - public void setScope(String scope) { - this.Scope = scope; - } - public void setSensitive(Boolean sensitive){ - this.Sensitive = sensitive; - } - - public Object[] getRuleObject() { - return new Object[] { Loaded, Name, Regex, Color, Scope, Engine,Sensitive }; - } - - public Map getRuleObjMap(){ - Map r = new HashMap<>(); - r.put("Loaded", Loaded); - r.put("Name", Name); - r.put("Regex", Regex); - r.put("Color", Color); - r.put("Scope", Scope); - r.put("Engine", Engine); - r.put("Sensitive", Sensitive); - return r; - } - - @Override - public String toString() { - return "{ \nLoaded: " + Loaded + "\nName: " + Name + "\nRegex: " + Regex + "\nColor: " + Color + "\nScope: " + Scope + "\nEngine: " + Engine + "\nSensitive: " + Sensitive + "\n }"; - } -} \ No newline at end of file diff --git a/src/main/java/burp/yaml/template/Rules.java b/src/main/java/burp/yaml/template/Rules.java deleted file mode 100644 index 4c9fb96..0000000 --- a/src/main/java/burp/yaml/template/Rules.java +++ /dev/null @@ -1,37 +0,0 @@ -package burp.yaml.template; - -import burp.yaml.template.Rule; - -import java.util.List; - -/** - * @author LinChen - */ - -public class Rules { - private String type; - public List rule; - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - public List getRule() { - return rule; - } - - public void setRule(List rule) { - this.rule = rule; - } - - public void setRuleObj(){} - - @Override - public String toString(){ - return "{ type: "+type+"\n config: "+ rule +"}\n"; - } -} \ No newline at end of file