Compare commits

..

41 Commits
2.0.2 ... 2.4.1

Author SHA1 Message Date
AnonymousUser
7e0e3054be Version: 2.4.1 Update 2022-06-29 15:17:42 +08:00
ᴋᴇʏ
17a84fc19e Update README.md 2022-06-24 11:11:27 +08:00
ᴋᴇʏ
1573d563eb Update README.md 2022-06-23 22:31:39 +08:00
ᴋᴇʏ
515f7b33f0 Update README.md 2022-06-23 22:26:51 +08:00
AnonymousUser
1dc510d576 Version: 2.4 Update 2022-06-23 15:48:22 +08:00
AnonymousUser
f401214524 Version: 2.4 Update 2022-06-23 15:34:22 +08:00
ᴋᴇʏ
7ebba02200 Update README.md 2022-06-22 10:26:36 +08:00
AnonymousUser
93f5c73aac Update 2022-06-22 10:20:44 +08:00
AnonymousUser
60b261d6ef Update 2022-06-21 17:06:45 +08:00
AnonymousUser
c84ebf3a9d Version: 2.3 Update 2022-05-27 13:29:32 +08:00
AnonymousUser
15f84028bb Version: 2.2.3 Update 2022-05-12 11:00:55 +08:00
AnonymousUser
1238e536d1 Version: 2.2.2 Update 2022-05-04 23:17:24 +08:00
AnonymousUser
5d23a68c0e Version: 2.2.2 Update 2022-05-04 22:51:58 +08:00
AnonymousUser
d7f04526b4 Version: 2.2.2 Update 2022-05-04 22:48:44 +08:00
AnonymousUser
acff96ed7b Version: 2.2.2 Update 2022-05-04 22:47:28 +08:00
AnonymousUser
350c093162 Update 2022-05-04 20:50:53 +08:00
AnonymousUser
0d3d4f88e9 Version: 2.2.1 Update 2022-04-21 10:50:10 +08:00
AnonymousUser
37ca315aba Version: 2.2 Update 2022-04-08 17:25:35 +08:00
AnonymousUser
241247a4a0 Version: 2.2 Update 2022-04-08 17:21:40 +08:00
AnonymousUser
08bfb69fce Version: 2.1.6 Update 2022-03-31 13:54:12 +08:00
AnonymousUser
a6d5f3a204 Version: 2.1.5 Update 2022-02-25 13:22:14 +08:00
AnonymousUser
c4d8743fe3 Version: 2.1.4 Update 2022-02-21 09:31:03 +08:00
AnonymousUser
903077c830 Version: 2.1.3 Update 2022-01-11 14:46:25 +08:00
AnonymousUser
daddf15af2 Version: 2.1.2 Update 2021-10-23 00:06:48 +08:00
AnonymousUser
e747011ec0 Version: 2.1.2 Update 2021-10-23 00:00:20 +08:00
AnonymousUser
f7b2e99eb2 Version: 2.1.2 Update 2021-10-22 22:46:42 +08:00
AnonymousUser
59cd0a88b9 Update 2021-10-22 21:58:45 +08:00
AnonymousUser
b16cbf5b60 Update 2021-10-22 21:57:11 +08:00
AnonymousUser
4ef766dd82 Version: 2.1.1 Update 2021-10-21 23:42:15 +08:00
AnonymousUser
5d9f590977 Version: 2.1 Update 2021-09-12 15:23:54 +08:00
AnonymousUser
5c326d3ca6 Version: 2.0.7 Update 2021-09-07 22:09:42 +08:00
ᴋᴇʏ
62edae0ab4 Merge pull request #28 from gh0stkey/add-license-1
Create LICENSE
2021-08-16 11:01:05 +08:00
ᴋᴇʏ
562378873c Create LICENSE 2021-08-16 11:00:53 +08:00
AnonymousUser
5f62e9653f update 2021-08-01 15:00:12 +08:00
AnonymousUser
3fc1869a7b Version: 2.0.6 Update 2021-07-13 15:10:25 +08:00
AnonymousUser
43fbc46b65 Version: 2.0.5 Fixed Bug 2021-07-06 18:33:11 +08:00
AnonymousUser
00a4a835b2 Update 2021-06-25 12:41:25 +08:00
AnonymousUser
f872dadf46 Version: 2.0.4 Fixed Bug 2021-06-14 23:06:03 +08:00
0chen
15bbb9f1a0 修复一处bug
close #18
感谢#18 问题已经修复
2021-06-14 15:33:22 +08:00
AnonymousUser
89f3f6cf09 Version 2.0.3 Fixed Match Scope Bug 2021-06-12 15:24:19 +08:00
AnonymousUser
cf9f434ff8 Version 2.0.3 Fixed Match Scope Bug 2021-06-12 15:19:39 +08:00
36 changed files with 1566 additions and 911 deletions

136
.gitignore vendored
View File

@@ -1,3 +1,137 @@
# User-specific stuff
.idea/**/workspace.xml
.idea/**/tasks.xml
.idea/**/usage.statistics.xml
.idea/**/dictionaries
.idea/**/shelf
# AWS User-specific
.idea/**/aws.xml
# Generated files
.idea/**/contentModel.xml
# Sensitive or high-churn files
.idea/**/dataSources/
.idea/**/dataSources.ids
.idea/**/dataSources.local.xml
.idea/**/sqlDataSources.xml
.idea/**/dynamic.xml
.idea/**/uiDesigner.xml
.idea/**/dbnavigator.xml
# Gradle
.idea/**/gradle.xml
.idea/**/libraries
# Gradle and Maven with auto-import
# When using Gradle or Maven with auto-import, you should exclude module files,
# since they will be recreated, and may cause churn. Uncomment if using
# auto-import.
# .idea/artifacts
# .idea/compiler.xml
# .idea/jarRepositories.xml
# .idea/modules.xml
# .idea/*.iml
# .idea/modules
# *.iml
# *.ipr
# CMake
cmake-build-*/
# Mongo Explorer plugin
.idea/**/mongoSettings.xml
# File-based project format
*.iws
# IntelliJ
out/
# mpeltonen/sbt-idea plugin
.idea_modules/
# JIRA plugin
atlassian-ide-plugin.xml
# Cursive Clojure plugin
.idea/replstate.xml
# SonarLint plugin
.idea/sonarlint/
# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties
# Editor-based Rest Client
.idea/httpRequests
# Android studio 3.1+ serialized cache file
.idea/caches/build_file_checksums.ser
### JetBrains+all Patch ###
# Ignore everything but code style settings and run configurations
# that are supposed to be shared within teams.
.idea/*
!.idea/codeStyles
!.idea/runConfigurations
### macOS ###
# General
.DS_Store .DS_Store
.idea .AppleDouble
.LSOverride
# Icon must end with two \r
Icon
# Thumbnails
._*
# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent
# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk
### Gradle ###
.gradle .gradle
**/build/
!src/**/build/
# Ignore Gradle GUI config
gradle-app.setting
# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored)
!gradle-wrapper.jar
# Avoid ignore Gradle wrappper properties
!gradle-wrapper.properties
# Cache of project
.gradletasknamecache
# Eclipse Gradle plugin generated files
# Eclipse Core
.project
# JDT-specific (Eclipse Java Development Tools)
.classpath
# End of https://www.toptal.com/developers/gitignore/api/macos,gradle,jetbrains+all

201
LICENSE Normal file
View File

@@ -0,0 +1,201 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

View File

