Burp Suite 插件开发之UI界面——以Button举例

发布时间 2023-10-18 16:32:52作者: Mysticbinary

Guide

不管是什么软件,大多是需要UI界面的。Burp Suite的插件开发也不例外,某些场景下也需要配合UI界面才能更好操作插件的功能。

UI界面的开发,无法是学习各种组件的使用方法,根据它们的使用特点去编写特定的事件函数。
由于组件都是前人都写好的,我们只管拿过来使用即可,主要是熟悉组件的使用和去了解组件相关的事件函数即可。

在UI界面中常见、常使用的组件无非是按钮、输入框、单选框、多选框、文本框、弹出框、切换栏...,
组件有很多种,但是不要怕,我们去繁归简,以一个最简单的按钮框进行举例,其实只要学会一个组件的使用,那么其它组件的使用都是类似的了。正所谓:Botton在手,以一驭万

当然,如果涉及到自定义组件,组件的二次开发,那么这部分的内容会复杂一点,本文不涉及这部分内容。

Button界面的搭建、编写事件事件

先介绍一下我的技术栈:

  • Java
  • Burp suite APIs
  • IDEA
  • Maven

(不同技术栈,可能步骤和导入的东西不同)

步骤:

  1. 使用Maven导入UI库文件:

    <dependency>
        <groupId>com.intellij</groupId>
        <artifactId>forms_rt</artifactId>
        <version>7.0.3</version>
    </dependency>
    
  2. 创建UI界面平台

  3. 通过拖拽完成UI的设计

    把你想要的组件,从右边的组件库拖到Jpanel面板里,通过放置不同的组件和不同的摆放位置,来形成你的UI界面效果。
    组件之间也有树状的关系,比如JButton组件放置在JPanel组件下,那么他们就类似一个父子关系。

    同时,和该UI界面对应的类也会自动去声明这些组件类的标识;

  4. Build Project —— 自动生成组件初始化代码
    设置一下自动生成代码的方式,这一步不是必须的,只是个人喜好。

    记住,只要你摆好你的UI之后,都要点一下Build Project按钮,

    点这个按钮的作用就是让框架自动生成一下UI代码:

    这些自动生成的代码不用修改它,如果修改了,在重新点一下Build Project按钮就会重新生成覆盖了。这些自动生成的代码,代码大概意思是说,UI面板里都用了什么组件,都放在什么位置等组件初始化信息。

  5. 编写你的事件函数

    这个可以通过右键生成组件的事件函数模版,有时刚创建项目的时候不弹窗让人选择(应该是个BUG),先不管这个问题,就一个回调模板自己写也没几行。

    public RoomUI() {
        button1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // 这里开始写你的执行流程
                System.out.println("Click the button1.");
                button1.setSize(100, 100);
                textField1.setText("I am Mysticbianry!");
            }
        });
    }
    
  6. UI界面加到Brup插件里
    主要是实现Itab接口的getTabCaption方法、getUiComponent方法。

    package burp;
    
    import java.awt.*;
    import java.io.PrintWriter;
    
    public class BurpExtender implements IBurpExtender, ITab {
        private IExtensionHelpers helpers;
        private IBurpExtenderCallbacks callbacks;
        private PrintWriter stdout;
        private PrintWriter stderr;
        private RoomUI roomUI;
    
        @Override
        public void registerExtenderCallbacks(IBurpExtenderCallbacks iBurpExtenderCallbacks) {
            this.callbacks = iBurpExtenderCallbacks;
            this.callbacks.setExtensionName("DemoBrupUI");
            //
            helpers = callbacks.getHelpers();
            this.stdout = new PrintWriter(callbacks.getStdout(), true);
            this.stderr = new PrintWriter(callbacks.getStderr(), true);
            //
            roomUI = new RoomUI();
            callbacks.addSuiteTab(this);
            stdout.println("DemoBrupUI install success.");
        }
    
        @Override
        public String getTabCaption() {
            return "DemoBrupUI";
        }
    
        @Override
        public Component getUiComponent() {
            return roomUI.$$$getRootComponent$$$();
        }
    }
    
  7. 运行、调试

    OK!

解决通信问题

两个经典的双向传输问题:

  • Brup的数据怎么传递给UI组件?
    在创建RoomUI类的时候,将Burp数据通过构造器的方式插入即可,roomUI = new RoomUI(messages);
    当然还有很多方式可以实现,不一一举例了。

  • UI组件的数据怎么传递给Brup?
    有几种思路:

    • 先保存到本地配置文件里,然后去配置文件里面取;
    • 通过get/set之类的方法传递出去;
    • 保存到Public的全局变量里;
    • ...