BurpSuite外掛開發指南之 API 下篇

wyzsk發表於2020-08-19
作者: Her0in · 2016/04/12 10:59

0x00 前言


此文是接著 《BurpSuite外掛開發指南之 API 上篇》 所寫,此篇中將要介紹的 API 和上篇有著緊密的聯絡,所以建議讀者可以將上下篇作為一個整體去看待。

《BurpSuite 外掛開發指南》系列文章如下:

  • 《BurpSuite外掛開發指南之 API 篇》
  • 《BurpSuite外掛開發指南之 Java 篇》
  • 《BurpSuite外掛開發指南之 Python 篇》

0x01 API 參考


IMessageEditor

public interface IMessageEditor

此介面被用於使用 Burp 的 HTTP 訊息編輯框的例項提供擴充套件功能,以便擴充套件外掛可以在它自己的 UI 中使用訊息編輯框,擴充套件外掛可以透過呼叫 IBurpExtenderCallbacks.createMessageEditor() 獲得此介面的例項。

此介面提供了以下方法:

#!java
// 此方法返回了編輯器的 UI 元件,擴充套件外掛可以將其新增到自己的 UI 中
java.awt.Component  getComponent()

// 此方法用於獲取當前已顯示的訊息,此訊息可能已被使用者修改
byte[]  getMessage()

// 此方法返回了使用者當前所選擇的資料
byte[]  getSelectedData()

// 此方法用於決定當前的訊息是否可被使用者修改
boolean isMessageModified()

// 此方法用於將一個 HTTP 訊息顯示在編輯器中
void    setMessage(byte[] message, boolean isRequest)

注: 此介面需要與 IMessageEditorTabFactory 等相關介面一起使用。

Demo code:

請見 IMessageEditorTabFactory 的例項程式碼。

IMessageEditorController

public interface IMessageEditorController

此介面被用於 IMessageEditor 獲取當前顯示的訊息的細節。建立了 Burp 的 HTTP 訊息編輯器例項的擴充套件外掛可以有選擇的實現 IMessageEditorController介面,當擴充套件外掛需要當前訊息的其他資訊時,編輯器將會呼叫此介面(例如:傳送當前訊息到其他的 Burp 工具中)。擴充套件透過 IMessageEditorTabFactory 工廠提供自定義的編輯器標籤頁,此工廠的 createNewInstance 方法接受一個由該工廠所生成的每一個標籤頁的IMessageEditorController 物件的引用,當標籤頁需要當前訊息的其他資訊時,則會呼叫該物件。

此方法提供了以下方法:

#!java
// 此方法用於獲取當前訊息的 HTTP 服務資訊
IHttpService    getHttpService()

// 此方法用於獲取當前訊息的 HTTP 請求(也有可能是一個響應訊息)
byte[]  getRequest()

// 此方法用於獲取當前訊息的 HTTP 響應(也有可能是一個請求訊息)
byte[]  getResponse()

Demo code:

請見 IMessageEditorTabFactory 的例項程式碼。

IMessageEditorTab

public interface IMessageEditorTab

擴充套件外掛透過註冊 IMessageEditorTabFactory 工廠,此工廠的createNewInstance返回一個當前介面的例項,Burp 將會在其 HTTP 訊息編輯器中建立自定義的標籤頁。

此介面提供瞭如下方法:

#!java
// 此方法返回當前顯示的訊息
byte[]  getMessage()

// 此方法用於獲取當前已被使用者選擇的資料
byte[]  getSelectedData()

// 此方法返回自定義標籤頁的標題
java.lang.String    getTabCaption()

// 此方法返回自定義標籤頁內容的元件
java.awt.Component  getUiComponent()

// 此方法用於指示在顯示一個新的 HTTP 訊息時,是否啟用自定義的標籤頁
boolean isEnabled(byte[] content, boolean isRequest)

// 此方法用於決定當前顯示的訊息是否可被使用者修改
boolean isModified()

// 此方法可以顯示一個新的訊息或者清空已存在的訊息
void    setMessage(byte[] content, boolean isRequest)