@@ -1,44 +1,46 @@
# HaE - Highlighter and Extractor <div align="center">
<img src="images/logo.png" style="width: 20%" />
<h4><a href="https://gh0st.cn/HaE/">赋能白帽,高效作战!</a></h4>
<h5>第一作者: <a href="https://github.com/gh0stkey">EvilChen</a>(中孚信息元亨实验室), 第二作者: <a href="https://github.com/0chencc">0chencc</a>(米斯特安全团队)</h5>
</div>
HaE相关作者 (来自米斯特安全团队 www.acmesec.cn)
架构作者: [@0chencc](https://github.com/0Chencc) ## 项目介绍
核心功能作者: [@EvilChen](https://github.com/gh0stkey)
## 公共规则网站 **HaE**是基于 `BurpSuite Java插件API` 开发的请求高亮标记与信息提取的辅助型框架式插件,该插件可以通过自定义正则的方式匹配响应报文或请求报文,并对满足正则匹配的报文进行信息高亮与提取。
https://gh0st.cn/HaE/ 现代化Web应用走上前后端分离开发模式这就导致在日常测试时候会有许多的流量如果你想要尽可能全面的对一个Web应用进行测试评估将花费大量精力浪费在无用的报文上**HaE的出现正是为了解决这一类似场景**借助HaE你可以**有效的减少**测试的时间,将更多的精力放在**有价值、有意义**的报文上,**提高漏洞挖掘效率**。
## 介绍 **注**: 要想灵活的使用`HaE`,你需要掌握正则表达式阅读、编写、修改能力;由于`Java`正则表达式的库并没有`Python`的优雅或方便所以HaE要求使用者必须用`()`将所需提取的表达式内容包含;例如你要匹配一个**Shiro应用**的响应报文,正常匹配规则为`rememberMe=delete`,如果你要提取这段内容的话就需要变成`(rememberMe=delete)`
**HaE**是基于 `BurpSuite` 插件 `JavaAPI` 开发的请求高亮标记与信息提取的辅助型插件。
![-w1070](images/16000706401522.jpg)
该插件可以通过自定义正则的方式匹配**响应报文或请求报文**,可以自行决定符合该自定义正则匹配的相应请求是否需要高亮标记、信息提取。
**注**: `HaE`的使用,对测试人员来说需要基本的正则表达式基础,由于`Java`正则表达式的库并没有`Python`的优雅或方便在使用正则的HaE要求使用者必须使用`()`将所需提取的表达式内容包含;例如你要匹配一个**Shiro应用**的响应报文,正常匹配规则为`rememberMe=delete`,如果你要提取这段内容的话就需要变成`(rememberMe=delete)`
## 使用方法 ## 使用方法
插件装载: `Extender - Extensions - Add - Select File - Next` 插件装载: `Extender - Extensions - Add - Select File - Next`
初次装载`HaE`会初始化配置文件,默认配置文件内置一个正则: `Email`,初始化的配置文件会放在`BurpSuite Jar`包同级目录下。 初次装载`HaE`会初始化配置文件,默认配置文件内置一个正则: `Email`,初始化的配置文件会放在`/用户根目录/.config/HaE/`目录下。
除了初始化的配置文件外,还有`Setting.yml`,该文件用于存储配置文件路径;`HaE`支持自定义配置文件路径,你可以通过点击`Select File`按钮进行选择自定义配置文件。 ![-w477](images/show_config.png)
![-w477](images/16000710069404.jpg) 除了初始化的配置文件外,还有`Setting.yml`,该文件用于存储配置文件路径与排除后缀名;`HaE`支持自定义配置文件路径,你可以通过点击`Select File`按钮进行选择自定义配置文件。
## 插件优点 ## 优势特
1. **精细化配置项**:高自由度配置更适配精细化场景需求;
2. **简洁可视界面**简洁的可视化界面让你更加清晰了解HaE的各项配置操作更轻松使用更简单
3. **颜色升级算法**:内置颜色升级算法,避免“屠龙者终成恶龙”场景,突出最具价值的请求;
4. **标签化规则项**:标签化你的正则规则,让规则可分类,让管理更轻松;
5. **数据集合面板**将所有匹配数据集合到Databoard中使得测试、梳理更高效
6. **高亮标记一体**在Proxy - History页面你可以通过颜色高亮与Comment判断请求价值
7. **实战化官方库**:基于实战化场景、案例进行输出的官方规则库,提升测试实战性;
8. **配置文件易读**配置文件使用YAML格式存储更加便于阅读与修改。
| 界面名称 | 界面展示 |
| ------------------------- | ----------------------------------------------------- |
| Rules规则信息管理 | <img src="images/rules.png" style="width: 80%" /> |
| Config配置信息管理 | <img src="images/config.png" style="width: 80%" /> |
| Databoard数据集合面板 | <img src="images/databoard.png" style="width: 80%" /> |
1. 多选项自定义控制适配需求
2. 多颜色高亮分类将BurpSuite的所有高亮颜色集成: `red, orange, yellow, green, cyan, blue, pink, magenta, gray`
3. **颜色升级算法**: 利用下标的方式进行优先级排序当满足2个同颜色条件则以优先级顺序上升颜色例如: **两个正则,颜色为橘黄色,该请求两个正则都匹配到了,那么将升级为红色**
4. 配置文件采用YAML格式存储更加便于阅读和修改
5. 内置简单缓存,在“多正则、大数据”的场景下减少卡顿现象
6. **支持标签分页**,点击`...`即可添加新的标签页,对着标签页右键即可删除
![-w477](images/16000720732851.jpg)
## 实际使用 ## 实际使用
@@ -48,40 +50,22 @@ https://gh0st.cn/HaE/
访问该地址,在`Proxy - HTTP History`中可以看见高亮请求,响应标签页中含有`MarkINFO`标签,其中将匹配到的信息提取了出来。 访问该地址,在`Proxy - HTTP History`中可以看见高亮请求,响应标签页中含有`MarkINFO`标签,其中将匹配到的信息提取了出来。
![-w1047](images/16000720732854.jpg) ![-w1047](images/16000720732854.png)
## 文末随笔
## 正则优化 正义感是一个不可丢失的东西。
有些正则在实战应用场景中并不理想 如果你觉得HaE好用可以打赏一下作者给作者持续更新下去的动力
在正则匹配手机号、身份证号码的时候(纯数字类)会存在一些误报(这里匹配身份证号码无法进行校验,误报率很高),但手机号处理这一块可以解决: <div align=center>
<img src="images/reward.jpeg" style="width: 30%" />
</div>
原正则: ## 404StarLink 2.0 - Galaxy
``` ![404StarLink Logo](https://github.com/knownsec/404StarLink-Project/raw/master/logo.png)
1[3-9]\d{9}
```
误报场景: `12315188888888123`,这时候会匹配到`15188888888`,而实际上这一段并不是手机号,所以修改正则为: `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)
[^0-9]+(1[3-9]\d{9})[^0-9]+
```
也就是要求匹配的手机号前后不能为0-9的数字。
## 实战用法
1. CMS指纹识别Discuz正则: `(Powered by Discuz!)`
2. OSS对象存储信息泄露正则: `([A|a]ccess[K|k]ey[I|i]d|[A|a]ccess[K|k]ey[S|s]ecret)`
3. 内网地址信息提取,正则: `(?:10\.\d{1,3}\.\d{1,3}\.\d{1,3})|(?:172\.(?:(?:1[6-9])|(?:2\d)|(?:3[01]))\.\d{1,3}\.\d{1,3})|(?:192\.168\.\d{1,3}\.\d{1,3})`
4. 实战插件关联搭配,漏洞挖掘案例: https://mp.weixin.qq.com/s/5vNn7dMRZBtv0ojPBAHV7Q
...还有诸多使用方法等待大家去发掘。
## 文末
随笔: 正义感是一个不可丢失的东西。
Github项目地址BUG、需求、正则欢迎提交: https://github.com/gh0stkey/HaE

View File

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 188 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 144 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 297 KiB

BIN
images/16000720732854.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 167 KiB

BIN
images/config.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

BIN
images/databoard.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

BIN
images/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

BIN
images/reward.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 KiB

BIN
images/rules.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB

BIN
images/show_config.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

View File

@@ -3,29 +3,30 @@ package burp;
import burp.action.*; import burp.action.*;
import burp.ui.MainUI; import burp.ui.MainUI;
import java.util.HashMap;
import java.util.Map;
import javax.swing.*; import javax.swing.*;
import java.awt.*; import java.awt.*;
import java.io.UnsupportedEncodingException; import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.List;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.util.Map; import java.util.ArrayList;
import java.util.List;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
/* /**
* @author EvilChen * @author EvilChen & 0chencc
*/ */
public class BurpExtender implements IBurpExtender, IHttpListener, IMessageEditorTabFactory, ITab { public class BurpExtender implements IBurpExtender, IHttpListener, IMessageEditorTabFactory, ITab {
private MainUI main = new MainUI(); private final MainUI main = new MainUI();
private static PrintWriter stdout; // stdout变成公开属性便于其他类调用输出调试信息
public static PrintWriter stdout;
private IBurpExtenderCallbacks callbacks; private IBurpExtenderCallbacks callbacks;
private static IExtensionHelpers helpers; private static IExtensionHelpers helpers;
private static IMessageEditorTab HaETab;
MatchHTTP mh = new MatchHTTP();
ExtractContent ec = new ExtractContent();
DoAction da = new DoAction();
GetColorKey gck = new GetColorKey(); GetColorKey gck = new GetColorKey();
UpgradeColor uc = new UpgradeColor(); UpgradeColor uc = new UpgradeColor();
ProcessMessage pm = new ProcessMessage();
@Override @Override
public void registerExtenderCallbacks(final IBurpExtenderCallbacks callbacks) public void registerExtenderCallbacks(final IBurpExtenderCallbacks callbacks)
@@ -33,28 +34,25 @@ public class BurpExtender implements IBurpExtender, IHttpListener, IMessageEdito
this.callbacks = callbacks; this.callbacks = callbacks;
BurpExtender.helpers = callbacks.getHelpers(); BurpExtender.helpers = callbacks.getHelpers();
String version = "2.0.2"; String version = "2.4.1";
callbacks.setExtensionName(String.format("HaE (%s) - Highlighter and Extractor", version)); callbacks.setExtensionName(String.format("HaE (%s) - Highlighter and Extractor", version));
// 定义输出 // 定义输出
stdout = new PrintWriter(callbacks.getStdout(), true); stdout = new PrintWriter(callbacks.getStdout(), true);
stdout.println("@UI Author: 0chencc");
stdout.println("@Core Author: EvilChen"); stdout.println("@Core Author: EvilChen");
stdout.println("@Architecture Author: 0chencc");
stdout.println("@Github: https://github.com/gh0stkey/HaE"); stdout.println("@Github: https://github.com/gh0stkey/HaE");
// UI // UI
SwingUtilities.invokeLater(new Runnable() { SwingUtilities.invokeLater(this::initialize);
@Override
public void run() {
initialize();
}
});
callbacks.registerHttpListener(BurpExtender.this); callbacks.registerHttpListener(BurpExtender.this);
callbacks.registerMessageEditorTabFactory(BurpExtender.this); callbacks.registerMessageEditorTabFactory(BurpExtender.this);
} }
private void initialize(){ private void initialize(){
callbacks.customizeUiComponent(main); callbacks.customizeUiComponent(main);
callbacks.addSuiteTab(BurpExtender.this); callbacks.addSuiteTab(BurpExtender.this);
} }
@Override @Override
public String getTabCaption(){ public String getTabCaption(){
return "HaE"; return "HaE";
@@ -65,60 +63,63 @@ public class BurpExtender implements IBurpExtender, IHttpListener, IMessageEdito
return main; return main;
} }
/* /**
* 使用processHttpMessage用来做Highlighter * 使用processHttpMessage用来做Highlighter
*/ */
@Override @Override
public void processHttpMessage(int toolFlag, boolean messageIsRequest, IHttpRequestResponse messageInfo) { public void processHttpMessage(int toolFlag, boolean messageIsRequest, IHttpRequestResponse messageInfo) {
// 判断是否是响应且该代码作用域为REPEATER、INTRUDER、PROXY分别对应toolFlag 64、32、4 // 判断是否是响应且该代码作用域为REPEATER、INTRUDER、PROXY分别对应toolFlag 64、32、4
if (toolFlag == 64 || toolFlag == 32 || toolFlag == 4) { if (toolFlag == 64 || toolFlag == 32 || toolFlag == 4) {
Map<String, Map<String, Object>> obj; byte[] content;
byte[] content = messageInfo.getRequest();
// 获取报文头
List<String> tmpHeaders = helpers.analyzeRequest(messageInfo.getHttpService(), content).getHeaders();
String headers = String.join("\n", tmpHeaders);
// 获取报文主体
int bodyOffset = helpers.analyzeRequest(messageInfo.getHttpService(), content).getBodyOffset();
byte[] byteRequest = messageInfo.getRequest();
byte[] body = Arrays.copyOfRange(byteRequest, bodyOffset, byteRequest.length);
// 流量清洗
String urlString = helpers.analyzeRequest(messageInfo.getHttpService(), content).getUrl().toString();
urlString = urlString.indexOf("?") > 0 ? urlString.substring(0, urlString.indexOf("?")) : urlString;
// 正则判断
if (mh.matchSuffix(urlString)) {
return;
}
if (messageIsRequest) { if (messageIsRequest) {
obj = ec.matchRegex(content, headers, body, "request"); content = messageInfo.getRequest();
} else { } else {
content = messageInfo.getResponse(); content = messageInfo.getResponse();
obj = ec.matchRegex(content, headers, body, "response");
} }
List<String> colorList = da.highlightList(obj); IHttpService iHttpService = null;
if (colorList.size() != 0) { try {
String color = uc.getEndColor(gck.getColorKeys(colorList, Config.colorArray), Config.colorArray); iHttpService = messageInfo.getHttpService();
} catch (Exception ignored) {
}
// 获取请求主机信息
assert iHttpService != null;
String host = iHttpService.getHost();
String c = new String(content, StandardCharsets.UTF_8).intern();
List<Map<String, String>> result = pm.processMessageByContent(helpers, content, messageIsRequest, true, host);
if (result != null && !result.isEmpty() && result.size() > 0) {
String originalColor = messageInfo.getHighlight();
String originalComment = messageInfo.getComment();
List<String> colorList = new ArrayList<>();
if (originalColor != null) {
colorList.add(originalColor);
}
colorList.add(result.get(0).get("color"));
String color = uc.getEndColor(gck.getColorKeys(colorList));
messageInfo.setHighlight(color); messageInfo.setHighlight(color);
} String addComment = String.join(", ", result.get(1).get("comment"));
} String resComment = originalComment != null ? String.format("%s, %s", originalComment, addComment) : addComment;
messageInfo.setComment(resComment);
}
}
} }
class MarkInfoTab implements IMessageEditorTab { class MarkInfoTab implements IMessageEditorTab {
private ITextEditor markInfoText; private final JTabbedPane jTabbedPane = new JTabbedPane();
private byte[] currentMessage; private JTable jTable = new JTable();
private final IMessageEditorController controller; private final IMessageEditorController controller;
private byte[] extractRequestContent; private Map<String, String> extractRequestMap;
private byte[] extractResponseContent; private Map<String, String> extractResponseMap;
private ArrayList<String> titleList = new ArrayList<>();
public MarkInfoTab(IMessageEditorController controller, boolean editable) { public MarkInfoTab(IMessageEditorController controller, boolean editable) {
this.controller = controller; this.controller = controller;
markInfoText = callbacks.createTextEditor();
markInfoText.setEditable(editable);
} }
@Override @Override
@@ -128,99 +129,106 @@ public class BurpExtender implements IBurpExtender, IHttpListener, IMessageEdito
@Override @Override
public Component getUiComponent() { public Component getUiComponent() {
return markInfoText.getComponent(); jTabbedPane.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent arg0) {
jTable = (JTable) ((JScrollPane)jTabbedPane.getSelectedComponent()).getViewport().getView();
}
});
return this.jTabbedPane;
} }
@Override @Override
public boolean isEnabled(byte[] content, boolean isRequest) { public boolean isEnabled(byte[] content, boolean isRequest) {
Map<String, Map<String, Object>> obj; String c = new String(content, StandardCharsets.UTF_8).intern();
List<Map<String, String>> result = pm.processMessageByContent(helpers, content, isRequest, false, "");
if (result != null && !result.isEmpty()) {
Map<String, String> dataMap = result.get(0);
if (isRequest) { if (isRequest) {
try { extractRequestMap = dataMap;
// 流量清洗
String urlString = helpers.analyzeRequest(controller.getHttpService(), controller.getRequest()).getUrl().toString();
urlString = urlString.indexOf("?") > 0 ? urlString.substring(0, urlString.indexOf("?")) : urlString;
// 正则判断
if (mh.matchSuffix(urlString)) {
return false;
}
} catch (Exception e) {
return false;
}
// 获取报文头
List<String> tmpHeaders = helpers.analyzeRequest(controller.getHttpService(), content).getHeaders();
String headers = String.join("\n", tmpHeaders);
// 获取报文主体
int bodyOffset = helpers.analyzeRequest(controller.getHttpService(), content).getBodyOffset();
byte[] byteRequest = controller.getRequest();
byte[] body = Arrays.copyOfRange(byteRequest, bodyOffset, byteRequest.length);
obj = ec.matchRegex(content, headers, body, "request");
if (obj.size() > 0) {
String result = da.extractString(obj);
extractRequestContent = result.getBytes();
return true;
}
} else { } else {
extractResponseMap = dataMap;
// 获取报文头
List<String> tmpHeaders1 = helpers.analyzeResponse(content).getHeaders();
String headers1 = String.join("\n", tmpHeaders1);
// 获取报文主体
int bodyOffset1 = helpers.analyzeResponse(content).getBodyOffset();
byte[] byteRequest1 = controller.getResponse();
byte[] body = Arrays.copyOfRange(byteRequest1, bodyOffset1, byteRequest1.length);
obj = ec.matchRegex(content, headers1, body, "response");
if (obj.size() > 0) {
String result = da.extractString(obj);
extractResponseContent = result.getBytes();
return true;
} }
return true;
} }
return false; return false;
} }
@Override @Override
public byte[] getMessage() { public byte[] getMessage() {
return currentMessage; return null;
} }
@Override @Override
public boolean isModified() { public boolean isModified() {
return markInfoText.isTextModified(); return false;
} }
/**
* 快捷键复制功能
*/
@Override @Override
public byte[] getSelectedData() { public byte[] getSelectedData() {
return markInfoText.getSelectedText(); int[] selectRows = jTable.getSelectedRows();
StringBuilder selectData = new StringBuilder();
for (int row : selectRows) {
selectData.append(jTable.getValueAt(row, 0).toString()).append("\n");
}
// 便于单行复制,去除最后一个换行符
String revData = selectData.reverse().toString().replaceFirst("\n", "");
StringBuilder retData = new StringBuilder(revData).reverse();
return helpers.stringToBytes(retData.toString());
} }
/* /**
* 使用setMessage用来做Extractor * 使用setMessage用来做Extractor
*/ */
@Override @Override
public void setMessage(byte[] content, boolean isRequest) { public void setMessage(byte[] content, boolean isRequest) {
try { String c = new String(content, StandardCharsets.UTF_8).intern();
String c = new String(content, "UTF-8").intern();
} catch (UnsupportedEncodingException e) {
stdout.println(e);
}
if (content.length > 0) { if (content.length > 0) {
if (isRequest) { if (isRequest) {
markInfoText.setText(extractRequestContent); makeTable(extractRequestMap);
} else { } else {
markInfoText.setText(extractResponseContent); makeTable(extractResponseMap);
} }
} }
currentMessage = content; }
/**
* 创建MarkInfo表单
*/
public void makeTable(Map<String, String> dataMap) {
ArrayList<String> lTitleList = new ArrayList<>();
dataMap.keySet().forEach(i->{
String[] extractData = dataMap.get(i).split("\n");
Object[][] data = new Object[extractData.length][1];
for (int x = 0; x < extractData.length; x++) {
data[x][0] = extractData[x];
// stdout.println(extractData[x]);
}
JScrollPane jScrollPane = new JScrollPane(new JTable(data, new Object[]{"Information"}));
lTitleList.add(i);
this.jTabbedPane.addTab(i, jScrollPane);
});
/*
* 使用removeAll会导致MarkInfo UI出现空白的情况为了改善用户侧体验采用remove的方式进行删除
* 采用全局ArrayList的方式遍历删除Tab以此应对BurpSuite缓存机制导致的MarkInfo UI错误展示。
*/
titleList.forEach(t->{
int indexOfTab = this.jTabbedPane.indexOfTab(t);
if (indexOfTab != -1) {
this.jTabbedPane.removeTabAt(indexOfTab);
}
});
titleList = lTitleList;
} }
} }
@Override @Override
public IMessageEditorTab createNewInstance(IMessageEditorController controller, boolean editable) { public IMessageEditorTab createNewInstance(IMessageEditorController controller, boolean editable) {
HaETab = new MarkInfoTab(controller, editable); return new MarkInfoTab(controller, editable);
return HaETab;
} }
} }

