Burp Suite插件开发 更新UI组件

发布时间 2023-11-06 11:04:11作者: Mysticbinary

Issue note

操作Swing GUI 组件时,遇到一个问题,比如在前端设置了一个表格,表格里面的数据是后台动态生成的,发现却更新不了。

我尝试猜测问题的原因:

  • 我把表格嵌套在一个面板B,面板B又嵌套在面板A,所以需要刷新面板A才行,也不全对;
  • 线程问题,需要在一个特定的UI子线程才能更新,也不全对;
  • 后来发现是操作的对象引用不对导致,下面是解决方案;

Solve It

核心原则就是:

  • 需要操作正确的引用对象

步骤:

  • 在创建组件放入主面板的时候,把这个创建组件的类变量也存入一个全局变量;
  • 后台在使用的时候,就去全局变量里面取;
  • 最好开启UI子线程比较安全;

Code 示例

//前端

//B类
public Dashboard() {
  //...
}

//后台
定义全局变量存储组件对象的引用

public static Dashboard dashboard;

比如说表格在B类里,而B类嵌套在A类里,必须要在在A类里 创建B类的时候,把这个创建的B类存储进全局变量里,必须是这个指向才有用

// A类
Dashboard dashboard = new Dashboard();
GlobalConfig.dashboard = dashboard;

后台开启一个UI线程也是一个安全的操作

//...

SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        System.out.println("dash 111");
        // 更新 Dashboard UI - table
        // 创建匿名类实现回调接口
        IDashboard callback = new IDashboard() {
            @Override
            public void updateTable(List<DashboardTable> dt) {
                System.out.println("execute Dashboard callback!");
                dt.add(new DashboardTable(33, "333"));
                dt.add(new DashboardTable(44, "444"));
            }
        };

        // 执行包含回调函数的操作
        Dashboard dashboard = GlobalConfig.dashboard;   //必须是从全局存储这里拿出来的类对象
        dashboard.perpormCallback2(callback);
        GlobalConfig.mainUI.reprint();

        System.out.println("dash 222");
    }
});