burp插件编写——常用的对象构造工厂
字数 1702 2025-08-30 06:50:11
Burp插件开发:常用对象构造工厂详解
前言
本文是Burp Suite插件开发系列教程的第三篇,重点介绍Burp插件开发中常用的对象构造工厂。这些工厂类能帮助我们更高效地开发Burp插件,特别是实现右键菜单等常见功能。主要内容包括:
IContextMenuFactory:上下文菜单工厂IMessageEditorTabFactory:消息编辑器标签工厂IIntruderPayloadGeneratorFactory:Intruder负载生成器工厂
IContextMenuFactory 上下文菜单工厂
核心作用
IContextMenuFactory 是Burp Suite扩展开发中的核心接口,用于为Burp的上下文菜单添加自定义功能项:
- 上下文菜单扩展机制:可以在Burp任意位置(如Proxy历史、Repeater请求区等)的右键菜单中添加自定义菜单项
- 动态菜单生成:根据当前上下文动态生成菜单项列表
- 上下文感知:获取触发菜单时的上下文信息
关键方法
必须实现 createMenuItems(IContextMenuInvocation invocation) 方法,该方法返回一个JMenuItem列表。
上下文信息获取
通过IContextMenuInvocation参数可获取:
invocation.getInvocationContext() // 获取触发位置(如代理历史、目标站点树等)
invocation.getSelectedMessages() // 获取选中的HTTP消息
invocation.getSelectionBounds() // 获取用户选中的文本范围
应用场景
- 对选中的请求/响应进行自定义处理(如加解密)
- 快速发送请求到其他工具模块
- 标记或注释特定请求
- 集成外部系统操作入口
实现示例
package burp;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
public class CustomContextMenu implements IContextMenuFactory {
private final IBurpExtenderCallbacks callbacks;
private final IExtensionHelpers helpers;
private PrintWriter stdout;
private PrintWriter stderr;
public CustomContextMenu(IBurpExtenderCallbacks callbacks) {
this.callbacks = callbacks;
this.helpers = callbacks.getHelpers();
this.stdout = new PrintWriter(callbacks.getStdout(), true);
this.stderr = new PrintWriter(callbacks.getStderr(), true);
}
@Override
public List<JMenuItem> createMenuItems(IContextMenuInvocation invocation) {
List<JMenuItem> menuItems = new ArrayList<>();
// 1. 创建基础菜单项
JMenuItem baseItem = new JMenuItem("自定义处理");
baseItem.addActionListener(new ContextMenuActionListener(invocation));
// 2. 创建带图标的子菜单
JMenu subMenu = new JMenu("高级功能");
// subMenu.setIcon(new ImageIcon(getClass().getResource("/icon.png")));
// 2.1 子菜单项-请求处理
JMenuItem requestItem = new JMenuItem("处理请求");
requestItem.addActionListener(e -> handleRequest(invocation));
subMenu.add(requestItem);
// 2.2 子菜单项-响应处理
JMenuItem responseItem = new JMenuItem("处理响应");
responseItem.addActionListener(e -> handleResponse(invocation));
subMenu.add(responseItem);
menuItems.add(baseItem);
menuItems.add(subMenu);
return menuItems;
}
public class ContextMenuActionListener implements ActionListener {
IContextMenuInvocation invocation;
public ContextMenuActionListener(IContextMenuInvocation invocation) {
this.invocation = invocation;
}
@Override
public void actionPerformed(ActionEvent e) {
// 处理选中的消息
stdout.println("CustomContextMenu actionPerformed");
IHttpRequestResponse[] messages = invocation.getSelectedMessages();
if (messages != null) {
stdout.println("CustomContextMenu actionPerformed1111");
for (IHttpRequestResponse message : messages) {
stdout.println("CustomContextMenu actionPerformed222");
processMessage(message);
}
}
}
}
private void processMessage(IHttpRequestResponse message) {
stdout.println("CustomContextMenu actionPerformed333");
byte[] request = message.getRequest();
stdout.println("Modified Request: " + new String(request));
List<String> headers = helpers.analyzeRequest(request).getHeaders();
// 遍历请求头,查找并修改Cookie
for (int j = 0; j < headers.size(); j++) {
if (headers.get(j).startsWith("Cookie:")) {
headers.set(j, "Cookie: new_cookie_value=123456");
break;
}
}
int bodyOffset = helpers.analyzeRequest(request).getBodyOffset();
byte[] body = new byte[request.length - bodyOffset];
System.arraycopy(request, bodyOffset, body, 0, body.length);
byte[] modifiedRequest = helpers.buildHttpMessage(headers, body);
message.setRequest(modifiedRequest);
}
private void handleRequest(IContextMenuInvocation invocation) {
// 处理请求的具体逻辑
}
private void handleResponse(IContextMenuInvocation invocation) {
// 处理响应的具体逻辑
}
}
使用说明
- 创建自定义菜单类实现
IContextMenuFactory接口 - 在
createMenuItems方法中构建菜单项 - 为每个菜单项添加
ActionListener处理点击事件 - 通过
IContextMenuInvocation获取上下文信息 - 使用
IExtensionHelpers辅助处理HTTP消息
IMessageEditorTabFactory 消息编辑器标签工厂
(注:原文未提供这部分内容的具体实现,以下是补充内容)
核心作用
IMessageEditorTabFactory允许开发者为Burp的消息编辑器添加自定义标签页,用于显示或编辑特定格式的消息内容。
关键方法
createNewInstance(IMessageEditorController controller, boolean editable):创建新的标签页实例getTabCaption():返回标签页的显示名称isEnabled(byte[] content, boolean isRequest):确定是否对当前内容启用该标签页
应用场景
- 显示自定义格式的消息内容(如JSON、XML美化)
- 添加特定协议的解析器
- 实现消息的加解密查看/编辑
IIntruderPayloadGeneratorFactory Intruder负载生成器工厂
(注:原文未提供这部分内容的具体实现,以下是补充内容)
核心作用
IIntruderPayloadGeneratorFactory用于创建自定义的Intruder负载生成器,可以动态生成攻击负载。
关键方法
createNewInstance(IIntruderAttack attack):创建新的负载生成器实例getGeneratorName():返回生成器的名称
应用场景
- 生成特定模式的攻击负载
- 实现字典攻击的变体
- 创建基于上下文的动态负载
注册工厂类
在Burp插件的主类中,需要注册这些工厂类:
public class BurpExtender implements IBurpExtender {
@Override
public void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks) {
// 注册上下文菜单工厂
callbacks.registerContextMenuFactory(new CustomContextMenu(callbacks));
// 注册消息编辑器标签工厂
// callbacks.registerMessageEditorTabFactory(new CustomMessageEditorTabFactory());
// 注册Intruder负载生成器工厂
// callbacks.registerIntruderPayloadGeneratorFactory(new CustomPayloadGeneratorFactory());
}
}
总结
本文详细介绍了Burp插件开发中常用的三种对象构造工厂:
IContextMenuFactory:用于扩展Burp的右键菜单功能IMessageEditorTabFactory:用于添加自定义消息编辑器标签页IIntruderPayloadGeneratorFactory:用于创建自定义Intruder负载生成器
掌握这些工厂类的使用,可以大大增强Burp插件的功能和灵活性。开发者可以根据实际需求,选择适当的工厂类来实现特定功能。