View File

@@ -1,9 +1,13 @@
package burp; package burp;
/* /**
* @author EvilChen * @author EvilChen
*/ */
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Config { public class Config {
public static String excludeSuffix = "3g2|3gp|7z|aac|abw|aif|aifc|aiff|arc|au|avi|azw|bin|bmp|bz|bz2|cmx|cod|csh|css|csv|doc|docx|eot|epub|gif|gz|ico|ics|ief|jar|jfif|jpe|jpeg|jpg|m3u|mid|midi|mjs|mp2|mp3|mpa|mpe|mpeg|mpg|mpkg|mpp|mpv2|odp|ods|odt|oga|ogv|ogx|otf|pbm|pdf|pgm|png|pnm|ppm|ppt|pptx|ra|ram|rar|ras|rgb|rmi|rtf|snd|svg|swf|tar|tif|tiff|ttf|vsd|wav|weba|webm|webp|woff|woff2|xbm|xls|xlsx|xpm|xul|xwd|zip|zip"; public static String excludeSuffix = "3g2|3gp|7z|aac|abw|aif|aifc|aiff|arc|au|avi|azw|bin|bmp|bz|bz2|cmx|cod|csh|css|csv|doc|docx|eot|epub|gif|gz|ico|ics|ief|jar|jfif|jpe|jpeg|jpg|m3u|mid|midi|mjs|mp2|mp3|mpa|mpe|mpeg|mpg|mpkg|mpp|mpv2|odp|ods|odt|oga|ogv|ogx|otf|pbm|pdf|pgm|png|pnm|ppm|ppt|pptx|ra|ram|rar|ras|rgb|rmi|rtf|snd|svg|swf|tar|tif|tiff|ttf|vsd|wav|weba|webm|webp|woff|woff2|xbm|xls|xlsx|xpm|xul|xwd|zip|zip";
@@ -22,8 +26,6 @@ public class Config {
"dfa" "dfa"
}; };
public static String outputTplString = "[%s]\n%s\n\n";
public static String[] colorArray = new String[] { public static String[] colorArray = new String[] {
"red", "red",
"orange", "orange",
@@ -35,4 +37,8 @@ public class Config {
"magenta", "magenta",
"gray" "gray"
}; };
public static Map<String,Object[][]> ruleConfig = null;
public static Map<String, Map<String, List<String>>> globalDataMap = new HashMap<>();
} }

View File

@@ -1,33 +1,38 @@
package burp.action; package burp.action;
import burp.BurpExtender;
import java.util.HashMap;
import java.util.Map; import java.util.Map;
import burp.Config;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
/* /**
* @author EvilChen * @author EvilChen
*/ */
public class DoAction { public class DoAction {
public String extractString(Map<String, Map<String, Object>> obj) { public Map<String, String> extractString(Map<String, Map<String, Object>> obj) {
String[] result = {""}; Map<String, String> resultMap = new HashMap<>();
obj.keySet().forEach(i->{ obj.keySet().forEach(i->{
Map<String, Object> tmpMap = obj.get(i); Map<String, Object> tmpMap = obj.get(i);
String data = tmpMap.get("data").toString(); String data = tmpMap.get("data").toString();
String tmpStr = String.format(Config.outputTplString, i, data).intern(); resultMap.put(i, data);
result[0] += tmpStr;
}); });
return result[0]; return resultMap;
} }
public List<String> highlightList(Map<String, Map<String, Object>> obj) { public List<List<String>> highlightAndComment(Map<String, Map<String, Object>> obj) {
List<String> colorList = new ArrayList<String>(); List<String> colorList = new ArrayList<>();
List<String> commentList = new ArrayList<>();
List<List<String>> result = new ArrayList<>();
obj.keySet().forEach(i->{ obj.keySet().forEach(i->{
Map<String, Object> tmpMap = obj.get(i); Map<String, Object> tmpMap = obj.get(i);
String color = tmpMap.get("color").toString(); String color = tmpMap.get("color").toString();
colorList.add(color); colorList.add(color);
commentList.add(i);
}); });
return colorList; result.add(colorList);
result.add(commentList);
return result;
} }
} }

View File

