JAVA BP插件开发(一):基础插件开发

2023-05-16

本文会包括BP插件开发流程及打包,API,javaswing(UI)部分的内容。阅读完本文后,读者将初步具有开发BP插件的能力。

1 开始开发

我们使用IDEA作为开发工具(使用其他IDE也绰绰有余)。

引入依赖包:net.portswigger.burp.extender:burp-extender-api

包的版本见:

https://mvnrepository.com/artifact/net.portswigger.burp.extender/burp-extender-api

如果使用Gradle管理包,可以这样书写(build.gradle):

plugins {
    id 'java'
}

group 'burp'
version '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'net.portswigger.burp.extender:burp-extender-api:1.7.13' //重点部分
}

test {
    useJUnitPlatform()
}

也就是IDEA新建一个gradle项目然后将上文替换build.gradle文件,然后点击构建即可:

如果新建的gradle项目中没有类似这样的结构(就是放java文件的地方):

请参考:

https://blog.csdn.net/qq_40548227/article/details/124741311

2 API文档

首先,BP本身自带了一个API DOC,在这里:

它有几个缺点:

  • 全英文

  • 没有代码示例

其次,PortSwigger自己在github上有很多示例插件,如:

https://github.com/PortSwigger/example-hello-world

它也有缺点:

  • 全英文

所以最重要的还是英语要好- -。

3 代码规范与基础插件构建

首先BP插件有两个规范:

  • 插件的主类名为BurpExtender,实现接口IBurpExtender

  • 插件的包名为burp

一个基础的BP插件结构及代码如下所示:

在这个基础上,我们开始构建一个基础的插件。

3.1 插件注册时

指的即是插件的“入口函数”registerExtenderCallbacks执行时。一般可以在此函数执行时打印作者信息并获取IExtensionHelpers(用于分析请求和响应)。

这是一段示例代码:

package burp;

import java.io.PrintWriter;
import java.nio.charset.StandardCharsets;

public class BurpExtender implements IBurpExtender{

    private static IExtensionHelpers helpers;
    private static PrintWriter so;

    @Override
    public void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks) {
        BurpExtender.helpers=callbacks.getHelpers(); //获取helpers
        BurpExtender.so=new PrintWriter(callbacks.getStdout(), true); //获取输出
        callbacks.setExtensionName("示例插件");
        BurpExtender.so.println("@name 示例插件");
        BurpExtender.so.println("@author AugustTheodor");
    }
}

将输入输出与扩展帮助对象(PrintWriter so与IExtensionHelpers helpers)存储为类变量,这样可以在其他类中直接进行调用。

3.2 监听请求与响应

负责监听请求与相应的监听器为IHttpListener,我们需要在主函数中注册监听器,如:

callbacks.registerHttpListener(new IHttpListener() {
    @Override
    public void processHttpMessage(int toolFlag, boolean messageIsRequest, IHttpRequestResponse messageInfo) {
        
    }
}); //注册HTTP监听器

继承此接口后,需要实现方法processHttpMessage,这个方法在每个请求经过时被调用,传入int toolFlag(请求经过的组件对应的id,如proxy、repeater,其值定义在IBurpExtenderCallbacks)、boolean messageIsRequest(这个包是否是请求包(false则为响应))、IHttpRequestResponse messageInfo(包的具体信息,可用于分析)。

以下是一个processHttpMessage处理HTTP请求与相应的范例,它会将所有经过PROXY的请求与相应打印到输出界面(需要注意的是getRequest与getResponse返回的是byte[]而非String,需要进行处理才能够读取到字符串形式)

@Override
public void processHttpMessage(int toolFlag, boolean messageIsRequest, IHttpRequestResponse messageInfo) {
    if(messageIsRequest){
        //处理请求
        if(toolFlag==IBurpExtenderCallbacks.TOOL_PROXY){
            //过滤PROXY之外的请求,只处理经过PROXY的请求
            BurpExtender.so.println(new String(messageInfo.getRequest(), StandardCharsets.UTF_8).intern());
        }
    }else{
        //处理响应
        if(toolFlag==IBurpExtenderCallbacks.TOOL_PROXY){
            BurpExtender.so.println(new String(messageInfo.getResponse(), StandardCharsets.UTF_8).intern());
        }
    }
}

