您的位置: 綿陽資訊網主頁 > 家居 > 正文 >

爬蟲工程師的unidbg入門教程

發布時間:2020-03-23 08:29:39   來源:互聯網   閱讀:-
  • 現在很多的app使用了so加密,以后會越來越多。爬蟲工程師可能會直接逆向app,看java代碼,完成java層的算法破解,但是如果遇到so該怎么辦呢?可能你會直接破解so,但是真的會有很多爬蟲工程師會去并且會破解so嗎?有時候我們可以不用破解so,利用很多大佬寫好的輪子即可完成so的調用。
  • 說到調用,就有很多方法了,比如用frida的rpc、xposed+andserver、再者就是unicorn+web框架等等,今天要說的并不是這些,而是unidbg,這框架有什么好的地方呢?看看介紹。
  • 介紹(來自逸飛)

    unidbg 是一個基于 unicorn 的逆向工具,可以黑盒調用安卓和 iOS 中的 so 文件。unidbg 是一個標準的 java 項目。

    由于現在的大多數 app 把簽名算法已經放到了 so 文件中,所以要想破解簽名算法,必須能夠破解 so 文件。但是我們知道,C++ 的逆向遠比 Java 的逆向要難得多了,所以好多時候是沒法破解的,那么這個時候還可以采用 hook 的方法,直接讀取程序中算出來的簽名,但是這樣的話,需要實際運行這個應用,需要模擬器或者真機,效率又不是很高。

    unidbg 就是一個很巧妙地解決方案,他不需要直接運行 app,也無需逆向 so 文件,而是通過在 app 中找到對應的 JNI 接口,然后用 unicorn 引擎直接執行這個 so 文件,所以效率也比較高。

    • 這里重要的是目前利用unidbg+springboot做成了web服務。食用案例來自JXU2QkQyYXBwJTIwdjQuMTYuMA==
      對于該app而言,是非常適合入門的一個app,未加固、算法簡單、很容易找到so的jni。
      先去凱神的github上下載https://github.com/zhkl0228/unidbg
      下載完畢用idea打開,等待maven下載完畢。我這里已經創建好du的文件。


    上個代碼看著比較方便,代碼中有很多注釋

    public class du extends AbstractJni {    //ARM模擬器    private final ARMEmulator emulator;    //vm    private final VM vm;    //載入的模塊    private final Module module;    private final DvmClass TTEncryptUtils;    //初始化    public du() throws IOException {        //創建app進程,這里其實可以不用寫的,我這里是隨便寫的,使用app本身的進程就可以繞過進程檢測        emulator = new AndroidARMEmulator("com.du.du");        Memory memory = emulator.getMemory();        //作者支持19和23兩個sdk        memory.setLibraryResolver(new AndroidResolver(23));        memory.setCallInitFunction();        //創建DalvikVM,利用apk本身,可以為null        //如果用apk文件加載so的話,會自動處理簽名方面的jni,具體可看AbstractJni,利用apk加載的好處,//        vm = emulator.createDalvikVM(new File("src/test/resources/du/du4160.apk"));我這里沒有用到apk,主要是沒有檢測其他因素。        vm = emulator.createDalvikVM(null);        //加載so,使用armv8-64速度會快很多,這里是so的文件路徑,其實也可以利用apk自身的。        DalvikModule dm = vm.loadLibrary(new File("src/test/resources/du/libJNIEncrypt.so"), false);        //調用jni        dm.callJNI_OnLoad(emulator);        module = dm.getModule();        //加載so的那個類        TTEncryptUtils = vm.resolveClass("com/duapp/aesjni/AESEncrypt");    }    //關閉模擬器    private void destroy() throws IOException {        emulator.close();        System.out.println("destroy");    }    public static void main(String[] args) throws IOException {        du t = new du();        t.encodeByte();        t.destroy();    }    private String encodeByte() {        //調試        // 這里還支持gdb調試,        //emulator.attach(DebuggerType.GDB_SERVER);        //附加調試器//        emulator.attach(DebuggerType.SIMPLE);//        emulator.traceCode();        //這里是打斷點,原地址0x00005028->新地址0x40005028 新地址需要改成0x4 //        emulator.attach().addBreakPoint(null, 0x40001188);//encode地址//        emulator.attach().addBreakPoint(null, 0x40000D10);        Number ret = TTEncryptUtils.callStaticJniMethod(emulator, "getByteValues()Ljava/lang/String;");        long hash = ret.intValue() & 0xffffffffL;        StringObject st1 = vm.getObject(hash);        //*這里要處理下字符串        String byteString = st1.getValue();        StringBuilder builder = new StringBuilder(byteString.length());        for (int i = 0; i < byteString.length(); i++) {            if (byteString.charAt(i) == '0') {                builder.append('1');            } else {                builder.append('0');            }        }        //獲取encodeByte地址        ret = TTEncryptUtils.callStaticJniMethod(emulator, "encodeByte(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;",                //傳參,這里需要兩個字符串,所以就傳入兩個參數                vm.addLocalObject(new StringObject(vm, "要加密的值")),                vm.addLocalObject(new StringObject(vm, builder.toString())));        //ret 返回的是地址,        hash = ret.intValue() & 0xffffffffL;        //獲得其值        StringObject str = vm.getObject(hash);        System.out.println(str.getValue());        return str.getValue();    }}

    上邊代碼有jni的類是哪一個需要知道,就是下面這個類,這個其實是和加載so有關系的。

    TTEncryptUtils = vm.resolveClass("com/*/aesjni/AESEncrypt");
    我們需要逆向app,這里不細說如何在app中尋找加載so的類。如下圖,encodeByte是該app調用native層加密的入口,loadLibrary是java加載so的方法,這個類就是上述代碼中填寫的。


    然后再看"encodeByte(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"這里,這是smali寫法,不補基礎,后面跟上需要傳的參數,
    getByteValues 這個方法是毒獲取的一個01字符串,并且在java層進行了處理,然后再傳進encodeByte里面,encodeByte這個方法最后獲取的其實并不是最終需要的,需要md5才是最后的newSign??梢则炞C一下下。


    測試結果通過。

    最后

    啟動java文件時候注意這個改成自己的平臺?。?!

    VM options: -Djava.library.path=prebuilt/os -Djna.library.path=prebuilt/osWhere os may: linux64, win32, win64, osx64

    最后,小編想說:我是一名python開發工程師,整理了一套最新的python系統學習教程,想要這些資料的可以關注私信小編“01”即可,希望能對你有所幫助。


    推薦閱讀:蘋果xr好還是x好

    (正文已結束)

    免責聲明及提醒:此文內容為本網所轉載企業宣傳資訊,該相關信息僅為宣傳及傳遞更多信息之目的,不代表本網站觀點,文章真實性請瀏覽者慎重核實!任何投資加盟均有風險,提醒廣大民眾投資需謹慎!

    關于我們 - 聯系我們 - 老版地圖 - 網站地圖 - 版權聲明
    Copyright.2002-2020  綿陽資訊網 版權所有 本網拒絕一切非法行為 歡迎監督舉報 如有錯誤信息 歡迎糾正
    开暖气公司能赚钱吗 广东十一选五内部计划 黑龙江十一选五论坛 大乐透开奖结果查询 湖南幸运赛车结果 黑龙江22选5奖池74期 2019幸运赛车走势图 下载天天红包新版本 股票入门k线图解 黑龙江11选5五码走势图 广西快三形势走势图