@@ -1,8 +1,8 @@
package burp.action; package burp.action;
import java.io.UnsupportedEncodingException; import java.nio.charset.StandardCharsets;
import java.util.*; import java.util.*;
import burp.Config;
import dk.brics.automaton.Automaton; import dk.brics.automaton.Automaton;
import dk.brics.automaton.AutomatonMatcher; import dk.brics.automaton.AutomatonMatcher;
import dk.brics.automaton.RegExp; import dk.brics.automaton.RegExp;
@@ -10,25 +10,19 @@ import dk.brics.automaton.RunAutomaton;
import jregex.Matcher; import jregex.Matcher;
import jregex.Pattern; import jregex.Pattern;
import burp.yaml.LoadRule; /**
import burp.yaml.LoadConfigFile;
/*
* @author EvilChen * @author EvilChen
*/ */
public class ExtractContent { public class ExtractContent {
private LoadConfigFile lcf = new LoadConfigFile();
private LoadRule lr = new LoadRule(lcf.getConfigPath());
public Map<String, Map<String, Object>> matchRegex(byte[] content, String headers, byte[] body, String scopeString) { public Map<String, Map<String, Object>> matchRegex(byte[] content, String headers, byte[] body, String scopeString, String host) {
Map<String, Map<String, Object>> map = new HashMap<>(); // 最终返回的结果 Map<String, Map<String, Object>> map = new HashMap<>(); // 最终返回的结果
Map<String,Object[][]> rules = lr.getConfig(); Config.ruleConfig.keySet().forEach(i -> {
rules.keySet().forEach(i -> {
String matchContent = ""; String matchContent = "";
for (Object[] objects : rules.get(i)) { for (Object[] objects : Config.ruleConfig.get(i)) {
// 遍历获取规则 // 遍历获取规则
List<String> result = new ArrayList<String>(); List<String> result = new ArrayList<>();
Map<String, Object> tmpMap = new HashMap<>(); Map<String, Object> tmpMap = new HashMap<>();
String name = objects[1].toString(); String name = objects[1].toString();
@@ -37,17 +31,14 @@ public class ExtractContent {
String color = objects[3].toString(); String color = objects[3].toString();
String scope = objects[4].toString(); String scope = objects[4].toString();
String engine = objects[5].toString(); String engine = objects[5].toString();
boolean sensitive = (Boolean) objects[6];
// 判断规则是否开启与作用域 // 判断规则是否开启与作用域
if (loaded && (scopeString.contains(scope) || scope.equals("any"))) { if (loaded && (scope.contains(scopeString) || "any".equals(scope))) {
switch (scope) { switch (scope) {
case "any": case "any":
case "request": case "request":
case "response": case "response":
try { matchContent = new String(content, StandardCharsets.UTF_8).intern();
matchContent = new String(content, "UTF-8").intern();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
break; break;
case "request header": case "request header":
case "response header": case "response header":
@@ -55,16 +46,21 @@ public class ExtractContent {
break; break;
case "request body": case "request body":
case "response body": case "response body":
try { matchContent = new String(body, StandardCharsets.UTF_8).intern();
matchContent = new String(body, "UTF-8").intern(); break;
} catch (UnsupportedEncodingException e) { default:
e.printStackTrace();
}
break; break;
} }
if (engine.equals("nfa")) { if ("nfa".equals(engine)) {
Pattern pattern = new Pattern(regex); Pattern pattern;
// 判断规则是否大小写敏感
if (sensitive) {
pattern = new Pattern(regex);
} else {
pattern = new Pattern(regex, Pattern.IGNORE_CASE);
}
Matcher matcher = pattern.matcher(matchContent); Matcher matcher = pattern.matcher(matchContent);
while (matcher.find()) { while (matcher.find()) {
// 添加匹配数据至list // 添加匹配数据至list
@@ -72,8 +68,8 @@ public class ExtractContent {
result.add(matcher.group(1)); result.add(matcher.group(1));
} }
} else { } else {
RegExp regexpr = new RegExp(regex); RegExp regexp = new RegExp(regex);
Automaton auto = regexpr.toAutomaton(); Automaton auto = regexp.toAutomaton();
RunAutomaton runAuto = new RunAutomaton(auto, true); RunAutomaton runAuto = new RunAutomaton(auto, true);
AutomatonMatcher autoMatcher = runAuto.newMatcher(matchContent); AutomatonMatcher autoMatcher = runAuto.newMatcher(matchContent);
while (autoMatcher.find()) { while (autoMatcher.find()) {
@@ -98,6 +94,38 @@ public class ExtractContent {
} }
}); });
// 将提取的数据存放到全局变量中
if (!host.isEmpty()) {
map.keySet().forEach(i -> {
Map<String, Object> tmpMap = map.get(i);
List<String> dataList = Arrays.asList(tmpMap.get("data").toString().split("\n"));
// 判断Host是否存在如存在则进行数据更新反之则新增数据
if (Config.globalDataMap.containsKey(host)) {
Map<String, List<String>> gRuleMap = Config.globalDataMap.get(host);
// 判断匹配规则是否存在逻辑同Host判断
if (gRuleMap.containsKey(i)) {
List<String> gDataList = gRuleMap.get(i);
List<String> mergeDataList = new ArrayList<>();
// 合并两个List
mergeDataList.addAll(gDataList);
mergeDataList.addAll(dataList);
// 去重操作
HashSet tmpList = new HashSet(mergeDataList);
mergeDataList.clear();
mergeDataList.addAll(tmpList);
// 替换操作
gRuleMap.replace(i, gDataList, mergeDataList);
} else {
gRuleMap.put(i, dataList);
}
} else {
Map<String, List<String>> ruleMap = new HashMap<>();
ruleMap.put(i, dataList);
Config.globalDataMap.put(host, ruleMap);
}
});
}
return map; return map;
} }
} }

View File

@@ -1,23 +1,25 @@
package burp.action; package burp.action;
import burp.Config;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
/* /**
* @author EvilChen * @author EvilChen
*/ */
public class GetColorKey { public class GetColorKey {
/* /**
* 颜色下标获取 * 颜色下标获取
*/ */
public List<Integer> getColorKeys(List<String> keys, String[] colorArray){ public List<Integer> getColorKeys(List<String> keys){
List<Integer> result = new ArrayList<Integer>(); List<Integer> result = new ArrayList<>();
String[] colorArray = Config.colorArray;
int size = colorArray.length; int size = colorArray.length;
// 根据颜色获取下标 // 根据颜色获取下标
for (int x = 0; x < keys.size(); x++) { for (String key : keys) {
for (int v = 0; v < size; v++) { for (int v = 0; v < size; v++) {
if (colorArray[v].equals(keys.get(x))) { if (colorArray[v].equals(key)) {
result.add(v); result.add(v);
} }
} }

View File

@@ -3,22 +3,18 @@ package burp.action;
import jregex.Matcher; import jregex.Matcher;
import jregex.Pattern; import jregex.Pattern;
import jregex.REFlags; import jregex.REFlags;
import burp.yaml.LoadConfigFile; import burp.yaml.LoadConfig;
/* /**
* @author EvilChen * @author EvilChen
*/ */
public class MatchHTTP { public class MatchHTTP {
// 匹配后缀 // 匹配后缀
LoadConfigFile lc = new LoadConfigFile(); LoadConfig lc = new LoadConfig();
public boolean matchSuffix(String str) { public boolean matchSuffix(String str) {
Pattern pattern = new Pattern(String.format("[\\w]+[\\.](%s)", lc.getExcludeSuffix()), REFlags.IGNORE_CASE); Pattern pattern = new Pattern(String.format("[\\w]+[\\.](%s)", lc.getExcludeSuffix()), REFlags.IGNORE_CASE);
Matcher matcher = pattern.matcher(str); Matcher matcher = pattern.matcher(str);
if(matcher.find()){ return matcher.find();
return true;
}else{
return false;
}
} }
} }

View File

@@ -0,0 +1,93 @@
package burp.action;
import burp.IExtensionHelpers;
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 List<Map<String, String>> processMessageByContent(IExtensionHelpers helpers, byte[] content, boolean isRequest, boolean messageInfo, String host) {
List<Map<String, String>> result = new ArrayList<>();;
Map<String, Map<String, Object>> obj;
if (isRequest) {
// 获取报文头
List<String> 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)) {
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);
} 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)) {
return result;
}
} catch (Exception e) {
return result;
}
// 获取报文头
List<String> 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);
}
if (obj.size() > 0) {
if (messageInfo) {
List<List<String>> resultList = da.highlightAndComment(obj);
List<String> colorList = resultList.get(0);
List<String> commentList = resultList.get(1);
if (colorList.size() != 0 && commentList.size() != 0) {
String color = uc.getEndColor(gck.getColorKeys(colorList));
Map<String, String> colorMap = new HashMap<String, String>(){{
put("color", color);
}};
Map<String, String> commentMap = new HashMap<String, String>(){{
put("comment", String.join(", ", commentList));
}};
result.add(colorMap);
result.add(commentMap);
}
} else {
result.add(da.extractString(obj));
}
}
return result;
}
}

View File

@@ -1,56 +1,52 @@
package burp.action; package burp.action;
import java.util.ArrayList; import burp.Config;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
/* import java.util.*;
/**
* @author EvilChen * @author EvilChen
*/ */
public class UpgradeColor { public class UpgradeColor {
private String endColor = ""; private String endColor = "";
/* /**
* 颜色升级递归算法 * 颜色升级递归算法
*/ */
private String colorUpgrade(List<Integer> colorList, String[] colorArray) { private void colorUpgrade(List<Integer> colorList) {
int colorSize = colorList.size(); int colorSize = colorList.size();
String[] colorArray = Config.colorArray;
colorList.sort(Comparator.comparingInt(Integer::intValue)); colorList.sort(Comparator.comparingInt(Integer::intValue));
int i = 0; int i = 0;
List<Integer> stack = new ArrayList<Integer>(); List<Integer> stack = new ArrayList<>();
while (i < colorSize) { while (i < colorSize) {
if (stack.isEmpty()) { if (stack.isEmpty()) {
stack.add(colorList.get(i)); stack.add(colorList.get(i));
i++;
} else { } else {
if (colorList.get(i) != stack.stream().reduce((first, second) -> second).orElse(99999999)) { if (!Objects.equals(colorList.get(i), stack.stream().reduce((first, second) -> second).orElse(99999999))) {
stack.add(colorList.get(i)); stack.add(colorList.get(i));
i++;
} else { } else {
stack.set(stack.size() - 1, stack.get(stack.size() - 1) - 1); stack.set(stack.size() - 1, stack.get(stack.size() - 1) - 1);
}
}
i++; i++;
} }
}
}
// 利用HashSet删除重复元素 // 利用HashSet删除重复元素
HashSet tmpList = new HashSet(stack); HashSet tmpList = new HashSet(stack);
if (stack.size() == tmpList.size()) { if (stack.size() == tmpList.size()) {
stack.sort(Comparator.comparingInt(Integer::intValue)); stack.sort(Comparator.comparingInt(Integer::intValue));
if(stack.get(0).equals(-1)) { if(stack.get(0) < 0) {
this.endColor = colorArray[0]; this.endColor = colorArray[0];
} else { } else {
this.endColor = colorArray[stack.get(0)]; this.endColor = colorArray[stack.get(0)];
} }
} else { } else {
this.colorUpgrade(stack, colorArray); this.colorUpgrade(stack);
} }
return "";
} }
public String getEndColor(List<Integer> colorList, String[] colorArray) { public String getEndColor(List<Integer> colorList) {
colorUpgrade(colorList, colorArray); colorUpgrade(colorList);
return endColor; return endColor;
} }
} }

View File

@@ -0,0 +1,190 @@
package burp.ui;
import burp.Config;
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
*/
public class Databoard extends JPanel {
public Databoard() {
initComponents();
}
private void initComponents() {
// JFormDesigner - Component initialization - DO NOT MODIFY //GEN-BEGIN:initComponents
hostLabel = new JLabel();
hostTextField = new JTextField();
dataTabbedPane = new JTabbedPane();
//======== 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));
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<String> getHostByList(){
List<String> hostList = new ArrayList<>();
Config.globalDataMap.keySet().forEach(i -> {
hostList.add(i);
});
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())) {
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<String, Map<String, List<String>>> ruleMap = Config.globalDataMap;
Map<String, List<String>> selectUrl = ruleMap.get(hostComboBox.getSelectedItem());
tabbedPane.removeAll();
for(Map.Entry<String, List<String>> entry: selectUrl.entrySet()){
tabbedPane.addTab(entry.getKey(), 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;
// JFormDesigner - End of variables declaration //GEN-END:variables
// 是否自动匹配Host
private static Boolean isMatchHost = false;
}
class HitRuleDataList extends JTable {
public HitRuleDataList(List<String> 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.setModel(model);
}
}

View File

@@ -6,7 +6,7 @@ import java.awt.*;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
import java.awt.event.MouseListener; import java.awt.event.MouseListener;
/* /**
* @author 6dc * @author 6dc
* *
* A class which creates a JTabbedPane and auto sets a close button when you add a tab * A class which creates a JTabbedPane and auto sets a close button when you add a tab
@@ -18,7 +18,7 @@ public class JTabbedPaneCloseButton extends JTabbedPane {
super(); super();
} }
/* Override Addtab in order to add the close Button everytime */ /** Override Addtab in order to add the close Button everytime */
@Override @Override
public void addTab(String title, Icon icon, Component component, String tip) { public void addTab(String title, Icon icon, Component component, String tip) {
super.addTab(title, icon, component, tip); super.addTab(title, icon, component, tip);
@@ -45,7 +45,7 @@ public class JTabbedPaneCloseButton extends JTabbedPane {
} }
} }
/* addTabNoExit */ /** addTabNoExit */
public void addTabNoExit(String title, Icon icon, Component component, String tip) { public void addTabNoExit(String title, Icon icon, Component component, String tip) {
super.addTab(title, icon, component, tip); super.addTab(title, icon, component, tip);
} }
@@ -58,12 +58,10 @@ public class JTabbedPaneCloseButton extends JTabbedPane {
addTabNoExit(title, null, component); addTabNoExit(title, null, component);
} }
/* Button */ /** Button */
public class CloseButtonTab extends JPanel { public class CloseButtonTab extends JPanel {
private Component tab;
public CloseButtonTab(final Component tab, String title, Icon icon) { public CloseButtonTab(final Component tab, String title, Icon icon) {
this.tab = tab;
setOpaque(false); setOpaque(false);
FlowLayout flowLayout = new FlowLayout(FlowLayout.CENTER, 3, 3); FlowLayout flowLayout = new FlowLayout(FlowLayout.CENTER, 3, 3);
setLayout(flowLayout); setLayout(flowLayout);
@@ -76,10 +74,10 @@ public class JTabbedPaneCloseButton extends JTabbedPane {
add(button); add(button);
} }
} }
/* ClickListener */ /** ClickListener */
public class CloseListener implements MouseListener public class CloseListener implements MouseListener
{ {
private Component tab; private final Component tab;
public CloseListener(Component tab){ public CloseListener(Component tab){
this.tab=tab; this.tab=tab;

View File

@@ -1,290 +1,285 @@
package burp.ui; package burp.ui;
import org.jetbrains.annotations.NotNull; import burp.Config;
import burp.yaml.LoadConfigFile; import burp.yaml.LoadConfig;
import burp.yaml.LoadRule; import burp.yaml.SetConfig;
import burp.yaml.SetRuleConfig;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.Response;
import java.io.FileOutputStream;
import javax.swing.*; import javax.swing.*;
import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener; import javax.swing.event.ChangeListener;
import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener; import javax.swing.event.DocumentListener;
import javax.swing.filechooser.FileNameExtensionFilter;
import java.awt.*; import java.awt.*;
import java.awt.event.*; import java.awt.event.*;
import java.util.Map; import java.util.Map;
/* /**
* @author LinChen * @author LinChen
*/ */
public class MainUI extends JPanel{ public class MainUI extends JPanel{
private final LoadConfig loadConn = new LoadConfig();
public MainUI() { public MainUI() {
initComponents(); initComponents();
} }
public void closeTabActionPerformed(ActionEvent e){ public void closeTabActionPerformed(ActionEvent e){
if (tabbedPane1.getTabCount()>2){ if (ruleTabbedPane.getTabCount()>2){
if (tabbedPane1.getSelectedIndex()!=0){ if (ruleTabbedPane.getSelectedIndex()!=0){
SetRuleConfig setruleconfig = new SetRuleConfig(); SetConfig setConn = new SetConfig();
setruleconfig.deleteRules(tabbedPane1.getTitleAt(tabbedPane1.getSelectedIndex())); setConn.deleteRules(ruleTabbedPane.getTitleAt(ruleTabbedPane.getSelectedIndex()));
tabbedPane1.remove(tabbedPane1.getSelectedIndex()); ruleTabbedPane.remove(ruleTabbedPane.getSelectedIndex());
tabbedPane1.setSelectedIndex(tabbedPane1.getSelectedIndex()-1); ruleTabbedPane.setSelectedIndex(ruleTabbedPane.getSelectedIndex()-1);
}else{ } else {
SetRuleConfig setruleconfig = new SetRuleConfig(); SetConfig setConn = new SetConfig();
setruleconfig.deleteRules(tabbedPane1.getTitleAt(tabbedPane1.getSelectedIndex())); setConn.deleteRules(ruleTabbedPane.getTitleAt(ruleTabbedPane.getSelectedIndex()));
tabbedPane1.remove(tabbedPane1.getSelectedIndex()); ruleTabbedPane.remove(ruleTabbedPane.getSelectedIndex());
tabbedPane1.setSelectedIndex(tabbedPane1.getSelectedIndex()); ruleTabbedPane.setSelectedIndex(ruleTabbedPane.getSelectedIndex());
} }
} }
} }
private void SelectFileMouseClicked(MouseEvent e) { private void onlineUpdateMouseClicked(MouseEvent e) {
JFileChooser chooseconfig = new JFileChooser(); String url = "https://raw.githubusercontent.com/gh0stkey/HaE/gh-pages/Config.yml";
chooseconfig.setFileSelectionMode(JFileChooser.FILES_ONLY); OkHttpClient httpClient = new OkHttpClient();
FileNameExtensionFilter filter = new FileNameExtensionFilter("Yaml File (.yml/.yaml)","yaml", "yml"); Request httpRequest = new Request.Builder().url(url).get().build();
chooseconfig.setFileFilter(filter); try {
int selectframe = chooseconfig.showDialog(new JLabel(),"Select"); Response httpResponse = httpClient.newCall(httpRequest).execute();
if (selectframe == JFileChooser.APPROVE_OPTION){ // 获取官方规则文件,在线更新写入
String configpath = chooseconfig.getSelectedFile().toString(); String configFile = configTextField.getText();
reloadRule(configpath); FileOutputStream fileOutputStream = new FileOutputStream(configFile);
loadfile.setConfigPath(configpath); 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);
} }
configfilepathtext.setText(loadfile.getConfigPath());
} new LoadConfig();
private void reloadRule(String configfile){
tabbedPane1.removeAll();
LoadRule loadrule = new LoadRule(configfile);
Map<String,Object[][]> config = loadrule.getConfig();
ruleSwitch.setListen(false);
config.keySet().forEach(i->tabbedPane1.addTab(i,new RulePane(config.get(i),tabbedPane1)));
tabbedPane1.addTab("...",new JLabel());
ruleSwitch.setListen(true);
} }
private void reloadRule(){ private void reloadRule(){
tabbedPane1.removeAll(); ruleTabbedPane.removeAll();
LoadRule loadrule = new LoadRule(loadfile.getConfigPath());
Map<String,Object[][]> config = loadrule.getConfig();
ruleSwitch.setListen(false); ruleSwitch.setListen(false);
config.keySet().forEach(i->tabbedPane1.addTab(i,new RulePane(config.get(i),tabbedPane1)) Map<String,Object[][]> rules = LoadConfig.getRules();
rules.keySet().forEach(
i-> ruleTabbedPane.addTab(
i,
new RulePane(rules.get(i), ruleTabbedPane)
)
); );
tabbedPane1.addTab("...",new JLabel()); ruleTabbedPane.addTab("...", new JLabel());
ruleSwitch.setListen(true); ruleSwitch.setListen(true);
} }
private void reloadMouseClicked(MouseEvent e) { private void reloadMouseClicked(MouseEvent e) {
reloadRule(); reloadRule();
} }
private void ESSaveMouseClicked(MouseEvent e) {
// TODO add your code here private void excludeSuffixSaveMouseClicked(MouseEvent e) {
LoadConfigFile lcf = new LoadConfigFile(); LoadConfig loadCon = new LoadConfig();
lcf.setExcludeSuffix(EStext.getText()); loadCon.setExcludeSuffix(excludeSuffixTextField.getText());
} }
private void initComponents() { private void initComponents() {
tabbedPane2 = new JTabbedPane(); mainTabbedPane = new JTabbedPane();
tabbedPane1 = new JTabbedPane(); ruleTabbedPane = new JTabbedPane();
panel3 = new JPanel(); rulePanel = new JPanel();
configfilepathtext = new JTextField(); configTextField = new JTextField();
label1 = new JLabel(); configLabel = new JLabel();
SelectFile = new JButton(); onlineUpdateButton = new JButton();
reload = new JButton(); reloadButton = new JButton();
label2 = new JLabel(); excludeSuffixLabel = new JLabel();
EStext = new JTextField(); excludeSuffixTextField = new JTextField();
ESSave = new JButton(); excludeSuffixSaveButton = new JButton();
//======== this ========
setLayout(new GridBagLayout()); setLayout(new GridBagLayout());
((GridBagLayout)getLayout()).columnWidths = new int[] {0, 0}; ((GridBagLayout)getLayout()).columnWidths = new int[] {0, 0};
((GridBagLayout)getLayout()).rowHeights = new int[] {0, 0}; ((GridBagLayout)getLayout()).rowHeights = new int[] {0, 0};
((GridBagLayout)getLayout()).columnWeights = new double[] {1.0, 1.0E-4}; ((GridBagLayout)getLayout()).columnWeights = new double[] {1.0, 1.0E-4};
((GridBagLayout)getLayout()).rowWeights = new double[] {1.0, 1.0E-4}; ((GridBagLayout)getLayout()).rowWeights = new double[] {1.0, 1.0E-4};
//======== tabbedPane2 ========
{ {
tabbedPane2.addTab("Rules", tabbedPane1); mainTabbedPane.addTab("Rules", ruleTabbedPane);
//======== panel3 ========
{ {
panel3.setLayout(new GridBagLayout()); rulePanel.setLayout(new GridBagLayout());
((GridBagLayout)panel3.getLayout()).columnWidths = new int[] {0, 0, 0, 0, 0}; ((GridBagLayout) rulePanel.getLayout()).columnWidths = new int[] {0, 0, 0, 0, 0};
((GridBagLayout)panel3.getLayout()).rowHeights = new int[] {0, 0, 0}; ((GridBagLayout) rulePanel.getLayout()).rowHeights = new int[] {0, 0, 0};
((GridBagLayout)panel3.getLayout()).columnWeights = new double[] {0.0, 1.0, 0.0, 0.0, 1.0E-4}; ((GridBagLayout) rulePanel.getLayout()).columnWeights = new double[] {0.0, 1.0, 0.0, 0.0, 1.0E-4};
((GridBagLayout)panel3.getLayout()).rowWeights = new double[] {0.0, 0.0, 1.0E-4}; ((GridBagLayout) rulePanel.getLayout()).rowWeights = new double[] {0.0, 0.0, 1.0E-4};
//---- configfilepathtext ---- configTextField.setEditable(false);
configfilepathtext.setEditable(false); rulePanel.add(configTextField, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0,
panel3.add(configfilepathtext, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0,
GridBagConstraints.CENTER, GridBagConstraints.BOTH, GridBagConstraints.CENTER, GridBagConstraints.BOTH,
new Insets(5, 0, 5, 5), 0, 0)); new Insets(5, 0, 5, 5), 0, 0));
//---- label1 ---- configLabel.setText("Config Path:");
label1.setText("Config File Path:"); rulePanel.add(configLabel, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0,
panel3.add(label1, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0,
GridBagConstraints.WEST, GridBagConstraints.VERTICAL, GridBagConstraints.WEST, GridBagConstraints.VERTICAL,
new Insets(5, 5, 5, 5), 0, 0)); new Insets(5, 5, 5, 5), 0, 0));
//---- SelectFile ---- onlineUpdateButton.setText("Online Update");
SelectFile.setText("Select File ..."); onlineUpdateButton.addMouseListener(new MouseAdapter() {
SelectFile.addMouseListener(new MouseAdapter() {
@Override @Override
public void mouseClicked(MouseEvent e) { public void mouseClicked(MouseEvent e) {
SelectFileMouseClicked(e); onlineUpdateMouseClicked(e);
} }
}); });
panel3.add(SelectFile, new GridBagConstraints(2, 0, 1, 1, 0.0, 0.0, rulePanel.add(onlineUpdateButton, new GridBagConstraints(2, 0, 1, 1, 0.0, 0.0,
GridBagConstraints.CENTER, GridBagConstraints.BOTH, GridBagConstraints.CENTER, GridBagConstraints.BOTH,
new Insets(5, 0, 5, 5), 0, 0)); new Insets(5, 0, 5, 5), 0, 0));
//---- reload ---- reloadButton.setText("Reload");
reload.setText("Reload"); reloadButton.addMouseListener(new MouseAdapter() {
reload.addMouseListener(new MouseAdapter() {
@Override @Override
public void mouseClicked(MouseEvent e) { public void mouseClicked(MouseEvent e) {
reloadMouseClicked(e); reloadMouseClicked(e);
} }
}); });
panel3.add(reload, new GridBagConstraints(3, 0, 1, 1, 0.0, 0.0, rulePanel.add(reloadButton, new GridBagConstraints(3, 0, 1, 1, 0.0, 0.0,
GridBagConstraints.CENTER, GridBagConstraints.BOTH, GridBagConstraints.CENTER, GridBagConstraints.BOTH,
new Insets(5, 0, 5, 5), 0, 0)); new Insets(5, 0, 5, 5), 0, 0));
//---- label2 ----
label2.setText("ExcludeSuffix:"); excludeSuffixLabel.setText("Exclude Suffix:");
panel3.add(label2, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0, rulePanel.add(excludeSuffixLabel, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0,
GridBagConstraints.SOUTHWEST, GridBagConstraints.NONE, GridBagConstraints.SOUTHWEST, GridBagConstraints.NONE,
new Insets(0, 5, 5, 5), 0, 0)); new Insets(0, 5, 5, 5), 0, 0));
panel3.add(EStext, new GridBagConstraints(1, 1, 1, 1, 0.0, 0.0, rulePanel.add(excludeSuffixTextField, new GridBagConstraints(1, 1, 1, 1, 0.0, 0.0,
GridBagConstraints.SOUTH, GridBagConstraints.HORIZONTAL, GridBagConstraints.SOUTH, GridBagConstraints.HORIZONTAL,
new Insets(0, 0, 0, 5), 0, 0)); new Insets(0, 0, 0, 5), 0, 0));
//---- ESSave ---- excludeSuffixSaveButton.setText("Save");
ESSave.setText("Save"); excludeSuffixSaveButton.addMouseListener(new MouseAdapter() {
ESSave.addMouseListener(new MouseAdapter() {
@Override @Override
public void mouseClicked(MouseEvent e) { public void mouseClicked(MouseEvent e) {
ESSaveMouseClicked(e); excludeSuffixSaveMouseClicked(e);
} }
}); });
panel3.add(ESSave, new GridBagConstraints(2, 1, 1, 1, 0.0, 0.0, rulePanel.add(excludeSuffixSaveButton, new GridBagConstraints(2, 1, 1, 1, 0.0, 0.0,
GridBagConstraints.SOUTH, GridBagConstraints.HORIZONTAL, GridBagConstraints.SOUTH, GridBagConstraints.HORIZONTAL,
new Insets(0, 0, 0, 5), 0, 0)); new Insets(0, 0, 0, 5), 0, 0));
} }
tabbedPane2.addTab("Config", panel3); mainTabbedPane.addTab("Config", rulePanel);
mainTabbedPane.addTab("Databoard", databoardPanel);
} }
add(tabbedPane2, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0, add(mainTabbedPane, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0,
GridBagConstraints.CENTER, GridBagConstraints.BOTH, GridBagConstraints.CENTER, GridBagConstraints.BOTH,
new Insets(0, 0, 0, 0), 0, 0)); new Insets(0, 0, 0, 0), 0, 0));
// JFormDesigner - End of component initialization //GEN-END:initComponents
LoadRule loadRule = new LoadRule(loadfile.getConfigPath()); Config.ruleConfig.keySet().forEach(i-> ruleTabbedPane.addTab(i,new RulePane(Config.ruleConfig.get(i),
Map<String,Object[][]> config = loadRule.getConfig(); ruleTabbedPane)));
config.keySet().forEach(i->tabbedPane1.addTab(i,new RulePane(config.get(i),tabbedPane1)));
tabbedPane1.addTab("...",new JLabel()); ruleTabbedPane.addTab("...",new JLabel());
//TabTitleEditListener ruleSwitch = new TabTitleEditListener(tabbedPane1); configTextField.setText(LoadConfig.getConfigPath());
configfilepathtext.setText(loadfile.getConfigPath()); excludeSuffixTextField.setText(loadConn.getExcludeSuffix());
LoadConfigFile lcf =new LoadConfigFile(); ruleSwitch = new TabTitleEditListener(ruleTabbedPane);
EStext.setText(lcf.getExcludeSuffix()); ruleTabbedPane.addChangeListener(ruleSwitch);
ruleSwitch = new TabTitleEditListener(tabbedPane1); ruleTabbedPane.addMouseListener(ruleSwitch);
tabbedPane1.addChangeListener(ruleSwitch); closeTabMenuItem.addActionListener(e -> closeTabActionPerformed(e));
tabbedPane1.addMouseListener(ruleSwitch); tabMenu.add(closeTabMenuItem);
closeTab.addActionListener(e -> closeTabActionPerformed(e));
tabMenu.add(closeTab);
} }
// JFormDesigner - Variables declaration - DO NOT MODIFY //GEN-BEGIN:variables private JTabbedPane mainTabbedPane;
private JTabbedPane tabbedPane2; private JTabbedPane ruleTabbedPane;
private JTabbedPane tabbedPane1; private JPanel rulePanel;
private JPanel panel3; private JTextField configTextField;
private JTextField configfilepathtext; private JLabel configLabel;
private JLabel label1; private JButton onlineUpdateButton;
private JButton SelectFile; private JButton reloadButton;
private JButton reload; private JLabel excludeSuffixLabel;
private JLabel label2; private JTextField excludeSuffixTextField;
private JTextField EStext; private JButton excludeSuffixSaveButton;
private JButton ESSave; private Databoard databoardPanel = new Databoard();
// JFormDesigner - End of variables declaration //GEN-END:variables
protected static JPopupMenu tabMenu = new JPopupMenu(); protected static JPopupMenu tabMenu = new JPopupMenu();
private JMenuItem closeTab = new JMenuItem("Delete"); private JMenuItem closeTabMenuItem = new JMenuItem("Delete");
private TabTitleEditListener ruleSwitch; private TabTitleEditListener ruleSwitch;
private LoadConfigFile loadfile = new LoadConfigFile();
} }
class TabTitleEditListener extends MouseAdapter implements ChangeListener, DocumentListener { class TabTitleEditListener extends MouseAdapter implements ChangeListener, DocumentListener {
protected final JTextField editor = new JTextField(); protected final JTextField ruleEditTextField = new JTextField();
protected final JTabbedPane tabbedPane; protected final JTabbedPane ruleEditTabbedPane;
protected int editingIdx = -1; protected int editingIndex = -1;
protected int len = -1; protected int len = -1;
protected Boolean listen = true; protected Boolean listen = true;
protected Dimension dim; protected Dimension dim;
protected Component tabComponent; protected Component tabComponent;
protected Boolean isRenamesucc = false; protected Boolean isRenameOk = false;
protected LoadConfigFile loadfile = new LoadConfigFile(); protected SetConfig setConfig = new SetConfig();
protected LoadRule lr = new LoadRule(loadfile.getConfigPath());
protected SetRuleConfig setRuleConfig = new SetRuleConfig();
protected final Action startEditing = new AbstractAction() { protected final Action startEditing = new AbstractAction() {
@Override public void actionPerformed(ActionEvent e) { @Override public void actionPerformed(ActionEvent e) {
editingIdx = tabbedPane.getSelectedIndex(); editingIndex = ruleEditTabbedPane.getSelectedIndex();
tabComponent = tabbedPane.getTabComponentAt(editingIdx); tabComponent = ruleEditTabbedPane.getTabComponentAt(editingIndex);
tabbedPane.setTabComponentAt(editingIdx, editor); ruleEditTabbedPane.setTabComponentAt(editingIndex, ruleEditTextField);
isRenamesucc = true; isRenameOk = true;
editor.setVisible(true); ruleEditTextField.setVisible(true);
editor.setText(tabbedPane.getTitleAt(editingIdx)); ruleEditTextField.setText(ruleEditTabbedPane.getTitleAt(editingIndex));
editor.selectAll(); ruleEditTextField.selectAll();
editor.requestFocusInWindow(); ruleEditTextField.requestFocusInWindow();
len = editor.getText().length(); len = ruleEditTextField.getText().length();
dim = editor.getPreferredSize(); dim = ruleEditTextField.getPreferredSize();
editor.setMinimumSize(dim); ruleEditTextField.setMinimumSize(dim);
} }
}; };
protected final Action renameTabTitle = new AbstractAction() { protected final Action renameTabTitle = new AbstractAction() {
@Override public void actionPerformed(ActionEvent e) { @Override public void actionPerformed(ActionEvent e) {
String title = editor.getText().trim(); String title = ruleEditTextField.getText().trim();
if (editingIdx >= 0 && !title.isEmpty()) { if (editingIndex >= 0 && !title.isEmpty()) {
String oldname = tabbedPane.getTitleAt(editingIdx); String oldName = ruleEditTabbedPane.getTitleAt(editingIndex);
tabbedPane.setTitleAt(editingIdx, title); ruleEditTabbedPane.setTitleAt(editingIndex, title);
setRuleConfig.rename(oldname,title); setConfig.rename(oldName,title);
} }
cancelEditing.actionPerformed(null); cancelEditing.actionPerformed(null);
} }
}; };
protected final Action cancelEditing = new AbstractAction() { protected final Action cancelEditing = new AbstractAction() {
@Override public void actionPerformed(ActionEvent e) { @Override public void actionPerformed(ActionEvent e) {
if (editingIdx >= 0) { if (editingIndex >= 0) {
tabbedPane.setTabComponentAt(editingIdx, tabComponent); ruleEditTabbedPane.setTabComponentAt(editingIndex, tabComponent);
editor.setVisible(false); ruleEditTextField.setVisible(false);
editingIdx = -1; editingIndex = -1;
len = -1; len = -1;
tabComponent = null; tabComponent = null;
editor.setPreferredSize(null); ruleEditTextField.setPreferredSize(null);
tabbedPane.requestFocusInWindow(); ruleEditTabbedPane.requestFocusInWindow();
} }
} }
}; };
protected TabTitleEditListener(JTabbedPane tabbedPane) { protected TabTitleEditListener(JTabbedPane tabbedPane) {
super(); super();
this.tabbedPane = tabbedPane; this.ruleEditTabbedPane = tabbedPane;
editor.setBorder(BorderFactory.createEmptyBorder()); ruleEditTextField.setBorder(BorderFactory.createEmptyBorder());
editor.addFocusListener(new FocusAdapter() { ruleEditTextField.addFocusListener(new FocusAdapter() {
@Override public void focusLost(FocusEvent e) { @Override public void focusLost(FocusEvent e) {
renameTabTitle.actionPerformed(null); renameTabTitle.actionPerformed(null);
} }
}); });
InputMap im = editor.getInputMap(JComponent.WHEN_FOCUSED); InputMap im = ruleEditTextField.getInputMap(JComponent.WHEN_FOCUSED);
ActionMap am = editor.getActionMap(); ActionMap am = ruleEditTextField.getActionMap();
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "cancel-editing"); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "cancel-editing");
am.put("cancel-editing", cancelEditing); am.put("cancel-editing", cancelEditing);
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "rename-tab-title"); im.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "rename-tab-title");
am.put("rename-tab-title", renameTabTitle); am.put("rename-tab-title", renameTabTitle);
editor.getDocument().addDocumentListener(this); ruleEditTextField.getDocument().addDocumentListener(this);
tabbedPane.getInputMap(JComponent.WHEN_FOCUSED).put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "start-editing"); tabbedPane.getInputMap(JComponent.WHEN_FOCUSED).put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "start-editing");
tabbedPane.getActionMap().put("start-editing", startEditing); tabbedPane.getActionMap().put("start-editing", startEditing);
} }
@Override public void stateChanged(ChangeEvent e) { @Override public void stateChanged(ChangeEvent e) {
if (e.getSource() instanceof JTabbedPane && listen) { if (e.getSource() instanceof JTabbedPane && listen) {
JTabbedPane pane = (JTabbedPane) e.getSource(); JTabbedPane pane = (JTabbedPane) e.getSource();
if (!isRenamesucc){ if (!isRenameOk){
if (pane.getSelectedIndex() == pane.getComponentCount()-1){ if (pane.getSelectedIndex() == pane.getComponentCount()-1){
newTab(); newTab();
} }
@@ -296,18 +291,22 @@ class TabTitleEditListener extends MouseAdapter implements ChangeListener, Docum
} }
renameTabTitle.actionPerformed(null); renameTabTitle.actionPerformed(null);
} }
public void newTab(){ public void newTab(){
Object[][] data = new Object[][]{{false, "New Name", "(New Regex)", "gray", "any", "nfa"}}; Object[][] data = new Object[][]{{false, "New Name", "(New Regex)", "gray", "any", "nfa", false}};
insertTab(tabbedPane,setRuleConfig.newRules(),data); insertTab(ruleEditTabbedPane, setConfig.newRules(),data);
} }
public void insertTab(@NotNull JTabbedPane pane,String title,Object[][] data){
public void insertTab(JTabbedPane pane,String title,Object[][] data){
pane.addTab(title,new RulePane(data,pane)); pane.addTab(title,new RulePane(data,pane));
pane.remove(pane.getSelectedIndex()); pane.remove(pane.getSelectedIndex());
pane.addTab("...",new JLabel()); pane.addTab("...",new JLabel());
} }
public void setListen(Boolean listen){ public void setListen(Boolean listen){
this.listen = listen; this.listen = listen;
} }
@Override public void insertUpdate(DocumentEvent e) { @Override public void insertUpdate(DocumentEvent e) {
updateTabSize(); updateTabSize();
} }
@@ -322,7 +321,7 @@ class TabTitleEditListener extends MouseAdapter implements ChangeListener, Docum
switch (e.getButton()){ switch (e.getButton()){
case 1: case 1:
{ {
Rectangle r = tabbedPane.getBoundsAt(tabbedPane.getSelectedIndex()); Rectangle r = ruleEditTabbedPane.getBoundsAt(ruleEditTabbedPane.getSelectedIndex());
boolean isDoubleClick = e.getClickCount() >= 2; boolean isDoubleClick = e.getClickCount() >= 2;
if (isDoubleClick && r.contains(e.getPoint())) { if (isDoubleClick && r.contains(e.getPoint())) {
startEditing.actionPerformed(null); startEditing.actionPerformed(null);
@@ -341,7 +340,7 @@ class TabTitleEditListener extends MouseAdapter implements ChangeListener, Docum
} }
protected void updateTabSize() { protected void updateTabSize() {
editor.setPreferredSize(editor.getText().length() > len ? null : dim); ruleEditTextField.setPreferredSize(ruleEditTextField.getText().length() > len ? null : dim);
tabbedPane.revalidate(); ruleEditTabbedPane.revalidate();
} }
} }

View File

@@ -1,7 +1,8 @@
package burp.ui; package burp.ui;
import burp.yaml.SetRuleConfig; import burp.yaml.SetConfig;
import java.awt.event.ComponentListener;
import javax.swing.*; import javax.swing.*;
import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener; import javax.swing.event.TableModelListener;
@@ -12,83 +13,91 @@ import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
import java.util.Vector; import java.util.Vector;
/* /**
* @author LinChen * @author LinChen
*/ */
public class RulePane extends JPanel { public class RulePane extends JPanel {
public RulePane(Object[][] data,JTabbedPane pane) { public RulePane(Object[][] data, JTabbedPane pane) {
initComponents(data,pane); initComponents(data, pane);
} }
private SetRuleConfig setruleconfig = new SetRuleConfig(); private SetConfig setConfig = new SetConfig();
private Boolean isEdit = false; private Boolean isEdit = false;
private void RuleAddMouseClicked(MouseEvent e, JTabbedPane pane) {
// TODO add your code here private void ruleAddMouseClicked(MouseEvent e, JTabbedPane pane) {
RuleSetting add = new RuleSetting(); RuleSetting ruleSettingPanel = new RuleSetting();
int isOk = JOptionPane.showConfirmDialog(null,add,"RuleSetting - Add Rule",JOptionPane.OK_OPTION); int showState = JOptionPane.showConfirmDialog(null, ruleSettingPanel, "RuleSetting - Add Rule", JOptionPane.OK_OPTION);
if(isOk == 0){ if(showState == 0){
Vector data = new Vector(); Vector ruleData = new Vector();
data.add(false); ruleData.add(false);
data.add(add.Name.getText()); ruleData.add(ruleSettingPanel.ruleNameTextField.getText());
data.add(add.Regex.getText()); ruleData.add(ruleSettingPanel.regexTextField.getText());
data.add(add.ColorSelect.getSelectedItem().toString()); ruleData.add(ruleSettingPanel.colorComboBox.getSelectedItem().toString());
data.add(add.ScopeSelect.getSelectedItem().toString()); ruleData.add(ruleSettingPanel.scopeComboBox.getSelectedItem().toString());
data.add(add.EngineSelect.getSelectedItem().toString()); ruleData.add(ruleSettingPanel.engineComboBox.getSelectedItem().toString());
model.insertRow(model.getRowCount(),data); ruleData.add(ruleSettingPanel.sensitiveComboBox.getSelectedItem());
model = (DefaultTableModel) table.getModel(); model.insertRow(model.getRowCount(), ruleData);
setruleconfig.add(data,pane.getTitleAt(pane.getSelectedIndex())); model = (DefaultTableModel) ruleTable.getModel();
setConfig.add(ruleData, pane.getTitleAt(pane.getSelectedIndex()));
} }
} }
private void RuleEditMouseClicked(MouseEvent e,JTabbedPane pane){ private void ruleEditMouseClicked(MouseEvent e, JTabbedPane pane){
if (table.getSelectedRowCount()>=1){ if (ruleTable.getSelectedRowCount() >= 1){
RuleSetting edit = new RuleSetting(); RuleSetting ruleSettingPanel = new RuleSetting();
edit.Name.setText(table.getValueAt(table.getSelectedRow(),1).toString()); ruleSettingPanel.ruleNameTextField.setText(ruleTable.getValueAt(ruleTable.getSelectedRow(), 1).toString());
edit.Regex.setText(table.getValueAt(table.getSelectedRow(),2).toString()); ruleSettingPanel.regexTextField.setText(ruleTable.getValueAt(ruleTable.getSelectedRow(), 2).toString());
edit.ColorSelect.setSelectedItem(table.getValueAt(table.getSelectedRow(),3).toString()); ruleSettingPanel.colorComboBox.setSelectedItem(ruleTable.getValueAt(ruleTable.getSelectedRow(), 3).toString());
edit.ScopeSelect.setSelectedItem(table.getValueAt(table.getSelectedRow(),4).toString()); ruleSettingPanel.scopeComboBox.setSelectedItem(ruleTable.getValueAt(ruleTable.getSelectedRow(), 4).toString());
edit.EngineSelect.setSelectedItem(table.getValueAt(table.getSelectedRow(),5).toString()); ruleSettingPanel.engineComboBox.setSelectedItem(ruleTable.getValueAt(ruleTable.getSelectedRow(), 5).toString());
int isOk = JOptionPane.showConfirmDialog(null,edit,"RuleSetting - Edit Rule",JOptionPane.OK_OPTION); ruleSettingPanel.sensitiveComboBox.setSelectedItem(ruleTable.getValueAt(ruleTable.getSelectedRow(),6));
if (isOk ==0){
int select = table.convertRowIndexToModel(table.getSelectedRow()); ruleSettingPanel.sensitiveComboBox.setEnabled(
model.setValueAt(edit.Name.getText(),select,1); ruleSettingPanel.engineComboBox.getSelectedItem().toString().equals("nfa")
model.setValueAt(edit.Regex.getText(),select,2); );
model.setValueAt(edit.ColorSelect.getSelectedItem().toString(),select,3);
model.setValueAt(edit.ScopeSelect.getSelectedItem().toString(),select,4); int showState = JOptionPane.showConfirmDialog(null, ruleSettingPanel, "RuleSetting - Edit Rule", JOptionPane.OK_OPTION);
model.setValueAt(edit.EngineSelect.getSelectedItem().toString(),select,5); if (showState == 0){
model = (DefaultTableModel) table.getModel(); int select = ruleTable.convertRowIndexToModel(ruleTable.getSelectedRow());
setruleconfig.edit((Vector) model.getDataVector().get(select),select,pane.getTitleAt(pane.getSelectedIndex())); model.setValueAt(ruleSettingPanel.ruleNameTextField.getText(), select, 1);
model.setValueAt(ruleSettingPanel.regexTextField.getText(), select, 2);
model.setValueAt(ruleSettingPanel.colorComboBox.getSelectedItem().toString(), select, 3);
model.setValueAt(ruleSettingPanel.scopeComboBox.getSelectedItem().toString(), select, 4);
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()));
} }
} }
} }
private void RuleRemoveMouseClicked(MouseEvent e,JTabbedPane pane){ private void ruleRemoveMouseClicked(MouseEvent e, JTabbedPane pane){
if (table.getSelectedRowCount()>=1){ 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?", "RuleSetting - Delete Rule", JOptionPane.OK_OPTION);
if (isOk==0){ if (isOk == 0){
int select = table.convertRowIndexToModel(table.getSelectedRow()); int select = ruleTable.convertRowIndexToModel(ruleTable.getSelectedRow());
model.removeRow(select); model.removeRow(select);
model = (DefaultTableModel) table.getModel(); model = (DefaultTableModel) ruleTable.getModel();
setruleconfig.remove(select,pane.getTitleAt(pane.getSelectedIndex())); setConfig.remove(select, pane.getTitleAt(pane.getSelectedIndex()));
} }
} }
} }
private void RuleTableChange(TableModelEvent e,JTabbedPane pane) { private void ruleTableChange(TableModelEvent e, JTabbedPane pane) {
if (e.getColumn()==0&&table.getSelectedRow()!=-1&&!isEdit){ if (e.getColumn() == 0 && ruleTable.getSelectedRow() != -1 && !isEdit){
model = (DefaultTableModel) table.getModel(); model = (DefaultTableModel) ruleTable.getModel();
int select = table.convertRowIndexToModel(table.getSelectedRow()); int select = ruleTable.convertRowIndexToModel(ruleTable.getSelectedRow());
setruleconfig.edit((Vector) model.getDataVector().get(select),select,pane.getTitleAt(pane.getSelectedIndex())); setConfig.edit((Vector) model.getDataVector().get(select), select, pane.getTitleAt(pane.getSelectedIndex()));
} }
} }
private void initComponents(Object[][] data,JTabbedPane pane) { private void initComponents(Object[][] data, JTabbedPane pane) {
// JFormDesigner - Component initialization - DO NOT MODIFY //GEN-BEGIN:initComponents // JFormDesigner - Component initialization - DO NOT MODIFY //GEN-BEGIN:initComponents
RuleAdd = new JButton(); addButton = new JButton();
RuleEdit = new JButton(); editButton = new JButton();
scrollPane = new JScrollPane(); scrollPane = new JScrollPane();
table = new JTable(); ruleTable = new JTable();
Remove = new JButton(); removeButton = new JButton();
//======== this ======== //======== this ========
setLayout(new GridBagLayout()); setLayout(new GridBagLayout());
@@ -97,100 +106,106 @@ public class RulePane extends JPanel {
((GridBagLayout)getLayout()).columnWeights = new double[] {0.0, 1.0, 1.0E-4}; ((GridBagLayout)getLayout()).columnWeights = new double[] {0.0, 1.0, 1.0E-4};
((GridBagLayout)getLayout()).rowWeights = new double[] {0.0, 0.0, 0.0, 1.0, 1.0E-4}; ((GridBagLayout)getLayout()).rowWeights = new double[] {0.0, 0.0, 0.0, 1.0, 1.0E-4};
//---- RuleAdd ---- //---- addButton ----
RuleAdd.setText("Add"); addButton.setText("Add");
RuleAdd.addMouseListener(new MouseAdapter() {
addButton.addMouseListener(new MouseAdapter() {
@Override @Override
public void mouseClicked(MouseEvent e) { public void mouseClicked(MouseEvent e) {
isEdit = true; isEdit = true;
RuleAddMouseClicked(e,pane); ruleAddMouseClicked(e, pane);
model = (DefaultTableModel) table.getModel(); model = (DefaultTableModel) ruleTable.getModel();
isEdit = false; isEdit = false;
} }
}); });
add(RuleAdd, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0,
add(addButton, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0,
GridBagConstraints.CENTER, GridBagConstraints.BOTH, GridBagConstraints.CENTER, GridBagConstraints.BOTH,
new Insets(15, 5, 3, 2), 0, 0)); new Insets(15, 5, 3, 2), 0, 0));
//---- RuleEdit ---- //---- editButton ----
RuleEdit.setText("Edit"); editButton.setText("Edit");
RuleEdit.addMouseListener(new MouseAdapter() { editButton.addMouseListener(new MouseAdapter() {
@Override @Override
public void mouseClicked(MouseEvent e) { public void mouseClicked(MouseEvent e) {
isEdit = true; isEdit = true;
RuleEditMouseClicked(e,pane); ruleEditMouseClicked(e, pane);
model = (DefaultTableModel) table.getModel(); model = (DefaultTableModel) ruleTable.getModel();
isEdit = false; isEdit = false;
} }
}); });
add(RuleEdit, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0,
add(editButton, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0,
GridBagConstraints.CENTER, GridBagConstraints.BOTH, GridBagConstraints.CENTER, GridBagConstraints.BOTH,
new Insets(0, 5, 3, 2), 0, 0)); new Insets(0, 5, 3, 2), 0, 0));
//======== scrollPane ======== //======== scrollPane ========
{ {
//---- table ---- //---- table ----
table.setShowVerticalLines(false); ruleTable.setShowVerticalLines(false);
table.setVerifyInputWhenFocusTarget(false); ruleTable.setVerifyInputWhenFocusTarget(false);
table.setUpdateSelectionOnSort(false); ruleTable.setUpdateSelectionOnSort(false);
table.setShowHorizontalLines(false); ruleTable.setShowHorizontalLines(false);
table.setModel(new DefaultTableModel()); ruleTable.setModel(new DefaultTableModel());
table.setSurrendersFocusOnKeystroke(true); ruleTable.setSurrendersFocusOnKeystroke(true);
scrollPane.setViewportView(table); scrollPane.setViewportView(ruleTable);
} }
add(scrollPane, new GridBagConstraints(1, 0, 1, 4, 0.0, 0.0, add(scrollPane, new GridBagConstraints(1, 0, 1, 4, 0.0, 0.0,
GridBagConstraints.CENTER, GridBagConstraints.BOTH, GridBagConstraints.CENTER, GridBagConstraints.BOTH,
new Insets(15, 5, 5, 5), 0, 0)); new Insets(15, 5, 5, 5), 0, 0));
//---- Remove ---- //---- removeButton ----
Remove.setText("Remove"); removeButton.setText("Remove");
Remove.addMouseListener(new MouseAdapter() {
removeButton.addMouseListener(new MouseAdapter() {
@Override @Override
public void mouseClicked(MouseEvent e) { public void mouseClicked(MouseEvent e) {
isEdit = true; isEdit = true;
RuleRemoveMouseClicked(e,pane); ruleRemoveMouseClicked(e, pane);
model = (DefaultTableModel) table.getModel(); model = (DefaultTableModel) ruleTable.getModel();
isEdit = false; isEdit = false;
} }
}); });
add(Remove, new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0,
add(removeButton, new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0,
GridBagConstraints.CENTER, GridBagConstraints.BOTH, GridBagConstraints.CENTER, GridBagConstraints.BOTH,
new Insets(0, 5, 3, 2), 0, 0)); new Insets(0, 5, 3, 2), 0, 0));
// JFormDesigner - End of component initialization //GEN-END:initComponents // JFormDesigner - End of component initialization //GEN-END:initComponents
table.setModel(model); ruleTable.setModel(model);
model.setDataVector(data,title); model.setDataVector(data, title);
model.addTableModelListener(new TableModelListener() { model.addTableModelListener(new TableModelListener() {
@Override @Override
public void tableChanged(TableModelEvent e) { public void tableChanged(TableModelEvent e) {
RuleTableChange(e,pane); ruleTableChange(e, pane);
} }
}); });
table.setRowSorter(new TableRowSorter(model));
ruleTable.setRowSorter(new TableRowSorter(model));
} }
// JFormDesigner - Variables declaration - DO NOT MODIFY //GEN-BEGIN:variables // JFormDesigner - Variables declaration - DO NOT MODIFY //GEN-BEGIN:variables
public JButton RuleAdd; public JButton addButton;
public JButton RuleEdit; public JButton editButton;
public JScrollPane scrollPane; public JScrollPane scrollPane;
public JTable table; public JTable ruleTable;
public JButton Remove; public JButton removeButton;
// JFormDesigner - End of variables declaration //GEN-END:variables // JFormDesigner - End of variables declaration //GEN-END:variables
private final String[] title = new String[]{"Loaded", "Name", "Regex", "Color", "Scope", "Engine"}; private final String[] title = new String[]{"Loaded", "Name", "Regex", "Color", "Scope", "Engine", "Sensitive"};
private DefaultTableModel model = new DefaultTableModel() { private DefaultTableModel model = new DefaultTableModel() {
public Class<?> getColumnClass ( int column){ @Override
public Class<?> getColumnClass (int column){
if (column == 0) { if (column == 0) {
return Boolean.class; return Boolean.class;
}else{ }else{
return String.class; return String.class;
} }
} }
public boolean isCellEditable(int row,int column){
if (column ==0){ @Override
return true; public boolean isCellEditable(int row, int column){
}else { return column == 0;
return false;
}
} }
}; };
} }

