當前位置:
首頁 > 最新 > 編寫自己的JEB2插件

編寫自己的JEB2插件

背景

JEB2發布有段時間了,相比於JEB1來說功能強大了很多,但是API也發生了巨大的變化,不僅是定義上也包括架構上,這給我們移植或者是新編寫插件帶來了一定不便, 目前也還沒看到詳細一些的API分析教程。本文以一個具體的應用分析為例,解釋如何編寫一個JEB2中處理混淆應用的插件,來實現自動識別和重命名。

案例

我們的樣例APK是一個採用了比較劍走偏鋒混淆的東西,其中絕大部分類名、函數名、field名都被替換成了包含lIi的字元串,如下截圖所示:

這種給人工分析時追蹤函數調用帶來了不便,因為這些字元串字母長的都比較像,所以我們需要寫一個JEB腳本來自動化重命名這些item。我們的邏輯如下:

對於類:遞歸尋找它的父類和實現的介面。如果父類和介面包含了有意義的名字:例如SDK類Activity、不能混淆的類名MainActivity,以此為基礎進行重命名

對於Field:根據該Field的類型,重命名其名字

對於函數:根據該函數的參數類型,重命名其名字

JEB2的API架構

由於JEB2試圖成為像IDA那樣的universal disassembler,其架構多了很多包裝層。對於APK分析來說,關鍵的部分關係如下所示:

IProjectUnit -> ICodeUnit -> IJavaSourceUnit

IProjectUnit代表了整個workspace,一般我們只會使用project[0]

ICodeUnit則代表了一個project中所有的可解析部分,如下面我們提到的,因為JEB2為各種架構都提供了統一包裝層,ICodeUnit不再僅僅是dex或者jar,而還會包括了libraries中的各種native Library。

其中項是對應的dex體. 其對應的ICodeUnit代表了整個dex, 已經提供了基本的類型信息,例如Class, Type, Method, Field, Package 使用者可以通過ICodeUnit.getClass/getMethod/getField獲取到對應的ICodeClass/ICodeMethod/ICodeField. 但是這個層級的unit並沒有提供class hierchy信息和具體的源代碼AST信息,故我們還需要IJavaSourceUnit.

IJavaSourceUnit代表的是執行過反編譯之後生成的Java源代碼體,提供了更加豐富和細節的Java代碼信息供使用. 其對應的AST元素為IJavaClass/IJavaMethod等等. 通過decompiler.decompile(icodeclass.getAddress())獲取IJavaSourceUnit, 通過IJavaSourceUnit.getClassElement獲取IJavaClass.

需要強調的是, ICodeUnit對應的是整個dex, 而IJavaSourceUnit對應的是單個反編譯出的類.

自訂操作

在JEB2中,用戶操作(自定義操作)被統一包裝在ActionContext類之下,類似於transaction的形勢.API使用者提交各種ActionContext,並檢查返回值是否成功.一個典型的重命名操作如下:

值的注意的是,這裡的clz對象均為ICodeUnit調用getClass所查詢出的ICodeClass類,而不是IJavaSourceUnit對應的IJavaClass. ActionContext作用的對象也是代表整個dex的ICodeUnit.

除了重命名操作之外, ActionContext還包括了COMMENT, CONVERT, CREATE_PACKAGE, DELETE, MOVE_TO_PACKAGE, QUERY_OVERRIDES, QUERY_TYPE_HIER, QUERY_XREFS, RENAME等操作, 其實就是我們在UI中右鍵所能執行的操作. 讀者可能要問, 像QUEYR_TYPE_HIER這種操作, 通過IJavaSource解析AST不是也可以做? 我認為確實是這樣, 這裡可能還是為了給不同語言提供一個統一的抽象介面. 當然QUERY_XREFS顧名思義是獲取到對應的引用, 這方便我們做一些callgraph的查詢.

案例解析

如文章開頭所示, 我們的目的是根據被混淆item的基類信息和類型信息/參數信息對其重命名. 主要邏輯如下:

例如, class IiIiIiIi是繼承於class iIiIiIiI, 而iIiIiIiI又繼承於Activity/實現了onClickListener, 那麼我們就可以使用Activity/onClickListener作為基準重命名兩個被混淆的類. 這裡的關鍵在於一個遞歸獲取基類的函數, 如下所示:

相對來講, method和field的重命名就簡單了很多, 如附代碼所示, 在此不再贅述.

這裡還有一個小細節, 因為需要操作的類比較多, 我們將插件定義為後台運行, 這樣可以不阻塞UI, 同時獲得更好的log效果.

重命名後的效果如下:可以看到我們恢復出了較多可讀信息. 完整代碼: https://gist.github.com/flankerhqd/ca92b42f1f796763e5d1f8cd73247a30

總結

JEB2的API相對於JEB1組織層次更多, 也就沒那麼直觀. 但有了初步了解之後, 也可以很快掌握使用方法. 測試版本: JEB2 2.3.4

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 先知安全技術社區 的精彩文章:

Shellcode另類使用方式
甲方工作雜談
後滲透測試神器Empire詳解

TAG:先知安全技術社區 |