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

机关党建项目网站建设方案无货源网店怎么开

机关党建项目网站建设方案,无货源网店怎么开,商圈外卖网站怎么做,app是什么软件本文会包括BP插件开发流程及打包,API,javaswing(UI)部分的内容。阅读完本文后,读者将初步具有开发BP插件的能力。1 开始开发我们使用IDEA作为开发工具(使用其他IDE也绰绰有余)。引入依赖包&…

本文会包括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)));
http://www.yidumall.com/news/87332.html

相关文章:

  • 做什么网站能吸引流量新网站如何快速收录
  • 东莞整站优化关键词自动生成器
  • 国家住房城乡建设厅网站广州百度推广客服电话多少
  • seo网站优化技术疫情优化调整
  • 工厂招聘信息seo网络搜索引擎优化
  • 电商网站有哪些功能如何在百度发布广告信息
  • 咸宁住房和城乡规划建设局网站百度推广的方式有哪些
  • 太原seo建站seo在线排名优化
  • 适合企业做外贸的几个网站新乡seo顾问
  • 珠海网站制作公广州seo优化推广
  • 亚马逊网站特点aso优化平台
  • 网站建设电子书资料优化网站的意思
  • wordpress 设置网站目录网站seo的方法
  • 门户网站建设进度广州seo推广营销
  • 有什么网站可以做宣传图片腾讯广告代理
  • app开发网站建设百度的人工客服电话
  • 互联网站备案登记表竞价推广托管服务
  • 媒体网站 建设网络强国河南网站网络营销推广
  • 建设通是什么网站百度推广账号登录入口
  • 门户网站开发招标信息推广服务
  • 做网站功能网站推广优化设计方案
  • 广州冼村社区服务中心电话广州百度搜索排名优化
  • 领券的网站怎么建设5g影讯5g天线在线观看免费视频
  • 安康网站建设公司报价批量优化网站软件
  • 昆明网站推广2021最火关键词
  • 网站源码下载视频长沙百度关键词推广
  • 网站背景特效企业网站模板建站
  • 我是做网站的 怎么才能提高业绩大连网站搜索排名
  • 免费图片素材网站推荐软文写作500字
  • 网站建设的自己怎么做关键词优化