View File

@@ -1,10 +1,14 @@
package burp.ui; 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 javax.swing.*;
import java.awt.*; import java.awt.*;
import burp.Config; import burp.Config;
/* /**
* @author LinChen * @author LinChen
*/ */
@@ -14,67 +18,77 @@ public class RuleSetting extends JPanel {
} }
public void initComponents() { public void initComponents() {
// JFormDesigner - Component initialization - DO NOT MODIFY //GEN-BEGIN:initComponents sensitiveLabel = new JLabel();
label5 = new JLabel(); engineLabel = new JLabel();
label4 = new JLabel(); scopeLabel = new JLabel();
Regex = new JTextField(); regexTextField = new JTextField();
label3 = new JLabel(); regexLabel = new JLabel();
label2 = new JLabel(); nameLabel = new JLabel();
Name = new JTextField(); ruleNameTextField = new JTextField();
ScopeSelect = new JComboBox<>(); scopeComboBox = new JComboBox<>();
EngineSelect = new JComboBox<>(); engineComboBox = new JComboBox<>();
label6 = new JLabel(); colorLabel = new JLabel();
ColorSelect = new JComboBox<>(); colorComboBox = new JComboBox<>();
sensitiveComboBox = new JComboBox<>();
//======== this ========
setLayout(null); setLayout(null);
//---- label5 ---- engineLabel.setText("Engine:");
label5.setText("Engine:"); add(engineLabel);
add(label5); engineLabel.setBounds(new Rectangle(new Point(10, 175), engineLabel.getPreferredSize()));
label5.setBounds(new Rectangle(new Point(10, 175), label5.getPreferredSize()));
//---- label4 ---- sensitiveLabel.setText("Sensitive:");
label4.setText("Scope:"); add(sensitiveLabel);
add(label4); sensitiveLabel.setBounds(new Rectangle(new Point(10,215), sensitiveLabel.getPreferredSize()));
label4.setBounds(new Rectangle(new Point(10, 135), label4.getPreferredSize()));
add(Regex);
Regex.setBounds(70, 50, 265, 30);
//---- label3 ---- scopeLabel.setText("Scope:");
label3.setText("Regex:"); add(scopeLabel);
add(label3); scopeLabel.setBounds(new Rectangle(new Point(10, 135), scopeLabel.getPreferredSize()));
label3.setBounds(new Rectangle(new Point(10, 55), label3.getPreferredSize())); add(regexTextField);
regexTextField.setBounds(70, 50, 265, 30);
//---- label2 ---- regexLabel.setText("Regex:");
label2.setText("Name:"); add(regexLabel);
add(label2); regexLabel.setBounds(new Rectangle(new Point(10, 55), regexLabel.getPreferredSize()));
label2.setBounds(new Rectangle(new Point(10, 15), label2.getPreferredSize()));
add(Name);
Name.setBounds(70, 10, 265, 30);
//---- ScopeSelect ---- nameLabel.setText("Name:");
ScopeSelect.setModel(new DefaultComboBoxModel<>(Config.scopeArray)); add(nameLabel);
add(ScopeSelect); nameLabel.setBounds(new Rectangle(new Point(10, 15), nameLabel.getPreferredSize()));
ScopeSelect.setBounds(70, 130, 265, ScopeSelect.getPreferredSize().height); add(ruleNameTextField);
ruleNameTextField.setBounds(70, 10, 265, 30);
//---- EngineSelect ---- scopeComboBox.setModel(new DefaultComboBoxModel<>(Config.scopeArray));
EngineSelect.setModel(new DefaultComboBoxModel<>(Config.engineArray)); add(scopeComboBox);
add(EngineSelect); scopeComboBox.setBounds(70, 130, 265, scopeComboBox.getPreferredSize().height);
EngineSelect.setBounds(70, 170, 265, EngineSelect.getPreferredSize().height);
//---- label7 ---- engineComboBox.setModel(new DefaultComboBoxModel<>(Config.engineArray));
label6.setText("Color:"); engineComboBox.addActionListener(new ActionListener() {
add(label6); @Override
label6.setBounds(new Rectangle(new Point(10, 95), label6.getPreferredSize())); 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);
//---- ColorSelect ---- colorLabel.setText("Color:");
ColorSelect.setModel(new DefaultComboBoxModel<>(Config.colorArray)); add(colorLabel);
add(ColorSelect); colorLabel.setBounds(new Rectangle(new Point(10, 95), colorLabel.getPreferredSize()));
ColorSelect.setBounds(70, 90, 265, ColorSelect.getPreferredSize().height);
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);
{ {
// compute preferred size
Dimension preferredSize = new Dimension(); Dimension preferredSize = new Dimension();
for(int i = 0; i < getComponentCount(); i++) { for(int i = 0; i < getComponentCount(); i++) {
Rectangle bounds = getComponent(i).getBounds(); Rectangle bounds = getComponent(i).getBounds();
@@ -87,19 +101,18 @@ public class RuleSetting extends JPanel {
setMinimumSize(preferredSize); setMinimumSize(preferredSize);
setPreferredSize(preferredSize); setPreferredSize(preferredSize);
} }
// JFormDesigner - End of component initialization //GEN-END:initComponents
} }
// JFormDesigner - Variables declaration - DO NOT MODIFY //GEN-BEGIN:variables private JLabel engineLabel;
private JLabel label5; private JLabel sensitiveLabel;
private JLabel label4; private JLabel scopeLabel;
public JTextField Regex; public JTextField regexTextField;
private JLabel label3; private JLabel regexLabel;
private JLabel label2; private JLabel nameLabel;
public JTextField Name; public JTextField ruleNameTextField;
public JComboBox<String> ScopeSelect; public JComboBox<String> scopeComboBox;
public JComboBox<String> EngineSelect; public JComboBox<String> engineComboBox;
private JLabel label6; private JLabel colorLabel;
public JComboBox<String> ColorSelect; public JComboBox<String> colorComboBox;
// JFormDesigner - End of variables declaration //GEN-END:variables public JComboBox<Boolean> sensitiveComboBox;
} }

View File

@@ -0,0 +1,162 @@
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<String, Object> 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<Rule> rl = new ArrayList<>();
rl.add(rule);
rules.setRule(rl);
ArrayList<Rules> 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<String,Object> 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<String,Object> r = yaml.load(inorder);
excludeSuffix = r.get("excludeSuffix").toString();
} catch (Exception e) {
// e.printStackTrace();
excludeSuffix = "";
}
} else {
excludeSuffix = Config.excludeSuffix;
}
return excludeSuffix;
}
// 获取规则配置
public static Map<String,Object[][]> 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<String,Object[][]> resRule = new HashMap<>();
rulesConfig.rules.forEach(i->{
ArrayList<Object[]> 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<String,Object> 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();
}
}
}

