Guide
不管是什么软件,大多是需要UI界面的。Burp Suite的插件开发也不例外,某些场景下也需要配合UI界面才能更好操作插件的功能。
UI界面的开发,无法是学习各种组件的使用方法,根据它们的使用特点去编写特定的事件函数。
由于组件都是前人都写好的,我们只管拿过来使用即可,主要是熟悉组件的使用和去了解组件相关的事件函数即可。
在UI界面中常见、常使用的组件无非是按钮、输入框、单选框、多选框、文本框、弹出框、切换栏...,
组件有很多种,但是不要怕,我们去繁归简,以一个最简单的按钮框进行举例,其实只要学会一个组件的使用,那么其它组件的使用都是类似的了。正所谓:Botton在手,以一驭万。
当然,如果涉及到自定义组件,组件的二次开发,那么这部分的内容会复杂一点,本文不涉及这部分内容。
Button界面的搭建、编写事件事件
先介绍一下我的技术栈:
- Java
- Burp suite APIs
- IDEA
- Maven
(不同技术栈,可能步骤和导入的东西不同)
步骤:
-
使用Maven导入UI库文件:
<dependency> <groupId>com.intellij</groupId> <artifactId>forms_rt</artifactId> <version>7.0.3</version> </dependency>
-
创建UI界面平台
-
通过拖拽完成UI的设计
把你想要的组件,从右边的组件库拖到Jpanel面板里,通过放置不同的组件和不同的摆放位置,来形成你的UI界面效果。
组件之间也有树状的关系,比如JButton组件放置在JPanel组件下,那么他们就类似一个父子关系。
同时,和该UI界面对应的类也会自动去声明这些组件类的标识; -
Build Project —— 自动生成组件初始化代码
设置一下自动生成代码的方式,这一步不是必须的,只是个人喜好。
记住,只要你摆好你的UI之后,都要点一下Build Project按钮,
点这个按钮的作用就是让框架自动生成一下UI代码:
这些自动生成的代码不用修改它,如果修改了,在重新点一下Build Project按钮就会重新生成覆盖了。这些自动生成的代码,代码大概意思是说,UI面板里都用了什么组件,都放在什么位置等组件初始化信息。 -
编写你的事件函数
这个可以通过右键生成组件的事件函数模版,有时刚创建项目的时候不弹窗让人选择(应该是个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!"); } }); }
-
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$$$(); } }
-
运行、调试
OK!
解决通信问题
两个经典的双向传输问题:
-
Brup的数据怎么传递给UI组件?
在创建RoomUI类的时候,将Burp数据通过构造器的方式插入即可,roomUI = new RoomUI(messages);
当然还有很多方式可以实现,不一一举例了。 -
UI组件的数据怎么传递给Brup?
有几种思路:- 先保存到本地配置文件里,然后去配置文件里面取;
- 通过get/set之类的方法传递出去;
- 保存到Public的全局变量里;
- ...