Demo code:

請見 IMessageEditorTabFactory 的例項程式碼。

IMessageEditorTabFactory

public interface IMessageEditorTabFactory

擴充套件可以實現此介面,並且可以呼叫 IBurpExtenderCallbacks.registerMessageEditorTabFactory() 註冊一個自定義的訊息編輯器標籤頁的工廠。擴充套件外掛可以在 Burp 的 HTTP 編輯器中渲染或編輯 HTTP 訊息。

此介面提供了一個方法:

#!java
// Burp 將會對每一個 HTTP 訊息編輯器呼叫一次此方法,此工廠必須返回一個新的 IMessageEditorTab 物件
IMessageEditorTab   createNewInstance(IMessageEditorController controller, boolean editable)

Demo code:

#!java
package burp;

import java.awt.Component;
import java.io.PrintWriter;

public class BurpExtender implements IBurpExtender, IMessageEditorTabFactory{

    public PrintWriter stdout;
    public IExtensionHelpers helpers;
    private IBurpExtenderCallbacks callbacks;

    @Override
    public void registerExtenderCallbacks(final IBurpExtenderCallbacks callbacks){

        this.stdout = new PrintWriter(callbacks.getStdout(), true);
        this.callbacks = callbacks;
        this.helpers = callbacks.getHelpers();
        callbacks.setExtensionName("Her0in");
        callbacks.registerMessageEditorTabFactory(this);
    }

    @Override
    public IMessageEditorTab createNewInstance(
            IMessageEditorController controller, boolean editable) {
        // 返回 IMessageEditorTab 的例項
        return new iMessageEditorTab();
    }

    class iMessageEditorTab implements IMessageEditorTab{

        // 建立一個新的文字編輯器
        private ITextEditor iTextEditor = callbacks.createTextEditor();

        @Override
        public String getTabCaption() {
            // 設定訊息編輯器標籤頁的標題
            return "測試 MessageEditorTab";
        }

        @Override
        public Component getUiComponent() {
            // 返回 iTextEditor 的元件資訊,當然也可以放置其他的元件
            return iTextEditor.getComponent();
        }

        @Override
        public boolean isEnabled(byte[] content, boolean isRequest) {
            // 在顯示一個新的 HTTP 訊息時,啟用自定義的標籤頁
            // 透過 content 和 isRequest 也可以對特定的訊息進行設定
            return true;
        }

        @Override
        public void setMessage(byte[] content, boolean isRequest) {
            // 把請求訊息裡面的 data 引數進行 Base64 編碼操作
            // 這裡並未處理引數中沒有 data 時的異常
            IParameter parameter = helpers.getRequestParameter(content, "data");
            stdout.println("data = " + parameter.getValue());
            iTextEditor.setText(helpers.stringToBytes(helpers.base64Encode(parameter.getValue())));
        }

        @Override
        public byte[] getMessage() {
            // 獲取 iTextEditor 的文字
            return iTextEditor.getText();
        }

        @Override
        public boolean isModified() {
            // 允許使用者修改當前的訊息
            return true;
        }

        @Override
        public byte[] getSelectedData() {
            // 直接返回 iTextEditor 中選中的文字
            return iTextEditor.getSelectedText();
        }

    }
}

載入上述程式碼生成的外掛後,會顯示自定義的標籤頁和文字編輯器。

注意:官網提供的自定義訊息編輯器的程式碼有誤!

pic

IParameter

public interface IParameter

此介面用於操控 HTTP 請求引數,開發者透過此介面可以靈活的獲取請求或響應裡的引數。

#!java
// 此方法用於獲取引數名稱
java.lang.String    getName()

// 此方法用於獲取在 HTTP 請求裡面的最後一個引數的名稱
int getNameEnd()

// 此方法用於獲取在 HTTP 請求裡面的第一個引數的名稱
int getNameStart()

// 此方法用於獲取引數型別,引數的型別在 IParameter 介面中有定義
byte    getType()