View File

@@ -1,86 +0,0 @@
package burp.yaml;
import org.jetbrains.annotations.NotNull;
import org.yaml.snakeyaml.Yaml;
import java.io.*;
import java.util.HashMap;
import java.util.Map;
/*
* @author LinChen
*/
public class LoadConfigFile {
private static Yaml yaml = new Yaml();
private static final String SettingPath = "Setting.yml";
private static final String ConfigPath = "Config.yml";
public LoadConfigFile(){
init();
}
// 初始化配置
public void init(){
File yamlSetting = new File(SettingPath);
if (!(yamlSetting.exists() && yamlSetting.isFile())) {
Map<String,Object> r = new HashMap<>();
r.put("configPath", ConfigPath);
r.put("excludeSuffix", getExcludeSuffix());
try{
Writer ws = new OutputStreamWriter(new FileOutputStream(SettingPath),"UTF-8");
yaml.dump(r, ws);
}catch (Exception ex){
ex.printStackTrace();
}
}
}
public String getExcludeSuffix(){
try {
InputStream inorder = new FileInputStream(SettingPath);
Map<String,Object> r;
r = yaml.load(inorder);
return r.get("excludeSuffix").toString();
} catch (FileNotFoundException e) {
e.printStackTrace();
return "css|jpeg|gif|jpg|png|pdf|rar|zip|docx|doc|svg|jpeg|ico|woff|woff2|ttf|otf";
}
}
public String getConfigPath(){
try {
InputStream inorder = new FileInputStream(SettingPath);
Map<String,Object> r;
r = yaml.load(inorder);
return r.get("configPath").toString();
} catch (FileNotFoundException e) {
e.printStackTrace();
return ConfigPath;
}
}
public void setExcludeSuffix(@NotNull String excludeSuffix){
Map<String,Object> r = new HashMap<>();
r.put("excludeSuffix", excludeSuffix);
r.put("configPath", getConfigPath());
try{
Writer ws = new OutputStreamWriter(new FileOutputStream(SettingPath),"UTF-8");
yaml.dump(r, ws);
}catch (Exception ex){
ex.printStackTrace();
}
}
public void setConfigPath(@NotNull String filePath){
Map<String,Object> r = new HashMap<>();
r.put("configPath", filePath);
r.put("excludeSuffix", getExcludeSuffix());
try{
Writer ws = new OutputStreamWriter(new FileOutputStream(SettingPath),"UTF-8");
yaml.dump(r, ws);
}catch (Exception ex){
ex.printStackTrace();
}
}
}