当然,我们不光可以监听请求与相应,还可以修改它们。我们使用以下的方法设置请求与响应(在处理响应时不可设置请求,并且这里设置的也是byte[]的形式)

messageInfo.setResponse();
messageInfo.setRequest();

#3.3 修改Content-Length

在修改修改请求与响应的body部分中,有一个非常容易被忽略的步骤:修改Content-Length。如果不修改此头部,就很容易导致服务器响应异常和浏览器解析异常。所以在更新完body内容后需要重新计算body长度并修改Content-Length头的内容。

以下是一段处理响应中body并更新Content-Length头的代码(对于请求的处理方式是相同的):

@Override
public void processHttpMessage(int toolFlag, boolean messageIsRequest, IHttpRequestResponse messageInfo) {
    if(messageIsRequest){
        //处理请求
        byte[] response=messageInfo.getResponse();
        //获取response的byte
        IResponseInfo info=BurpExtender.helpers.analyzeResponse(response);
        //获取响应相关信息
        String head=new String(Arrays.copyOfRange(response,0,info.getBodyOffset()),StandardCharsets.UTF_8).intern();
        String body=new String(Arrays.copyOfRange(response,info.getBodyOffset(),response.length), StandardCharsets.UTF_8).intern();
        //分别获取head与body的String内容
        body=do_sth_with_body(body);
        //处理body
        String ori_CL="";
        //用于保存原本的Content-Length
        List<String> headers=helpers.analyzeResponse(response).getHeaders();
        for (String h:headers) {
            if(h.contains("Content-Length")){
                ori_CL=h;
                break;
            }
        }
        //获取Content-Length的原值
        String new_CL="Content-Length: "+String.valueOf(body.getBytes().length);
        //新的Content-Length
        head=head.replace(ori_CL,new_CL);
        //替换头部
        byte[] new_response=(head+body).getBytes();
        messageInfo.setResponse(new_response);
    }
}

我们可以将这个过程简化成一个工具函数:

byte[] tool_update_content_length(String head,String body,String new_body){
    //此函数自动更新Content-Length
    String ori_CL="";
    String new_CL="";
    List<String> headers= List.of(head.split("\n"));
    for (String h:headers) {
        if(h.contains("Content-Length")){
            ori_CL=h;
            break;
        }
    }
    new_CL="Content-Length: "+new_body.getBytes().length;
    //新的Content-Length
    head=head.replace(ori_CL,new_CL);
    //替换头部
    return (head+body).getBytes();
}

3.4 打包

使用下图的命令即可:

./gradlew build

4 UI

这个部分没有什么详细说的必要,就跟大学大作业画面板差不多。需要提的也就是几个踩雷点。

4.1 如何创建插件自己的标签页

需要使用ITab接口,并在入口函数中添加标签页:

call.addSuiteTab(this);

示例:

public class BurpExtender implements IBurpExtender,ITab{

    private static IExtensionHelpers helpers;
    private static PrintWriter so;

    @Override
    public void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks) {
        BurpExtender.helpers=callbacks.getHelpers(); //获取helpers
        BurpExtender.so=new PrintWriter(callbacks.getStdout(), true); //获取输出
        callbacks.setExtensionName("示例插件");
        callbacks.addSuiteTab(this); //一个插件可以有好几个Tab,比如我这里使用两次就会有两个Tab
        BurpExtender.so.println("@name 示例插件");
        BurpExtender.so.println("@author AugustTheodor");
    }

    @Override
    public String getTabCaption() {
        return "标签页名字";
    }

    @Override
    public Component getUiComponent() {
        //返回的是一个JAVA UI 组件,作为标签页显示的内容
        return null;
    }
}

4.2 AWT与SWING

java有两个UI组件包,一个是awt,一个是swing。这两个组件包里的组件混用时可能会出现意想不到的BUG(比如说JComboBox的选项一直弹不出来)。