// 此方法用於獲取引數的值
java.lang.String    getValue()

// 此方法用於獲取最後一個引數的值
int getValueEnd()

// 此方法用於獲取第一個引數的值
int getValueStart()

Demo code:

#!java
package burp;

import java.io.PrintWriter;
import java.util.List;

public class BurpExtender implements IBurpExtender, IHttpListener{

    public PrintWriter stdout;
    public IExtensionHelpers helpers;
    private IBurpExtenderCallbacks callbacks;

    @Override
    public void registerExtenderCallbacks(final IBurpExtenderCallbacks callbacks){

        this.stdout = new PrintWriter(callbacks.getStdout(), true);
        this.callbacks = callbacks;
        this.helpers = callbacks.getHelpers();
        callbacks.setExtensionName("Her0in");
        callbacks.registerHttpListener(this);
    }

    @Override
    public void processHttpMessage(int toolFlag, boolean messageIsRequest,
            IHttpRequestResponse messageInfo) {
        // 獲取請求中的引數
        if(messageIsRequest){
            IRequestInfo iRequestInfo = helpers.analyzeRequest(messageInfo);
            // 獲取請求中的所有引數
            List<IParameter> iParameters = iRequestInfo.getParameters();
            for (IParameter iParameter : iParameters) {
                if(iParameter.getType() == IParameter.PARAM_URL)
                    stdout.println("引數:" + iParameter.getName() + " 在 URL中");
                    stdout.println("引數:" + iParameter.getName() + " 的值為:" + iParameter.getValue());
            }
        }

    }
}

載入上述程式碼生成的外掛後,執行效果如下圖所示:

pic

IProxyListener

public interface IProxyListener

擴充套件可以實現此介面,並且可以透過呼叫 IBurpExtenderCallbacks.registerProxyListener() 註冊一個代理監聽器。在代理工具處理了請求或響應後會通知此監聽器。擴充套件外掛透過註冊這樣一個監聽器,對這些訊息執行自定義的分析或修改操作。

此介面提供了一個很常用的方法:

#!java
// 當代理工具處理 HTTP 訊息時則會呼叫此方法
void    processProxyMessage(boolean messageIsRequest, IInterceptedProxyMessage message)

Demo code:

#!java
package burp;

import java.io.PrintWriter;
public class BurpExtender implements IBurpExtender, IProxyListener{

    public PrintWriter stdout;
    public IExtensionHelpers helpers;
    private IBurpExtenderCallbacks callbacks;

    @Override
    public void registerExtenderCallbacks(final IBurpExtenderCallbacks callbacks){

        this.stdout = new PrintWriter(callbacks.getStdout(), true);
        this.callbacks = callbacks;
        this.helpers = callbacks.getHelpers();
        callbacks.setExtensionName("Her0in");
        callbacks.registerProxyListener(this);
    }

    @Override
    public void processProxyMessage(boolean messageIsRequest,
            IInterceptedProxyMessage message) {
            // TODO here
    }
}

IRequestInfo

public interface IRequestInfo

此介面被用於獲取一個 HTTP 請求的詳細資訊。擴充套件外掛可以透過呼叫 IExtensionHelpers.analyzeRequest() 獲得一個 IRequestInfo 物件。

此介面提供了以下方法:

#!java  
// 此方法用於獲取 HTTP body 在請求訊息中的起始偏移量
int getBodyOffset()

// 此方法用於獲取請求訊息的 HTTP 型別
byte    getContentType()

// 此方法用於獲取請求中包含的 HTTP 頭
java.util.List<java.lang.String>    getHeaders()

// 此方法用於獲取請求的 HTTP 方法
java.lang.String    getMethod()

// 此方法用於獲取請求中包含的引數
java.util.List<IParameter>  getParameters()

// 此方法用於獲取請求中的 URL
java.net.URL    getUrl()

Demo code:

#!java
package burp;

import java.io.PrintWriter;

public class BurpExtender implements IBurpExtender, IHttpListener{

    public PrintWriter stdout;
    public IExtensionHelpers helpers;

