├── .gitignore
├── README.md
├── imgs
├── 2021-04-01-44536.png
└── image-20210401145354476.png
├── pom.xml
└── src
└── main
└── java
└── burp
├── BurpExtender.java
├── Config.java
├── ConfigDlg.java
├── Menu.java
└── Transfer.java
/.gitignore:
--------------------------------------------------------------------------------
1 | # Compiled class file
2 | *.class
3 |
4 | # Log file
5 | *.log
6 |
7 | # BlueJ files
8 | *.ctxt
9 |
10 | # Mobile Tools for Java (J2ME)
11 | .mtj.tmp/
12 |
13 | # Package Files #
14 | *.jar
15 | *.war
16 | *.nar
17 | *.ear
18 | *.zip
19 | *.tar.gz
20 | *.rar
21 |
22 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
23 | hs_err_pid*
24 |
25 | /target/
26 | /.idea/
27 |
28 | /*.iml
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | ## burpsuite POST数据包base64编码插件
2 |
3 | **适用场景:**
4 |
5 | 使用burp作为代理,经过burp的数据包会自动进行base64编码(仅限POST包)。
6 |
7 | **使用方法:**
8 |
9 | 使用mavn进行编译后加载到burp的Extensions中使用,或者直接在右侧Release中下载编译好的jar包加载使用。
10 |
11 | 编译方法
12 |
13 | ```txt
14 | mvn package
15 | ```
16 |
17 | **插件截图**
18 |
19 | 
20 |
21 | 
22 |
23 |
24 |
25 | **后期计划:**
26 |
27 | - 增加更多编码功能,例如URL编码,unicode编码等。
28 |
29 | - 增加加密功能:例如md5,AES等。
30 |
31 | ## 感谢
32 |
33 | 本插件的思路和外观借用了[chunked-coding-converter](https://github.com/c0ny1/chunked-coding-converter)插件,这是一款很优秀的插件,向它的作者c0ny1学习。
34 |
--------------------------------------------------------------------------------
/imgs/2021-04-01-44536.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/handbye/base64encode/525b059eca6cb018addc6ee153cf46190debc50b/imgs/2021-04-01-44536.png
--------------------------------------------------------------------------------
/imgs/image-20210401145354476.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/handbye/base64encode/525b059eca6cb018addc6ee153cf46190debc50b/imgs/image-20210401145354476.png
--------------------------------------------------------------------------------
/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
5 | 4.0.0
6 |
7 | cn.darkless
8 | base64encode
9 | 1.0
10 |
11 | base64encode
12 |
13 | http://www.example.com
14 |
15 |
16 | UTF-8
17 | 1.7
18 | 1.7
19 |
20 |
21 |
22 |
23 |
24 | net.portswigger.burp.extender
25 | burp-extender-api
26 | 2.1
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 | maven-clean-plugin
36 | 3.1.0
37 |
38 |
39 |
40 | maven-resources-plugin
41 | 3.0.2
42 |
43 |
44 | maven-compiler-plugin
45 | 3.8.0
46 |
47 |
48 | maven-surefire-plugin
49 | 2.22.1
50 |
51 |
52 | maven-jar-plugin
53 | 3.0.2
54 |
55 |
56 |
57 | burp.BurpExtender>
58 |
59 |
60 |
61 |
62 |
63 | maven-install-plugin
64 | 2.5.2
65 |
66 |
67 | maven-deploy-plugin
68 | 2.8.2
69 |
70 |
71 |
72 | maven-site-plugin
73 | 3.7.1
74 |
75 |
76 | maven-project-info-reports-plugin
77 | 3.0.0
78 |
79 |
80 |
81 |
82 |
83 |
--------------------------------------------------------------------------------
/src/main/java/burp/BurpExtender.java:
--------------------------------------------------------------------------------
1 | package burp;
2 |
3 | import java.io.PrintWriter;
4 |
5 | public class BurpExtender implements IBurpExtender, IHttpListener, IProxyListener {
6 | public static IBurpExtenderCallbacks callbacks;
7 | public static IExtensionHelpers helpers;
8 | private String extensionName = "base64Encoding";
9 | private String version ="1.0";
10 | public static PrintWriter stdout;
11 | public static PrintWriter stderr;
12 |
13 | @Override
14 | public void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks) {
15 | this.callbacks = callbacks;
16 | this.helpers = callbacks.getHelpers();
17 | callbacks.setExtensionName(String.format("%s %s",extensionName,version));
18 | callbacks.registerContextMenuFactory(new Menu());
19 | callbacks.registerHttpListener(this);
20 | callbacks.registerProxyListener(this);
21 | stdout = new PrintWriter(callbacks.getStdout(),true);
22 | stderr = new PrintWriter(callbacks.getStderr(),true);
23 | stdout.println(getBanner());
24 | }
25 |
26 |
27 | @Override
28 | public void processHttpMessage(int toolFlag, boolean messageIsRequest, IHttpRequestResponse messageInfo) {
29 | // 处理除代理套件之外的套件流量
30 | if(messageIsRequest && isValidTool(toolFlag) && (toolFlag != IBurpExtenderCallbacks.TOOL_PROXY)){
31 | IRequestInfo reqInfo = helpers.analyzeRequest(messageInfo.getRequest());
32 |
33 | if(reqInfo.getMethod().equals("POST")){
34 | try {
35 | byte[] request = Transfer.encoding(messageInfo);
36 | if (request != null) {
37 | messageInfo.setRequest(request);
38 | }
39 | } catch (Exception e) {
40 | e.printStackTrace(stderr);
41 | }
42 | }
43 | }
44 | }
45 |
46 |
47 | @Override
48 | public void processProxyMessage(final boolean messageIsRequest, final IInterceptedProxyMessage proxyMessage) {
49 | // 处理代理套件流量
50 | if(messageIsRequest && isValidTool(IBurpExtenderCallbacks.TOOL_PROXY)){
51 | IHttpRequestResponse messageInfo = proxyMessage.getMessageInfo();
52 | IRequestInfo reqInfo = helpers.analyzeRequest(messageInfo.getRequest());
53 |
54 | if(reqInfo.getMethod().equals("POST")){
55 | try {
56 | byte[] request = Transfer.encoding(messageInfo);
57 | if (request != null) {
58 | messageInfo.setRequest(request);
59 | }
60 | } catch (Exception e) {
61 | e.printStackTrace(stderr);
62 | }
63 | }
64 | }
65 | }
66 |
67 | /**
68 | * 插件是否作用于该套件
69 | * @param toolFlag
70 | * @return
71 | */
72 | private boolean isValidTool(int toolFlag){
73 | return (Config.isAct_on_all_tools() ||
74 | (Config.isAct_on_proxy() && toolFlag== IBurpExtenderCallbacks.TOOL_PROXY) ||
75 | (Config.isAct_on_intruder() && toolFlag== IBurpExtenderCallbacks.TOOL_INTRUDER) ||
76 | (Config.isAct_on_repeater() && toolFlag== IBurpExtenderCallbacks.TOOL_REPEATER) ||
77 | (Config.isAct_on_scanner() && toolFlag== IBurpExtenderCallbacks.TOOL_SCANNER) ||
78 | (Config.isAct_on_sequencer() && toolFlag== IBurpExtenderCallbacks.TOOL_SEQUENCER) ||
79 | (Config.isAct_on_spider() && toolFlag== IBurpExtenderCallbacks.TOOL_SPIDER) ||
80 | (Config.isAct_on_extender() && toolFlag== IBurpExtenderCallbacks.TOOL_EXTENDER) ||
81 | (Config.isAct_on_target() && toolFlag== IBurpExtenderCallbacks.TOOL_TARGET));
82 | }
83 |
84 |
85 | /**
86 | * 插件Banner信息
87 | * @return
88 | */
89 | public String getBanner(){
90 | String bannerInfo =
91 | "[+]\n"
92 | + "[+] ##############################################\n"
93 | + "[+] " + extensionName + " v" + version +"\n"
94 | + "[+] anthor: darkless"
95 | + "[+] blog: https://darkless.cn\n"
96 | + "[+] ##############################################";
97 | return bannerInfo;
98 | }
99 | }
--------------------------------------------------------------------------------
/src/main/java/burp/Config.java:
--------------------------------------------------------------------------------
1 | package burp;
2 |
3 | /**
4 | * 配置对象类,负责对配置项进行设置与获取
5 | */
6 | public class Config {
7 | private static boolean act_on_all_tools = false;
8 | private static boolean act_on_target = false;
9 | private static boolean act_on_proxy = false;
10 | private static boolean act_on_spider = false;
11 | private static boolean act_on_intruder = false;
12 | private static boolean act_on_repeater = false;
13 | private static boolean act_on_scanner = false;
14 | private static boolean act_on_extender = false;
15 | private static boolean act_on_sequencer = false;
16 |
17 |
18 | public static boolean isAct_on_all_tools() {
19 | String val = BurpExtender.callbacks.loadExtensionSetting("act_on_all_tools");
20 | if(val == null) return Config.act_on_all_tools;
21 | try {
22 | return Boolean.valueOf(val);
23 | }catch(Exception e){
24 | return Config.act_on_all_tools;
25 | }
26 | }
27 |
28 | public static void setAct_on_all_tools(boolean act_on_all_tools) {
29 | BurpExtender.callbacks.saveExtensionSetting("act_on_all_tools", String.valueOf(act_on_all_tools));
30 | Config.act_on_all_tools = act_on_all_tools;
31 | }
32 |
33 | public static boolean isAct_on_target() {
34 | String val = BurpExtender.callbacks.loadExtensionSetting("act_on_target");
35 | if(val == null) return Config.act_on_target;
36 | try {
37 | return Boolean.valueOf(val);
38 | }catch(Exception e){
39 | return Config.act_on_target;
40 | }
41 | }
42 |
43 | public static void setAct_on_target(boolean act_on_target) {
44 | BurpExtender.callbacks.saveExtensionSetting("act_on_target", String.valueOf(act_on_target));
45 | Config.act_on_target = act_on_target;
46 | }
47 |
48 | public static boolean isAct_on_proxy() {
49 | String val = BurpExtender.callbacks.loadExtensionSetting("act_on_proxy");
50 | if(val == null) return Config.act_on_proxy;
51 | try {
52 | return Boolean.valueOf(val);
53 | }catch(Exception e){
54 | return Config.act_on_proxy;
55 | }
56 | }
57 |
58 | public static void setAct_on_proxy(boolean act_on_proxy) {
59 | BurpExtender.callbacks.saveExtensionSetting("act_on_proxy", String.valueOf(act_on_proxy));
60 | Config.act_on_proxy = act_on_proxy;
61 | }
62 |
63 | public static boolean isAct_on_spider() {
64 | String val = BurpExtender.callbacks.loadExtensionSetting("act_on_spider");
65 | if(val == null) return Config.act_on_spider;
66 | try {
67 | return Boolean.valueOf(val);
68 | }catch(Exception e){
69 | return Config.act_on_spider;
70 | }
71 | }
72 |
73 | public static void setAct_on_spider(boolean act_on_spider) {
74 | BurpExtender.callbacks.saveExtensionSetting("act_on_spider", String.valueOf(act_on_spider));
75 | Config.act_on_spider = act_on_spider;
76 | }
77 |
78 | public static boolean isAct_on_intruder() {
79 | String val = BurpExtender.callbacks.loadExtensionSetting("act_on_intruder");
80 | if(val == null) return Config.act_on_intruder;
81 | try {
82 | return Boolean.valueOf(val);
83 | }catch(Exception e){
84 | return Config.act_on_intruder;
85 | }
86 | }
87 |
88 | public static void setAct_on_intruder(boolean act_on_intruder) {
89 | BurpExtender.callbacks.saveExtensionSetting("act_on_intruder", String.valueOf(act_on_intruder));
90 | Config.act_on_intruder = act_on_intruder;
91 | }
92 |
93 | public static boolean isAct_on_repeater() {
94 | String val = BurpExtender.callbacks.loadExtensionSetting("act_on_repeater");
95 | if(val == null) return Config.act_on_repeater;
96 | try {
97 | return Boolean.valueOf(val);
98 | }catch(Exception e){
99 | return Config.act_on_repeater;
100 | }
101 | }
102 |
103 | public static void setAct_on_repeater(boolean act_on_repeater) {
104 | BurpExtender.callbacks.saveExtensionSetting("act_on_repeater", String.valueOf(act_on_repeater));
105 | Config.act_on_repeater = act_on_repeater;
106 | }
107 |
108 | public static boolean isAct_on_scanner() {
109 | String val = BurpExtender.callbacks.loadExtensionSetting("act_on_scanner");
110 | if(val == null) return Config.act_on_scanner;
111 | try {
112 | return Boolean.valueOf(val);
113 | }catch(Exception e){
114 | return Config.act_on_scanner;
115 | }
116 | }
117 |
118 | public static void setAct_on_scanner(boolean act_on_scanner) {
119 | BurpExtender.callbacks.saveExtensionSetting("act_on_scanner", String.valueOf(act_on_scanner));
120 | Config.act_on_scanner = act_on_scanner;
121 | }
122 |
123 | public static boolean isAct_on_extender() {
124 | String val = BurpExtender.callbacks.loadExtensionSetting("act_on_extender");
125 | if(val == null) return Config.act_on_extender;
126 | try {
127 | return Boolean.valueOf(val);
128 | }catch(Exception e){
129 | return Config.act_on_extender;
130 | }
131 | }
132 |
133 | public static void setAct_on_extender(boolean act_on_extender) {
134 | BurpExtender.callbacks.saveExtensionSetting("act_on_extender", String.valueOf(act_on_extender));
135 | Config.act_on_extender = act_on_extender;
136 | }
137 |
138 | public static boolean isAct_on_sequencer() {
139 | String val = BurpExtender.callbacks.loadExtensionSetting("act_on_sequencer");
140 | if(val == null) return Config.act_on_sequencer;
141 | try {
142 | return Boolean.valueOf(val);
143 | }catch(Exception e){
144 | return Config.act_on_sequencer;
145 | }
146 | }
147 |
148 | public static void setAct_on_sequencer(boolean act_on_sequencer) {
149 | BurpExtender.callbacks.saveExtensionSetting("act_on_sequencer", String.valueOf(act_on_sequencer));
150 | Config.act_on_sequencer = act_on_sequencer;
151 | }
152 | }
--------------------------------------------------------------------------------
/src/main/java/burp/ConfigDlg.java:
--------------------------------------------------------------------------------
1 | package burp;
2 |
3 | import javax.swing.*;
4 | import java.awt.*;
5 | import java.awt.event.ActionEvent;
6 | import java.awt.event.ActionListener;
7 |
8 | /**
9 | * 配置窗口类,负责显示配置窗口,处理窗口消息
10 | */
11 | public class ConfigDlg extends JDialog {
12 | private final JPanel mainPanel = new JPanel();
13 | private final JPanel topPanel = new JPanel();
14 | private final JPanel centerPanel = new JPanel();
15 | private final JPanel bottomPanel = new JPanel();;
16 | private final JLabel lbActOnModel = new JLabel("Act on:");
17 | private final JCheckBox chkAllTools = new JCheckBox("All Tools");
18 | private final JCheckBox chkSpider = new JCheckBox("Spider");
19 | private final JCheckBox chkIntruder = new JCheckBox("Intruder");
20 | private final JCheckBox chkScanner = new JCheckBox("Scanner");
21 | private final JCheckBox chkRepeater = new JCheckBox("Repeater");
22 | private final JCheckBox chkSequencer = new JCheckBox("Sequencer");
23 | private final JCheckBox chkProxy = new JCheckBox("Proxy");
24 | private final JCheckBox chkExtender = new JCheckBox("Extender");
25 | private final JCheckBox chkTarget = new JCheckBox("Target");
26 | private final JButton btSave = new JButton("Save");
27 | private final JButton btCancel = new JButton("Cancel");
28 |
29 |
30 | public ConfigDlg(){
31 | initGUI();
32 | initEvent();
33 | initValue();
34 | this.setTitle("encoding config");
35 | }
36 |
37 |
38 | /**
39 | * 初始化UI
40 | */
41 | private void initGUI(){
42 | topPanel.setLayout(new FlowLayout(FlowLayout.LEFT));
43 | centerPanel.setLayout(new FlowLayout(FlowLayout.LEFT));
44 | centerPanel.add(lbActOnModel);
45 | centerPanel.add(chkAllTools);
46 | centerPanel.add(chkTarget);
47 | centerPanel.add(chkProxy);
48 | centerPanel.add(chkSpider);
49 | centerPanel.add(chkIntruder);
50 | centerPanel.add(chkRepeater);
51 | centerPanel.add(chkScanner);
52 | centerPanel.add(chkSequencer);
53 | centerPanel.add(chkExtender);
54 |
55 | bottomPanel.setLayout(new FlowLayout(FlowLayout.CENTER));
56 | bottomPanel.add(btSave);
57 | bottomPanel.add(btCancel);
58 |
59 | mainPanel.setLayout(new BorderLayout());
60 | mainPanel.add(topPanel,BorderLayout.NORTH);
61 | mainPanel.add(centerPanel,BorderLayout.CENTER);
62 | mainPanel.add(bottomPanel,BorderLayout.SOUTH);
63 |
64 | this.setModal(true);
65 | this.setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
66 | this.add(mainPanel);
67 | //使配置窗口自动适应控件大小,防止部分控件无法显示
68 | this.pack();
69 | //居中显示配置窗口
70 | Dimension screensize=Toolkit.getDefaultToolkit().getScreenSize();
71 | this.setBounds(screensize.width/2-this.getWidth()/2,screensize.height/2-this.getHeight()/2,this.getWidth(),this.getHeight());
72 | }
73 |
74 |
75 | /**
76 | * 初始化事件
77 | */
78 | private void initEvent(){
79 | chkAllTools.addActionListener(new ActionListener() {
80 | @Override
81 | public void actionPerformed(ActionEvent e) {
82 | if(chkAllTools.isSelected()){
83 | chkTarget.setSelected(true);
84 | chkProxy.setSelected(true);
85 | chkSpider.setSelected(true);
86 | chkIntruder.setSelected(true);
87 | chkRepeater.setSelected(true);
88 | chkScanner.setSelected(true);
89 | chkExtender.setSelected(true);
90 | }else{
91 | chkTarget.setSelected(false);
92 | chkProxy.setSelected(false);
93 | chkSpider.setSelected(false);
94 | chkIntruder.setSelected(false);
95 | chkRepeater.setSelected(false);
96 | chkScanner.setSelected(false);
97 | chkExtender.setSelected(false);
98 | }
99 |
100 | }
101 | });
102 |
103 | btCancel.addActionListener(new ActionListener() {
104 | @Override
105 | public void actionPerformed(ActionEvent e) {
106 | ConfigDlg.this.dispose();
107 | }
108 | });
109 |
110 | btSave.addActionListener(new ActionListener() {
111 | @Override
112 | public void actionPerformed(ActionEvent e) {
113 | Config.setAct_on_all_tools(chkAllTools.isSelected());
114 | Config.setAct_on_target(chkTarget.isSelected());
115 | Config.setAct_on_proxy(chkProxy.isSelected());
116 | Config.setAct_on_spider(chkSpider.isSelected());
117 | Config.setAct_on_intruder(chkIntruder.isSelected());
118 | Config.setAct_on_repeater(chkRepeater.isSelected());
119 | Config.setAct_on_scanner(chkScanner.isSelected());
120 | Config.setAct_on_sequencer(chkSequencer.isSelected());
121 | Config.setAct_on_extender(chkExtender.isSelected());
122 | ConfigDlg.this.dispose();
123 | }
124 | });
125 | }
126 |
127 |
128 | /**
129 | * 为控件赋值
130 | */
131 | public void initValue(){
132 | chkAllTools.setSelected(Config.isAct_on_all_tools());
133 | chkTarget.setSelected(Config.isAct_on_target());
134 | chkProxy.setSelected(Config.isAct_on_proxy());
135 | chkSpider.setSelected(Config.isAct_on_spider());
136 | chkIntruder.setSelected(Config.isAct_on_intruder());
137 | chkRepeater.setSelected(Config.isAct_on_repeater());
138 | chkScanner.setSelected(Config.isAct_on_scanner());
139 | chkSequencer.setSelected(Config.isAct_on_sequencer());
140 | chkExtender.setSelected(Config.isAct_on_extender());
141 | }
142 | }
--------------------------------------------------------------------------------
/src/main/java/burp/Menu.java:
--------------------------------------------------------------------------------
1 | package burp;
2 |
3 | import javax.swing.*;
4 | import java.awt.event.ActionEvent;
5 | import java.awt.event.ActionListener;
6 | import java.util.ArrayList;
7 | import java.util.List;
8 |
9 | /**
10 | * 菜单类,负责显示菜单,处理菜单事件
11 | */
12 | public class Menu implements IContextMenuFactory {
13 | public List createMenuItems(final IContextMenuInvocation invocation) {
14 | List menus = new ArrayList();
15 | JMenu encodeMenu = new JMenu("base64encode");
16 | JMenuItem encode = new JMenuItem("Encoding request body");
17 | JMenuItem decode = new JMenuItem("Decoding request body");
18 | JMenuItem config = new JMenuItem("Config");
19 | encodeMenu.add(encode);
20 | encodeMenu.add(decode);
21 | encodeMenu.addSeparator();
22 | encodeMenu.add(config);
23 |
24 | //若数据包无法编辑,则将编码解码菜单项设置为禁用
25 | if(invocation.getInvocationContext() != IContextMenuInvocation.CONTEXT_MESSAGE_EDITOR_REQUEST){
26 | encode.setEnabled(false);
27 | decode.setEnabled(false);
28 | }
29 |
30 | encode.addActionListener(new ActionListener(){
31 |
32 | public void actionPerformed(ActionEvent arg0) {
33 | IHttpRequestResponse iReqResp = invocation.getSelectedMessages()[0];
34 | IRequestInfo reqInfo = BurpExtender.helpers.analyzeRequest(iReqResp.getRequest());
35 | // 不对GET请求进行编码
36 | if(!reqInfo.getMethod().equals("POST")){
37 | JOptionPane.showConfirmDialog(null,"GET requests cannot be encoded!","Warning",JOptionPane.CLOSED_OPTION,JOptionPane.WARNING_MESSAGE);
38 | return;
39 | }
40 |
41 | try {
42 | byte[] request = Transfer.encoding(iReqResp);
43 | if (request != null) {
44 | iReqResp.setRequest(request);
45 | }
46 | } catch (Exception e) {
47 | BurpExtender.stderr.println(e.getMessage());
48 | }
49 | }
50 | });
51 |
52 | decode.addActionListener(new ActionListener(){
53 |
54 | public void actionPerformed(ActionEvent arg0) {
55 | IHttpRequestResponse iReqResp = invocation.getSelectedMessages()[0];
56 |
57 | try {
58 | byte[] request = Transfer.decoding(iReqResp);
59 | if (request != null) {
60 | iReqResp.setRequest(request);
61 | }
62 | } catch (Exception e) {
63 | BurpExtender.stderr.println(e.getMessage());
64 | }
65 | }
66 | });
67 |
68 | config.addActionListener(new ActionListener(){
69 |
70 | public void actionPerformed(ActionEvent arg0) {
71 | try {
72 | ConfigDlg dlg = new ConfigDlg();
73 | BurpExtender.callbacks.customizeUiComponent(dlg);
74 | dlg.setVisible(true);
75 | }catch (Exception e){
76 | e.printStackTrace(BurpExtender.stderr);
77 | }
78 | }
79 | });
80 |
81 | menus.add(encodeMenu);
82 | return menus;
83 | }
84 | }
--------------------------------------------------------------------------------
/src/main/java/burp/Transfer.java:
--------------------------------------------------------------------------------
1 | package burp;
2 |
3 | import java.io.UnsupportedEncodingException;
4 | import java.util.*;
5 |
6 | /**
7 | * 编码解码类,负责对目标请求进行编码解码
8 | */
9 | public class Transfer {
10 | /**
11 | * 对请求包进行base64编码
12 | * @return
13 | */
14 | public static byte[] encoding(IHttpRequestResponse requestResponse) throws UnsupportedEncodingException {
15 | byte[] request = requestResponse.getRequest();
16 | IRequestInfo requestInfo = BurpExtender.helpers.analyzeRequest(request);
17 | int bodyOffset = requestInfo.getBodyOffset();
18 | int body_length = request.length - bodyOffset;
19 | String body = new String(request, bodyOffset, body_length, "UTF-8");
20 | if (request.length - bodyOffset > 10000){
21 | return request;
22 | }
23 | List headers = BurpExtender.helpers.analyzeRequest(request).getHeaders();
24 | String decoding_body = BurpExtender.helpers.base64Encode(body);
25 | return BurpExtender.helpers.buildHttpMessage(headers, decoding_body.getBytes());
26 | }
27 |
28 |
29 | /**
30 | * 对编码过的请求包进行解码
31 | *
32 | * @param requestResponse 已编码过的请求响应对象
33 | * @return 解码后的请求包
34 | * @throws UnsupportedEncodingException
35 | */
36 | public static byte[] decoding(IHttpRequestResponse requestResponse) throws UnsupportedEncodingException {
37 | byte[] request = requestResponse.getRequest();
38 | IRequestInfo requestInfo = BurpExtender.helpers.analyzeRequest(request);
39 | int body_offset = requestInfo.getBodyOffset();
40 | String requestString = new String(request);
41 | String body = requestString.substring(body_offset);
42 | byte[] bodyBytes = body.getBytes();
43 | List headers = BurpExtender.helpers.analyzeRequest(request).getHeaders();
44 | //Decoding
45 | byte[] decoding_body = BurpExtender.helpers.base64Decode(bodyBytes);
46 | return BurpExtender.helpers.buildHttpMessage(headers, decoding_body);
47 | }
48 |
49 | }
--------------------------------------------------------------------------------