<dd id="sga4y"><optgroup id="sga4y"></optgroup></dd>
<nav id="sga4y"><code id="sga4y"></code></nav>
  • <optgroup id="sga4y"></optgroup>

    原文地址:http://drops.wooyun.org/tools/14685

    0x00 前言


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

    《BurpSuite 插件開發指南》系列文章如下:

    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 的實例代碼。
    

    97av