    @Override
    public void registerExtenderCallbacks(final IBurpExtenderCallbacks callbacks){

        this.stdout = new PrintWriter(callbacks.getStdout(), true);
        this.helpers = callbacks.getHelpers();
        callbacks.setExtensionName("Her0in");
        callbacks.registerHttpListener(this);
    }

    @Override
    public void processHttpMessage(int toolFlag, boolean messageIsRequest,
            IHttpRequestResponse messageInfo) {
        // 列印出請求的 Url 和 響應碼
        if(messageIsRequest){
            stdout.println(helpers.bytesToString(messageInfo.getRequest()));
        }
        else{
            IResponseInfo responseInfo = helpers.analyzeResponse(messageInfo.getResponse());
            short statusCode = responseInfo.getStatusCode();
            stdout.printf("響應碼 => %d\r\n", statusCode);
        }
    }
}

載入上述程式碼生成的外掛後,執行效果如下圖所示:

pic

IResponseInfo

public interface IResponseInfo

此介面被用於獲取一個 HTTP 請求的詳細資訊。擴充套件外掛可以透過呼叫 IExtensionHelpers. analyzeResponse() 獲得一個 IResponseInfo 物件。

#!java
// 此方法用於獲取 HTTP body 在響應訊息中的起始偏移量
int getBodyOffset()

// 此方法用於獲取響應訊息中設定的 HTTP Cookie
java.util.List<ICookie> getCookies()

// 此方法用於獲取包含在響應訊息中的 HTTP 頭
java.util.List<java.lang.String>    getHeaders()

// 此方法用於獲取根據 HTTP 響應判斷出的 MIME 型別
java.lang.String    getInferredMimeType()

// 此方法用於獲取 HTTP 響應頭中指示的 MIME 型別
java.lang.String    getStatedMimeType()

// 此方法用於獲取 HTTP 狀態碼
short   getStatusCode()

Demo code:

#!java
package burp;

import java.io.PrintWriter;

public class BurpExtender implements IBurpExtender, IHttpListener{

    public PrintWriter stdout;
    public IExtensionHelpers helpers;

    @Override
    public void registerExtenderCallbacks(final IBurpExtenderCallbacks callbacks){

        this.stdout = new PrintWriter(callbacks.getStdout(), true);
        this.helpers = callbacks.getHelpers();
        callbacks.setExtensionName("Her0in");
        callbacks.registerHttpListener(this);
    }

    @Override
    public void processHttpMessage(int toolFlag, boolean messageIsRequest,
            IHttpRequestResponse messageInfo) {
        // 列印出請求的 Url 和 響應碼
        if(messageIsRequest){
            stdout.println(helpers.bytesToString(messageInfo.getRequest()));
        }
        else{
            IResponseInfo responseInfo = helpers.analyzeResponse(messageInfo.getResponse());
            short statusCode = responseInfo.getStatusCode();
            stdout.printf("響應碼 => %d\r\n", statusCode);
        }
    }
}

IScanIssue

public interface IScanIssue

此介面用於獲取 Scanner 工具掃描到的問題的細節。擴充套件可以透過註冊一個 IScannerListener 或者是 透過呼叫 IBurpExtenderCallbacks.getScanIssues() 獲取掃描問題的細節。擴充套件同樣可以透過註冊IScannerCheck介面或者是呼叫IBurpExtenderCallbacks.addScanIssue()方法來自定義掃描問題,此時擴充套件需要提供它對此介面的實現。

此介面提供了以下方法:

#!java  
// 此方法返回掃描問題的信任等級
java.lang.String    getConfidence()

// 此方法返回生成掃描問題所對應的 HTTP 訊息
IHttpRequestResponse[]  getHttpMessages()

// 此方法返回生成掃描問題所對應的 HTTP 服務資訊
IHttpService    getHttpService()

// 此方法返回指定掃描問題型別的背景描述資訊
java.lang.String    getIssueBackground()

// 此方法返回指定的掃描問題的詳細資訊
java.lang.String    getIssueDetail()