4.3 JTable

我们可能会使用JTable绘制表格实现类似Proxy中列表的效果,如:

但原始表格里的元素默认是表现为TextField的。下面给出在表格中插入选择框与复选框的一个方法:

4.3.1 复选框

这个东西:

继承JTableModel,将需要类型为复选框的列Class置为Boolean:

public class ATableModel extends DefaultTableModel{

    private final Class[] tableClass={Boolean.class,String.class,String.class,String.class,String.class,String.class};
    //需要表现为复选框的列类型为Boolean

    @Override
    public int getColumnCount() {
        return this.tableClass.length;
    }

    @Override
    public String getColumnName(int columnIndex) {
        return L18n.getInstance().columns[columnIndex];
    }

    @Override
    public Class<?> getColumnClass(int columnIndex) {
        return this.tableClass[columnIndex];
    }

}

然后在实例化JTable时传入此Model的实例:

JTable table=new JTable(new ATableModel());

4.3.2 选择框

这个:

使用此语句:

table.getColumnModel().getColumn(1).setCellEditor(new DefaultCellEditor(new JComboBox<>(L18n.getInstance().operator)));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JAVA BP插件开发(一):基础插件开发 的相关文章

  • ubuntu20.04搭建arm交叉编译环境

    1 下载arm交叉编译程序 源码下载地址 xff1a Downloads GNU A Downloads Arm Developer 要根据目标系统选择编译器版本 xff0c 我的主板 xff1a aarch64bit体系结构 xff08
  • 【python】《多媒体技术与应用》实验报告「数字视频处理」

    多媒体技术与应用 实验报告 实验名称 数字视频处理 实验时间 2022 4 25 姓名 班级 计非201 学号 成绩 实验目的1 理解并掌握数字视频的相关概念 xff1b 2 掌握并利用 Python 读取和观察视频数据 xff1b 3 掌
  • Python GUI开发之Tkinter:详解安装和使用方法

    Python GUI开发之Tkinter 详解安装和使用方法 Tkinter是Python中最常用的GUI图形库之一 它是Python自带的标准库 所以不需要额外安装 在Python的标准库中 Tkinter模块被用来创建桌面GUI应用程序
  • windows下ssh免密登录ubuntu

    一 先查看要登录的服务器是否安装ssh server服务 dpkg l grep ssh 若没有则需要安装 apt span class token operator span get install openssh span class
  • CentOS 7下安装MPICH3.2过程详解

    最近由于专业需要 xff0c 需要在CentOS 7平台下安装并行计算包MPICH 由于我才接触Linux xff0c 鸟哥的基础入门书也才看了四分之一不到 xff0c 所以安装也一步一步按照官方给的文档安装 官方安装方法 首先附上官网给出
  • 洛谷 P3366 【模板】最小生成树

    洛谷 P3366 模板 最小生成树 题目 给出一个无向图 xff0c 求出最小生成树 xff0c 如果该图不连通 xff0c 则输出orz 题目链接 模板 最小生成树 洛谷 输入 第一行包含两个整数N M xff0c 表示该图共有N个结点和
  • 2019 计蒜之道 复赛 D “星云系统”

    2019 计蒜之道 复赛 D 星云系统 题目 现在给定你一个字符串s以及一个整数k xff0c 请求出s的字典序最小的长度为k的子序列 题目链接https nanti jisuanke com t 39614 输入格式 第一行一个由小写英文
  • Linux mysql 配置

    一 数据库处室化密码 刚刚装好的数据库需要重置密码 alter user user identified by 39 12345678 39 如果是测试环境 或者自己玩的环境 设置密码过于简单 可以通过一下命令修改关于密码的校验 set g
  • 二进制安装Kubernetes(k8s) v1.26.0 IPv4/IPv6双栈

    二进制安装Kubernetes xff08 k8s xff09 v1 26 0 IPv4 IPv6双栈 https github com cby chen Kubernetes 开源不易 xff0c 帮忙点个star xff0c 谢谢了 介
  • ThinkPad E430 蓝牙驱动 BCM43142A0

    最近我意外发现公司的 ThinkPad E430 笔记本竟然是带有蓝牙的 D 查看蓝牙设备标识 ID 利用 lsusb 命令找到蓝牙模块信息 Bus 001 Device 004 ID 105b e065 Foxconn Internati
  • cephadm 安装部署 ceph 集群

    介绍 手册 xff1a https access redhat com documentation zh cn red hat ceph storage 5 html architecture guide index http docs c
  • PVE Cloud-INIT 模板配置

    PVE Cloud INIT 模板配置 Cloud init是什么 Cloud init是开源的云初始化程序 xff0c 能够对新创建弹性云服务器中指定的自定义信息 xff08 主机名 密钥和用户数据等 xff09 进行初始化配置 通过Cl
  • openstack 环境部署

    22 1 了解云计算 人类基于千年的物种衍变基础 xff0c 在这个世纪终于有了爆发式的科技成果 xff0c 尤其这二十年内互联网的发展 xff0c 更像是一种催化剂 xff0c 让原本已经热闹的地球更加的沸腾 xff0c 互联网经济泡沫破
  • C语言,计算圆的面积程序

    C语言 xff0c 计算圆的面积程序 span class token comment 计算圆的面积程序 日期 xff1a 2020 8 29 姓名 xff1a 张倩峰 span span class token macro propert
  • 博图软件搜索不到网卡

  • 台达伺服手动调试

  • 博途V15.1激活工具出错。

    博图V15 1激活 xff0c 软件出错 出现以下报错信息 解决方法 xff1a 下载新版本激活工具 再次激活
  • winCC正常运行,不显示画面。

    winCC正常运行 xff0c 不显示画面 解决方法 xff1a 需要重装系统 xff0c 重新安装博途
  • S7-1500PLC仿真

    S7 1500PLC仿真
  • 一些已安装产品需要许可证,请启动Automation License Manager

    更新系统版本号 完成更新 xff0c 再次安装即可解决该问题

