首页 > 其他分享 >Burp Suite 插件开发之UI界面——以Button举例

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

时间:2023-10-18 16:34:19浏览次数:40  
标签:插件 界面 Button callbacks UI 组件 public

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的全局变量里;
    • ...

标签:插件,界面,Button,callbacks,UI,组件,public
From: https://www.cnblogs.com/mysticbinary/p/17770310.html

相关文章

  • 时间插件
    在/static/plugins下引入bootstrap-datetimepicker不使用modelform组件添加时间插件修改layout.html模板{%loadstatic%}<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title>&l......
  • mysql 运行没错,在mybatis中报错 druid 报错 syntax error, expect RPAREN, actual
    您遇到的问题可能是由于Druid版本较旧导致的。在Druid 1.0.19中,对于某些语法结构的处理存在一些限制和问题。针对您的具体情况,可以尝试以下解决方案:1. 确保SQL语句的括号匹配正确。错误消息"expect RPAREN, actual IDENTIFIER DAY"表明Druid期望一个右括号(RPAREN),但实际上......
  • 【python】Python tkinter库实现重量单位转换器的GUI程序
    前言这段代码是一个简单的重量单位转换器的GUI程序,使用了Python的tkinter库来创建图形界面。该程序可以将输入的重量从千克转换为克、磅和盎司,并通过三个文本框分别显示转换后的结果。学到什么?使用tkinter库创建一个GUI窗口。tkinter是Python标准库中的一个模块,用于......
  • OpenHarmony应用全局的UI状态存储:AppStorage
     AppStorage是应用全局的UI状态存储,是和应用的进程绑定的,由UI框架在应用程序启动时创建,为应用程序UI状态属性提供中央存储。和AppStorage不同的是,LocalStorage是页面级的,通常应用于页面内的数据共享。而AppStorage是应用级的全局状态共享,还相当于整个应用的“中枢”,持久化数......
  • 新手教程系列:群晖QuickConnect:最简单的群晖外网访问NAS工具
    通过群晖Synology免费提供的QuickConnect服务,您可在外部网络轻松连接到群晖SynologyNAS,而无需设置端口转发规则或其它复杂的网络设置。QuickConnect可让您通过一个简单的可自定义地址(如 quickconnect.to/example)进行连接。这是一个简单易用,快捷部署的外网访问方式,适合群晖......
  • Program does not contain a static 'Main' method suitable for an entry point
    http://www.kangry.net/blog/?article_id=391&type=article修改办法,对着项目右键-》属性-》application-》outputtype设为ClassLibrary即可。  ......
  • FPGA, arduino, STM32, RaspBerry 树莓派 简介
    https://www.cnblogs.com/zhenghb31/p/15046496.html 市面上控制器这么多,似乎每一个都很厉害…为什么有的控制器编写起来那么难,功能很少,有的简单易学,功能强大呢?各种控制器又有什么区别呢?经过我的思考,我个人把控制器分为三类!第一类:基于逻辑电路的控制器(FPGA)FPGA(FieldPr......
  • element ui中table动态列切换时,表格样式变形或错乱
    现象:多个tab下切换显示不用的表格数据,且表头是动态渲染的,当操作栏浮动时, 表格显示的位置不对代码示例:<template> <el-table:data="data":key="toggleIndex":row-class-name="rowClassName":cell-class-name="cellClassName":header-cell-style......
  • [pytorch] 训练时冻结一部分模型的参数 —— module.requires_grad_(False)
    prologuetitle:[pytorch]训练时冻结一部分模型的参数——module.requires_grad_(False)代码用到一个解码器\(dec\),希望用它预测生成结果\(g\)的countingencode并用以计算损失,以此约束生成器生成合理的结果(能解码出正确的countingencode)但考虑到\(g\)并不准确,如果不冻结\(......
  • 在Android Studio上使用flutter Intl插件快速实现国际化和多国语言
    Flutter实现国际化和多语言支持在Flutter中实现国际化和多语言支持通常涉及以下步骤:添加依赖库:首先,你需要添加flutter_localizations依赖库到你的pubspec.yaml文件中。这个库包含了Flutter国际化所需的核心功能。dependencies:flutter:sdk:flutterflutter_localiza......