// 此方法返回掃描問題型別的名稱
java.lang.String    getIssueName()

// 此方法返回掃描問題型別的數字標誌符
int getIssueType()

// 此方法返回指定掃描問題的解決方式的背景描述資訊
java.lang.String    getRemediationBackground()

// 此方法返回指定掃描問題的解決方式的背景詳情
java.lang.String    getRemediationDetail()

// 此方法返回掃描問題的錯誤等級
java.lang.String    getSeverity()

// 此方法返回生成掃描問題對應的 URL 資訊
java.net.URL    getUrl()

Demo code:

請見 IScannerListener 的例項程式碼。

IScannerCheck

public interface IScannerCheck

擴充套件可以實現此介面,之後可以透過呼叫IBurpExtenderCallbacks.registerScannerCheck() 註冊一個自定義的 Scanner 工具的檢查器。Burp 將會告知檢查器執行“主動掃描”或“被動掃描”,並且在確認掃描到問題時給出報告。

#!java
// 當自定義的Scanner工具的檢查器針對同一個 URL 路徑報告了多個掃描問題時,Scanner 工具會呼叫此方法
int consolidateDuplicateIssues(IScanIssue existingIssue, IScanIssue newIssue)

// Scanner 工具會對每一個可插入的點執行“主動掃描”
java.util.List<IScanIssue>  doActiveScan(IHttpRequestResponse baseRequestResponse, IScannerInsertionPoint insertionPoint)

// Scanner 工具會對每一個可插入的點執行“被動掃描”
java.util.List<IScanIssue>  doPassiveScan(IHttpRequestResponse baseRequestResponse)

Demo code:

#!java
package burp;

import java.io.PrintWriter;
import java.util.List;

public class BurpExtender implements IBurpExtender, IScannerCheck{

    public PrintWriter stdout;
    public IExtensionHelpers helpers;

    @Override
    public void registerExtenderCallbacks(final IBurpExtenderCallbacks callbacks){

        this.stdout = new PrintWriter(callbacks.getStdout(), true);
        this.helpers = callbacks.getHelpers();
        callbacks.setExtensionName("Her0in");
        callbacks.registerScannerCheck(this);
    }

    @Override
    public List<IScanIssue> doPassiveScan(
            IHttpRequestResponse baseRequestResponse) {
        // TODO here
        return null;
    }

    @Override
    public List<IScanIssue> doActiveScan(
            IHttpRequestResponse baseRequestResponse,
            IScannerInsertionPoint insertionPoint) {
        // TODO here
        return null;
    }

    @Override
    public int consolidateDuplicateIssues(IScanIssue existingIssue,
            IScanIssue newIssue) {
        // TODO here
        return 0;
    }
}

IScannerInsertionPoint

public interface IScannerInsertionPoint

此介面被用於定義一個用於Scanner工具檢查器掃描的插入點。擴充套件可以透過註冊IScannerCheck 獲得此介面例項,或者透過註冊IScannerInsertionPointProvider 建立一個 Burp 所使用的掃描檢查器例項。

#!java  
// 此方法用於使用指定的 payload 在插入點構建一個請求
byte[]  buildRequest(byte[] payload)

// 此方法返回插入點的基本值
java.lang.String    getBaseValue()

// 此方法返回插入點的名稱
java.lang.String    getInsertionPointName()

// 此方法返回插入點的型別,插入點型別在IScannerInsertionPoint介面中定義
byte    getInsertionPointType()

// 當使用指定的 payload 替換到插入點時,此方法可以決定 payload 在請求中的偏移量
int[]   getPayloadOffsets(byte[] payload)

Demo code:

請見 IScannerCheck 的例項程式碼。  

IScannerInsertionPointProvider

public interface IScannerInsertionPointProvider

擴充套件可以實現此介面並且可以透過呼叫IBurpExtenderCallbacks.registerScannerInsertionPointProvider()註冊自定義掃描插入點的工廠。

此介面提供了以下方法:

#!java
// 當掃描請求為“主動掃描”時, Scanner 工具將會呼叫此方法,並且提供者應該提供一個自定義插入點的列表以便用於掃描
java.util.List<IScannerInsertionPoint>  getInsertionPoints(IHttpRequestResponse baseRequestResponse)

IScannerListener

public interface IScannerListener

擴充套件可以實現此介面,並且可以透過呼叫IBurpExtenderCallbacks.registerScannerListener() 註冊一個 Scanner 工具的監聽器。當 Scanner 工具掃描到新的問題時,會通知此監聽器。擴充套件透過註冊這樣的監聽器用於針對掃描問題自定義的分析和記錄。

此介面提供了以下方法:

#!java
// 當一個新的掃描問題被新增到 Burp 的Scanner工具的掃描結果中時,此方法將被 Burp 呼叫
void    newScanIssue(IScanIssue issue)

Demo code:

#!java  
package burp;

import java.io.PrintWriter;

public class BurpExtender implements IBurpExtender, IScannerListener{

    public PrintWriter stdout;
    public IExtensionHelpers helpers;

    @Override
    public void registerExtenderCallbacks(final IBurpExtenderCallbacks callbacks){

        this.stdout = new PrintWriter(callbacks.getStdout(), true);
        this.helpers = callbacks.getHelpers();
        callbacks.setExtensionName("Her0in");
        callbacks.registerScannerListener(this);
    }

    @Override
    public void newScanIssue(IScanIssue issue) {
        // TODO Auto-generated method stub
        stdout.println("掃描到新的問題 :");
        stdout.println("url => " + issue.getUrl());     
        stdout.println("詳情 => " + issue.getIssueDetail());  
    }
}

載入上述程式碼生成的外掛後,執行效果如下圖所示:

pic

IScanQueueItem

public interface IScanQueueItem

此介面被用於獲取在 Burp 的 Scanner 工具中啟用的掃描佇列裡的專案詳情。擴充套件可以透過呼叫IBurpExtenderCallbacks.doActiveScan() 獲得掃描佇列專案的引用。

#!java  
// 此方法可以取消掃描佇列專案中的掃描狀態
void    cancel()

// 獲取掃描佇列專案生成的問題的細節
IScanIssue[]    getIssues()

// 此方法返回掃描佇列專案發生錯誤時的網路錯誤號
int getNumErrors()

// 此方法返回掃描佇列專案的攻擊插入點的數量
int getNumInsertionPoints()

// 此方法返回掃描佇列專案已經發出的請求的數量
int getNumRequests()

// 此方法返回掃描佇列專案中已經完成掃描的百分比
byte    getPercentageComplete()

// 此方法返回掃描佇列專案的狀態描述
java.lang.String    getStatus()

IScopeChangeListener

public interface IScopeChangeListener

擴充套件可以實現此介面並且可以透過呼叫IBurpExtenderCallbacks.registerScopeChangeListener()註冊一個 Target 工具下的 scope 變化監聽器。當 Burp 的 Target 工具下的 scope 發生變化時,將會通知此介面。

此介面提供了以下方法:

#!java
// 當 Burp 的 Target 工具下的 scope 發生變化時,將會呼叫此方法。
void    scopeChanged()

Demo code:

#!java  
package burp;

import java.io.PrintWriter;

public class BurpExtender implements IBurpExtender, IScopeChangeListener{

    public PrintWriter stdout;
    public IExtensionHelpers helpers;

    @Override
    public void registerExtenderCallbacks(final IBurpExtenderCallbacks callbacks){

        this.stdout = new PrintWriter(callbacks.getStdout(), true);
        this.helpers = callbacks.getHelpers();
        callbacks.setExtensionName("Her0in");
        callbacks.registerScopeChangeListener(this);
    }

    @Override
    public void scopeChanged() {
        // 手動新增或右鍵選單新增目標到 scope 列表,就會執行此方法
        stdout.println("scope 有變化!");
    }
}

載入上述程式碼生成的外掛後,執行效果如下圖所示:

