burp插件编写——常用的对象构造工厂
字数 1702 2025-08-30 06:50:11

Burp插件开发:常用对象构造工厂详解

前言

本文是Burp Suite插件开发系列教程的第三篇,重点介绍Burp插件开发中常用的对象构造工厂。这些工厂类能帮助我们更高效地开发Burp插件,特别是实现右键菜单等常见功能。主要内容包括:

  • IContextMenuFactory:上下文菜单工厂
  • IMessageEditorTabFactory:消息编辑器标签工厂
  • IIntruderPayloadGeneratorFactory:Intruder负载生成器工厂

IContextMenuFactory 上下文菜单工厂

核心作用

IContextMenuFactory 是Burp Suite扩展开发中的核心接口,用于为Burp的上下文菜单添加自定义功能项:

  1. 上下文菜单扩展机制:可以在Burp任意位置(如Proxy历史、Repeater请求区等)的右键菜单中添加自定义菜单项
  2. 动态菜单生成:根据当前上下文动态生成菜单项列表
  3. 上下文感知:获取触发菜单时的上下文信息

关键方法

必须实现 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) {
        // 处理响应的具体逻辑
    }
}

使用说明

  1. 创建自定义菜单类实现IContextMenuFactory接口
  2. createMenuItems方法中构建菜单项
  3. 为每个菜单项添加ActionListener处理点击事件
  4. 通过IContextMenuInvocation获取上下文信息
  5. 使用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插件开发中常用的三种对象构造工厂:

  1. IContextMenuFactory:用于扩展Burp的右键菜单功能
  2. IMessageEditorTabFactory:用于添加自定义消息编辑器标签页
  3. IIntruderPayloadGeneratorFactory:用于创建自定义Intruder负载生成器

掌握这些工厂类的使用,可以大大增强Burp插件的功能和灵活性。开发者可以根据实际需求,选择适当的工厂类来实现特定功能。

Burp插件开发:常用对象构造工厂详解 前言 本文是Burp Suite插件开发系列教程的第三篇,重点介绍Burp插件开发中常用的对象构造工厂。这些工厂类能帮助我们更高效地开发Burp插件,特别是实现右键菜单等常见功能。主要内容包括: IContextMenuFactory :上下文菜单工厂 IMessageEditorTabFactory :消息编辑器标签工厂 IIntruderPayloadGeneratorFactory :Intruder负载生成器工厂 IContextMenuFactory 上下文菜单工厂 核心作用 IContextMenuFactory 是Burp Suite扩展开发中的核心接口,用于为Burp的上下文菜单添加自定义功能项: 上下文菜单扩展机制 :可以在Burp任意位置(如Proxy历史、Repeater请求区等)的右键菜单中添加自定义菜单项 动态菜单生成 :根据当前上下文动态生成菜单项列表 上下文感知 :获取触发菜单时的上下文信息 关键方法 必须实现 createMenuItems(IContextMenuInvocation invocation) 方法,该方法返回一个 JMenuItem 列表。 上下文信息获取 通过 IContextMenuInvocation 参数可获取: 应用场景 对选中的请求/响应进行自定义处理(如加解密) 快速发送请求到其他工具模块 标记或注释特定请求 集成外部系统操作入口 实现示例 使用说明 创建自定义菜单类实现 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插件的主类中,需要注册这些工厂类: 总结 本文详细介绍了Burp插件开发中常用的三种对象构造工厂: IContextMenuFactory :用于扩展Burp的右键菜单功能 IMessageEditorTabFactory :用于添加自定义消息编辑器标签页 IIntruderPayloadGeneratorFactory :用于创建自定义Intruder负载生成器 掌握这些工厂类的使用,可以大大增强Burp插件的功能和灵活性。开发者可以根据实际需求,选择适当的工厂类来实现特定功能。