View File

@@ -1,89 +0,0 @@
package burp.yaml;
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;
import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
/*
* @author LinChen
*/
public class LoadRule {
private static String filePath = "Config.yml";
public LoadRule(String configfile){
init();
filePath = configfile;
}
// 初始化配置
public void init(){
File settingyaml = new File(filePath);
if (!(settingyaml.exists() && settingyaml.isFile())){
Map<String,Object[][]> r = new HashMap<>();
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,}))");
Rules rules = new Rules();
rules.setType("Basic Information");
ArrayList<Rule> rl = new ArrayList<>();
rl.add(rule);
rules.setRule(rl);
ArrayList<Rules> rls = new ArrayList<>();
rls.add(rules);
Config config = new Config();
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);
LoadConfigFile loadfile = new LoadConfigFile();
File f = new File(loadfile.getConfigPath());
try{
Writer ws = new OutputStreamWriter(new FileOutputStream(f),"UTF-8");
yaml.dump(config,ws);
}catch (Exception ex){
ex.printStackTrace();
}
}
}
public static Map<String,Object[][]> getConfig(){
InputStream inorder = null;
{
try {
inorder = new FileInputStream(new File(filePath));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
Yaml yaml = new Yaml(new Constructor(Config.class));
Config plugin = yaml.loadAs(inorder, Config.class);
Map<String,Object[][]> config = new HashMap<>();
plugin.rules.forEach(i->{
ArrayList<Object[]> data = new ArrayList<>();
i.rule.forEach(j->{
try {
data.add(j.getRuleObject());
}catch (Exception e){
e.printStackTrace();
}
});
config.put(i.getType(), data.toArray(new Object[data.size()][]));
});
return config;
}
}

View File

@@ -1,18 +1,11 @@
package burp.yaml; package burp.yaml;
import java.util.List; import java.util.List;
import burp.yaml.template.Rules;
/* public class RulesConfig {
* @author LinChen
*/
public class Config {
public List<Rules> rules; public List<Rules> rules;
public List<Rules> getRules() {
return rules;
}
public void setRules(List<Rules> rules) { public void setRules(List<Rules> rules) {
this.rules = rules; this.rules = rules;
} }

View File

@@ -0,0 +1,101 @@
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<Rules> rls = new ArrayList<>();
Config.ruleConfig.keySet().forEach(i->
{
Rules rlsTmp = new Rules();
rlsTmp.setType(i);
List<Rule> 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<Object[]> 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<Object[]> 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;
}
}

View File

@@ -1,109 +0,0 @@
package burp.yaml;
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.util.*;
public class SetRuleConfig {
private static Yaml yaml;
private static LoadConfigFile loadfile;
private static LoadRule lr;
private Map<String,Object[][]> config = lr.getConfig();
public void format(){
DumperOptions dop = new DumperOptions();
dop.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
Representer representer = new Representer();
representer.addClassTag(Config.class, Tag.MAP);
yaml = new Yaml(new Constructor(),representer,dop);
Config con = new Config();
List<Rules> rls = new ArrayList<>();
config.keySet().forEach(i->
{
Rules rlstmp = new Rules();
rlstmp.setType(i);
List<Rule> rl = new ArrayList<>();
for (Object[] objects : config.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]);
rl.add(rltmp);
}
rlstmp.setRule(rl);
rls.add(rlstmp);
});
con.setRules(rls);
File f = new File(loadfile.getConfigPath());
try{
Writer ws = new OutputStreamWriter(new FileOutputStream(f),"UTF-8");
yaml.dump(con,ws);
}catch (Exception ex){
ex.printStackTrace();
}
}
public void edit(Vector data,int select, String type){
loadfile = new LoadConfigFile();
lr = new LoadRule(loadfile.getConfigPath());
config = lr.getConfig();
config.get(type)[select] = data.toArray();
this.format();
}
public void add(Vector data,String type){
loadfile = new LoadConfigFile();
lr = new LoadRule(loadfile.getConfigPath());
config = lr.getConfig();
ArrayList<Object[]> x = new ArrayList<Object[]>(Arrays.asList(config.get(type)));
x.add(data.toArray());
config.put(type,x.toArray(new Object[x.size()][]));
this.format();
}
public void remove(int select,String type){
loadfile = new LoadConfigFile();
lr = new LoadRule(loadfile.getConfigPath());
config = lr.getConfig();
ArrayList<Object[]> x = new ArrayList<Object[]>(Arrays.asList(config.get(type)));
x.remove(select);
config.put(type,x.toArray(new Object[x.size()][]));
this.format();
}
public void rename(String oldname,String newname){
loadfile = new LoadConfigFile();
lr = new LoadRule(loadfile.getConfigPath());
config = lr.getConfig();
config.put(newname,config.remove(oldname));
this.format();
}
public void deleteRules(String Rules){
loadfile = new LoadConfigFile();
lr = new LoadRule(loadfile.getConfigPath());
config = lr.getConfig();
config.remove(Rules);
this.format();
}
public String newRules(){
int i = 0;
loadfile = new LoadConfigFile();
lr = new LoadRule(loadfile.getConfigPath());
config = lr.getConfig();
String name = "New ";
Object[][] data = new Object[][]{{false, "New Name", "(New Regex)", "gray", "any", "nfa"}};
while (config.containsKey(name+i)){
i++;
}
config.put(name+i,data);
this.format();
return name+i;
}
}