pic

ISessionHandlingAction

public interface ISessionHandlingAction

擴充套件可以實現此方法並且可以透過呼叫IBurpExtenderCallbacks.registerSessionHandlingAction() 註冊一個自定義的會話操作動作。每一個已註冊的會話操作動作在會話操作規則的UI中都是可用的,並且使用者可以選擇其中一個作為會話操作行為的規則。使用者可以選擇直接呼叫操作,也可以按照宏定義呼叫操作。

此介面呼叫瞭如下方法:

#!java      
// 此方法由 Burp 呼叫獲取會話操作行為的名稱
java.lang.String    getActionName()

// 當會話操作行為被執行時會呼叫此方法
void    performAction(IHttpRequestResponse currentRequest, IHttpRequestResponse[] macroItems)

ITab

public interface ITab

此介面用於自定義的標籤頁,呼叫IBurpExtenderCallbacks.addSuiteTab()方法可以在 Burp 的 UI 中顯示自定義的標籤頁。

#!java  
// 此方法用於獲取自定義標籤的標題文字
java.lang.String    getTabCaption()

// Burp 呼叫此方法獲取自定義標籤頁顯示的元件
java.awt.Component  getUiComponent()

Demo code:

#!java
package burp;

import java.awt.Component;
import java.io.PrintWriter;

import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class BurpExtender implements IBurpExtender, ITab{

    public PrintWriter stdout;
    public IExtensionHelpers helpers;

    private JPanel jPanel1;
    private JButton jButton1;

    @Override
    public void registerExtenderCallbacks(final IBurpExtenderCallbacks callbacks){

        this.stdout = new PrintWriter(callbacks.getStdout(), true);
        this.helpers = callbacks.getHelpers();
        callbacks.setExtensionName("Her0in");
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                 //建立一個 JPanel
                 jPanel1 = new JPanel();
                 jButton1 = new JButton("點我");

                 // 將按鈕新增到皮膚中
                 jPanel1.add(jButton1);

                 //自定義的 UI 元件
                 callbacks.customizeUiComponent(jPanel1);
                 //將自定義的標籤頁新增到Burp UI 中
                 callbacks.addSuiteTab(BurpExtender.this);
            }
       });
    }

    @Override
    public String getTabCaption() {
        // 返回自定義標籤頁的標題
        return "Her0in";
    }

    @Override
    public Component getUiComponent() {
        // 返回自定義標籤頁中的皮膚的元件物件
        return jPanel1;
    }
}

載入上述程式碼生成的外掛後,執行效果如下圖所示:

pic

ITempFile

public interface ITempFile

此介面用於操作呼叫IBurpExtenderCallbacks.saveToTempFile()建立的臨時檔案。

#!java
// 刪除臨時檔案,此方法已過時
void    delete()

// 此方法用於獲取臨時檔案內容的緩衝區
byte[]  getBuffer()

ITextEditor

public interface ITextEditor

此介面用於擴充套件 Burp 的 原始文字編輯器,擴充套件透過呼叫IBurpExtenderCallbacks.createTextEditor() 獲得一個此介面的例項。

#!java  
// 此方法返回用於擴充套件新增自定義的編輯器的 UI 元件
java.awt.Component  getComponent()

// 此方法用於獲取當前的已選擇的文字
byte[]  getSelectedText()

// 此方法用於獲取使用者在已顯示的文字中選擇的邊界
int[]   getSelectionBounds()

// 此方法用於獲取當前已顯示的文字
byte[]  getText()

// 此方法用於指示使用者是否對編輯器的內容做了修改
boolean isTextModified()

// 此方法用於決定當前的編輯器是否可編輯
void    setEditable(boolean editable)

// 此方法用於更新編輯器下邊的搜尋框的搜尋表示式
void    setSearchExpression(java.lang.String expression)

// 此方法用於更新編輯器中當前已顯示的文字
void    setText(byte[] text)

Demo code:

請見 IMessageEditorTabFactory 的例項程式碼。
本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!

相關文章