随机推荐

  • ubuntu 硬盘管理工具

    就我目前所用的系统举例说明吧 xff0c 应该都大同小异的 有图形界面的 xff0c 也有命令行的 xff1a 首先是 ubuntu 系统自带的 Disk Utility 工具集 利用该工具可以对硬盘进行 Format Drive View
  • MCS-51单片机,定时1分钟,汇编程序

    MCS 51单片机 xff0c 定时1分钟 xff0c 汇编程序 去博客设置页面 xff0c 选择一款你喜欢的代码片高亮样式 xff0c 下面展示同样高亮的 代码片 span class token constant ORG span 00
  • c++枚举字符串转换工具

    为什么会需要这样一个枚举转字符串 xff0c 字符串转枚举的工具 xff1f 在太多的工程中 xff0c 我们可能都需要将一些枚举 整形标记打到日志中去 xff0c 如果只打印数组 xff0c 那也不行啊 xff0c 出问题翻看日志 xff
  • AD16在PCB布局的时候如何批量复制布局布线!!

    本人也是看了很多博主的帖子反反复复推敲 xff0c 最后发现有的博主没讲到关键部分所以在批量复制布局的时候总是事与愿违 话不多说请看招 xff01 第一步选中需要复制的布局 xff01 如图所示 第二步 复制选中布局的 offset Cha
  • Atcoder abc250 题解 (A~G)

    A Adjacent Squares xff08 枚举 xff09 枚举一下 xff0c 满足题意则ans 43 43 即可 cin span class token operator gt gt span h span class tok
  • 简单理解epoll

    epoll系列系统调用 epoll是Linux特有的I O复用函数 epoll使用一组函数来完成任务 epoll把用户关心的文件描述符上的事件放在内核里的一个事件表中 epoll需要使用一个额外的文件描述符 xff0c 来唯一标识内核中的事
  • glibc-2.23 puts源码分析

    在分析puts代码之前先看一些基本的知识 一些flag span class token macro property span class token directive hash span span class token direct
  • Sublime Text 搭建 C++ 环境

    一 下载MinGW文件 1 下载mingw get setup xff1a 网址 xff1a https sourceforge net projects mingw 由于这是境外网站 xff0c 请自行解决连接问题 xff08 下载的文件
  • PlayFair加密方法原理及C+ +实现

    普莱费尔密码 xff08 英文 xff1a Playfair cipher 或 Playfair square xff09 是一种使用一个关键词方格来加密字符对的加密法 xff0c 1854年由一位名叫查尔斯 惠斯通 xff08 Charl
  • Python爬虫进阶(三):Selenium模拟浏览器操作

    目录 关于Selenium 启动webdriver selenium查找元素 selenium模拟用户行为 执行JS 模拟滚动条滚动 模拟鼠标操作 模拟键盘操作 其他常用函数 这一节我们来讲解使用selenium来模拟浏览器操作进而方便快捷
  • Python爬虫进阶(十):实战,Scrapy爬取贴吧

    目录 前言 目标 使用scrapy shell测试目标 1 为什么 2 尝试直接进入tieba baidu com 3 准备header 3 测试爬取目标 编写item 编写pipeline 编写spider 1 编写start reque
  • 关于WM_PAINT,窗口重绘invalidate、onidle

    一 WM PAINT 系统会在多个不同的时机发送WM PAINT消息 xff1a 当第一次创建一个窗口时 xff0c 当改变窗口的大小时 xff0c 当把窗口从另一个窗口背后移出时 xff0c 当最大化或最小化窗口时 xff0c 等等 xf
  • RMXP脚本解析(十五):Game_Battler(分割定义三)

    目录 前言 Game Battler xff08 分割定义三 xff09 代码解析 第一命中与第二命中 计算公式 xff08 真 xff09 effective xff08 攻击有效标志 xff09 的生效条件 属性修正 对象是Game A
  • RMXP脚本解析(#三十一):RGSS与RMXP数据库(十一.MoveRoute)

    前言 本类目前看到的实例出现在Game Character中 xff0c 作为其类变量 64 move route存在 本类用于描述移动的路径 RPG MoveRoute module RPG class MoveRoute def ini
  • 关于笔者个人博客访问与攻击的一个小统计,最常被利用的居然不是PHP框架?

    目录 前言 测试时间 测试用脚本 测试结果 xff08 ip部分 xff09 测试结果 xff08 url部分 xff09 前言 我只是闲的没事 xff0c 但是这一统计下来确实发现了一些有意思的事情 我的个人博客 xff08 August
  • 追忆童年系列:记一次寻找Flash小游戏的经历

    目录 Chapter 前言 Chapter 寻找游戏源文件 Chapter 寻找游戏源 Chapter 第二个版本的游戏 Chapter 解包及抓包 Chapter 游戏剧情 Chapter 最新 xff0c 最新的进展 Chapter 前
  • 进阶Django(三):模型外键、多对多关系、自关联外键及Meta类

    目录 前言 模型中的映射关系 1 物理外键与逻辑外键 2 Django中的外键 xff08 一对一 一对多关系 xff09 3 Django中的多对多关系 3 1 使用ManyToManyField自动建立多对多关系 3 2 另一种建立多对
  • Unity游戏教程初步(八):Animator的使用

    1 前言 本节中我们来介绍Unity的动画系统以及管理动画剪辑 xff08 Animation Clip xff09 的组件Animator 2 Unity中的动画系统 Unity的动画系统又称为Mecanim xff0c 是一个基于动画剪
  • 手机模拟器安装证书抓包

    目录 1 抓包软件 2 抓取HTTPS包 3 不同抓包软件配置步骤 4 代理 1 抓包软件 由于是手机模拟器 xff0c 所以可以使用adb进入命令行 xff0c 方便一些 抓包软件手机上的有HTTPCanary xff0c 电脑上需要配置
  • JAVA BP插件开发(一):基础插件开发

    本文会包括BP插件开发流程及打包 xff0c API xff0c javaswing xff08 UI xff09 部分的内容 阅读完本文后 xff0c 读者将初步具有开发BP插件的能力 1 开始开发 我们使用IDEA作为开发工具 xff0