View File

@@ -1,9 +1,9 @@
package burp.yaml; package burp.yaml.template;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
/* /**
* @author LinChen * @author LinChen
*/ */
@@ -14,6 +14,7 @@ public class Rule {
private String Color; private String Color;
private String Engine; private String Engine;
private String Scope; private String Scope;
private Boolean Sensitive;
public Boolean getLoaded() { public Boolean getLoaded() {
return Loaded; return Loaded;
@@ -38,6 +39,9 @@ public class Rule {
return Scope; return Scope;
} }
public Boolean getSensitive(){
return Sensitive = Sensitive;
}
public void setLoaded(Boolean loaded) { public void setLoaded(Boolean loaded) {
this.Loaded = loaded; this.Loaded = loaded;
} }
@@ -62,20 +66,28 @@ public class Rule {
public void setScope(String scope) { public void setScope(String scope) {
this.Scope = scope; this.Scope = scope;
} }
public Object[] getRuleObject(){ public void setSensitive(Boolean sensitive){
return new Object[]{Loaded, Name, Regex, Color, Scope, Engine}; this.Sensitive = sensitive;
} }
public Map<String,Object> getRuleObjMap(){
public Object[] getRuleObject() {
return new Object[] { Loaded, Name, Regex, Color, Scope, Engine,Sensitive };
}
public Map<String, Object> getRuleObjMap(){
Map<String,Object> r = new HashMap<>(); Map<String,Object> r = new HashMap<>();
r.put("Loaded",Loaded); r.put("Loaded", Loaded);
r.put("Name",Name); r.put("Name", Name);
r.put("Regex",Regex); r.put("Regex", Regex);
r.put("Color",Color); r.put("Color", Color);
r.put("Scope",Scope); r.put("Scope", Scope);
r.put("Engine",Engine); r.put("Engine", Engine);
r.put("Sensitive", Sensitive);
return r; return r;
} }
public String toString(){
return "{ \nLoaded: "+Loaded+"\nName: "+Name+"\nRegex: "+Regex+"\nColor: "+Color+"\nScope: "+Scope+"\nEngine: "+Engine+"\n}"; @Override
public String toString() {
return "{ \nLoaded: " + Loaded + "\nName: " + Name + "\nRegex: " + Regex + "\nColor: " + Color + "\nScope: " + Scope + "\nEngine: " + Engine + "\nSensitive: " + Sensitive + "\n }";
} }
} }

View File

@@ -1,8 +1,10 @@
package burp.yaml; package burp.yaml.template;
import burp.yaml.template.Rule;
import java.util.List; import java.util.List;
/* /**
* @author LinChen * @author LinChen
*/ */
@@ -26,9 +28,9 @@ public class Rules {
this.rule = rule; this.rule = rule;
} }
public void setRuleObj(){ public void setRuleObj(){}
} @Override
public String toString(){ public String toString(){
return "{ type: "+type+"\n config: "+ rule +"}\n"; return "{ type: "+type+"\n config: "+ rule +"}\n";
} }