当前位置: 首页 > news >正文

BP插件开发(JAVA)

本文会包括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;@Overridepublic void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks) {BurpExtender.helpers=callbacks.getHelpers(); //获取helpersBurpExtender.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() {@Overridepublic 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的byteIResponseInfo 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);//处理bodyString ori_CL="";//用于保存原本的Content-LengthList<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-Lengthhead=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-LengthString 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-Lengthhead=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;@Overridepublic void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks) {BurpExtender.helpers=callbacks.getHelpers(); //获取helpersBurpExtender.so=new PrintWriter(callbacks.getStdout(), true); //获取输出callbacks.setExtensionName("示例插件");callbacks.addSuiteTab(this); //一个插件可以有好几个Tab,比如我这里使用两次就会有两个TabBurpExtender.so.println("@name 示例插件");BurpExtender.so.println("@author AugustTheodor");}@Overridepublic String getTabCaption() {return "标签页名字";}@Overridepublic 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@Overridepublic int getColumnCount() {return this.tableClass.length;}@Overridepublic String getColumnName(int columnIndex) {return L18n.getInstance().columns[columnIndex];}@Overridepublic 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)));

相关文章:

BP插件开发(JAVA)

本文会包括BP插件开发流程及打包&#xff0c;API&#xff0c;javaswing&#xff08;UI&#xff09;部分的内容。阅读完本文后&#xff0c;读者将初步具有开发BP插件的能力。1 开始开发我们使用IDEA作为开发工具&#xff08;使用其他IDE也绰绰有余&#xff09;。引入依赖包&…...

【Zookeeper】介绍与配置

目录 概述 工作机制 特点 数据结构 应用场景 统一配置管理 统一集群管理 ​编辑 服务器动态上下线 软负载均衡 下载 启动 启动客户端 配置参数 集群配置 配置服务器编号 配置zoo.cfg 分发zoo.cfg配置文件 选举机制 第一次启动 非第一次启动 集群启动停止脚本…...

chrome快捷键

Ctrl T&#xff1a;打开新标签页。Ctrl W&#xff1a;关闭当前标签页。Ctrl Shift T&#xff1a;重新打开最近关闭的标签页。Ctrl Tab&#xff1a;在打开的标签页之间切换。Ctrl Shift Tab&#xff1a;在打开的标签页之间反向切换。Ctrl N&#xff1a;打开新窗口。Ctrl…...

手搓string类

手搓string类 文章目录手搓string类string的成员一.构造&#xff0c;拷贝构造&#xff0c;赋值重载和析构1.构造函数2.拷贝构造3.swap问题4.赋值重载5.析构函数二.简单接口1.c_str2.size(有效字符长度)3.capacity&#xff08;有效字符容量&#xff09;4.operator[]5.迭代器和范…...

小白学Pytorch系列--Torch API (7)

小白学Pytorch系列–Torch API (7) Comparison Ops allclose 此函数检查输入和其他是否满足条件&#xff1a; >>> torch.allclose(torch.tensor([10000., 1e-07]), torch.tensor([10000.1, 1e-08])) False >>> torch.allclose(torch.tensor([10000., 1e-…...

函数(上)——“Python”

各位CSDN的uu们你们好呀&#xff0c;今天小雅兰的内容是Python的函数呀&#xff0c;下面&#xff0c;就让我们进入函数的世界吧 首先可以选择性地看一下小雅兰很久之前写的C语言函数章节的知识&#xff1a; 函数——“C”_认真学习的小雅兰.的博客-CSDN博客 函数递归&#xf…...

ChatGPT说:如何利用ChatGPT变现?躺着赚钱不是梦。

您好&#xff0c;我是码农飞哥&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精通 &#x1f601; 2. 毕业设计专栏&…...

4.网络爬虫—Post请求(实战演示)

网络爬虫—Post请求实战演示POST请求GET请求POST请求和GET请求的区别获取二进制数据爬[百度官网](https://www.baidu.com/)logo实战发送post请求百度翻译实战使用session发送请求模拟登录17k小说网常见问题前言&#xff1a; &#x1f4dd;​&#x1f4dd;​此专栏文章是专门针对…...

【视频文稿】车载Android应用开发与分析 - 开发系统应用

本期视频地址&#xff1a;https://www.bilibili.com/video/BV1NY411z7TK/ 前言 Hello&#xff0c;大家好&#xff0c;我是林栩。 开发车载应用&#xff0c;其实主要都是在Android系统中编写各种系统应用&#xff0c;所以上期视频先介绍了Android系统源码的下载和编译流程&…...

Scala流程控制

目录 单分支 双分支 多分支 for 循环控制 循环守卫 循环步长 循环嵌套 循环返回值 While 和 do..While 循环控制 While循环控制 do..While 循环控制 循环中断 单分支 if (条件表达式) {执行代码块 }var age StdIn.readShort()if (age < 18){println("童年&quo…...

人脸活体检测系统(Python+YOLOv5深度学习模型+清新界面)

摘要&#xff1a;人脸活体检测系统利用视觉方法检测人脸活体对象&#xff0c;区分常见虚假人脸&#xff0c;以便后续人脸识别&#xff0c;提供系统界面记录活体与虚假人脸检测结果。本文详细介绍基于YOLOv5深度学习技术的人脸活体检测系统&#xff0c;在介绍算法原理的同时&…...

prometheus03-如何导出prometheus指标

Prometheus是一个开源的监控系统和时间序列数据库&#xff0c;用于收集和存储服务的指标数据。要导出Prometheus指标&#xff0c;你需要使用或实现一个Prometheus Exporter。以下是一个简单的指南&#xff0c;分为三个主要步骤&#xff1a; 选择或实现Prometheus Exporter Pr…...

Linux驱动开发——串口设备驱动

Linux驱动开发——串口设备驱动 一、串口简介 串口全称叫做串行接口&#xff0c;通常也叫做 COM 接口&#xff0c;串行接口指的是数据一个一个的顺序传输&#xff0c;通信线路简单。使用两条线即可实现双向通信&#xff0c;一条用于发送&#xff0c;一条用于接收。串口通信距…...

LeetCode--缺失的第一个正数(41)和 接雨水(42)

目录 缺失的第一个正数 接雨水 0ms&#xff0c;100% 代码 缺失的第一个正数 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/first-missing-positive 题目&#xff1a;给你一个未排序的整数数组 nums &#xff0c;请…...

java源码阅读---ReentrantLock源码解析

ReentrantLock源码解读 在讲ReentrantLock之前我们先看一下Lock接口里的方法 Lock接口中的方法 lock()方法 void lock(); //直接加锁,如果加锁失败什么也不返回lockInterruptibly()方法 void lockInterruptibly() throws InterruptedException;lockInterruptibly()方法能够…...

OpenCv + Qt5.12.2 文字识别

OpenCv Qt5.12.2 文字检测与文本识别 前言 ​ 好久没有进行一些相关的更新的了&#xff0c;去年一共更新了四篇&#xff0c;最近一直在做音视频相关的直播服务&#xff0c;又是重新学习积攒经验的一个过程。去年疫情也比较严重&#xff0c;等到解封&#xff0c;又一直很忙&a…...

网络作业1【计算机网络】

网络作业1【计算机网络】前言推荐网络作业1一. 单选题&#xff08;共7题&#xff0c;58.1分&#xff09;二. 多选题&#xff08;共1题&#xff0c;8.3分&#xff09;三. 判断题&#xff08;共4题&#xff0c;33.6分&#xff09;最后前言 2023-3-13 20:11:42 以下内容源自《计…...

常见背包问题

一.前言若你想学习或正在学习动态规划&#xff0c;背包问题一定是你需要了解的一种题型&#xff0c;并且大多数人最初都是从背包问题入坑进而打开动态规划这一大门。背包问题分为多种&#xff0c;你可以先掌握最常见的主要是三类&#xff1a;01背包、完全背包、多重背包二.分析…...

【python】python编译器以及安装

✅作者简介&#xff1a;一名在读大二学生&#xff0c;希望大家多多支持 &#x1f525;系列专栏&#xff1a;python &#x1f4ac;个人主页&#xff1a;小园园子的CSDN博客 python编译器以及安装一、编译器与解释器详细内容Python解释器种类Python的运行机制二、python环境搭建p…...

Effective C++快速复习

Effective C快速复习 习惯 C 01 视 C 为一个语言联邦&#xff1a;C、Object-Oriented C、Template C、STL 02 尽量以 const, enum, inline 替换 #define&#xff1a;其实是尽量以编译器替换预处理器比较好&#xff0c;因为 #define 只是简单的字符串匹配替换&#xff0c;编译…...

【华为OD机试真题JAVA】绘图机器的绘图问题

标题:绘图机器的绘图问题| 时间限制:1秒 | 内存限制:262144K | 语言限制:不限 绘图机器的绘图笔初始位置在原点(0,0) 机器启动后按照以下规则来进行绘制直线 1. 尝试沿着横线坐标正向绘制直线 直到给定的终点E 2. 期间可以通过指令在纵坐标轴方向进行偏移 off…...

GPT-4最震撼我的一点

昨天我看了一遍OpenAI发的视频和论文&#xff0c;最震撼我的并不是根据手绘草图生成HTML页面代码&#xff0c;因为草图太简单&#xff0c;对于复杂的有交互的界面&#xff0c;还不知道它的能力究竟如何&#xff0c;能不能生成准确的、清晰的代码&#xff0c;我再实验一下再给大…...

LeetCode-复制带随机指针的链表

题目描述&#xff1a; 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成&#xff0c;其中每个新节点的值都设为其对应的…...

如何在Unity中实现AStar寻路算法及地图编辑器

文章目录AStar算法简介实现Node节点节点间的估价算法核心邻节点的搜索方式地图编辑器简介实现绘制地图网格障碍/可行走区域地图数据存储AStar算法 简介 Unity中提供了NavMesh导航寻路的AI功能&#xff0c;如果项目不涉及服务端它应该能满足大部分需求&#xff0c;但如果涉及服…...

线性代数之矩阵

一、思维导图二、矩阵及其运算1、矩阵的定义注&#xff1a;零矩阵&#xff1a;元素均为0 的矩阵&#xff0c;通常记作0m*n称为矩阵的类型。满足阶梯形矩阵 行简化的阶梯形矩阵即满足如下条件的矩阵&#xff1a; (1)阶梯形; (2)非零首元所在列其余元素均为0 &#xff1b; (3) 非…...

【个人首测】百度文心一言 VS ChatGPT GPT-4

昨天我写了一篇文章GPT-4牛是牛&#xff0c;但这几天先别急,文中我测试了用GPT-4回答ChatGPT 3.5 和 Notion AI的问题&#xff0c;大家期待的图片输入也没有出现。 昨天下午百度发布了文心一言&#xff0c;对标ChatGPT&#xff0c;录屏无实机演示让百度股价暴跌。但是晚上百度就…...

基于STM32的ADC采样及各式滤波实现(HAL库,含VOFA+教程)

前言&#xff1a;本文为手把手教学ADC采样及各式滤波算法的教程&#xff0c;本教程的MCU采用STM32F103ZET6。以HAL库的ADC采样函数为基础进行教学&#xff0c;通过各式常见滤波的实验结果进行分析对比&#xff0c;搭配VOFA工具直观的展示滤波效果。ADC与滤波算法都是嵌入式较为…...

Redis高级篇

文章目录面试题库redis有哪些用法&#xff1f;redis单线程时代性能依然很快的原因&#xff1f;主线程和IO线程怎么协作完成请求处理的BigKey&#xff08;重要&#xff09;什么算是BigKey&#xff1f;怎么发现BigKey&#xff1f;怎么删除bigkey&#xff1f;bigkey生产调优缓存双…...

sess.close()这句话一般是干什么的,在代码中可以不加么?

sess.close()这句话是用于关闭TensorFlow会话对象的方法。 关闭会话对象可以释放资源&#xff0c;避免内存泄漏&#xff0c;以及清除图中的变量和操作。 在代码中是否可以不加这句话&#xff0c;取决于你是如何创建和使用会话对象的。如果你使用了with语句来创建和管理会话对…...

网络舆情监测处置平台,TOOM舆情如何做好舆情风险点及防控措施?

网络舆情监测处置平台是一个综合性的系统&#xff0c;旨在帮助企业、政府或其他组织有效地管理和处置网络舆情。从多个角度来分析该平台&#xff0c;我们可以考虑以下几个方面&#xff1a; 1&#xff0c;技术实现 网络舆情监测处置平台的技术实现是其核心&#xff0c;它通常采…...