1. 程式人生 > >[原創]基於frida的脫殼工具

[原創]基於frida的脫殼工具

frida-unpack

基於Frida的脫殼工具

0x0 frida環境搭建

frida環境搭建,參考frida官網:frida

0x2 原理說明

利用frida hook libart.so中的OpenMemory方法,拿到記憶體中dex的地址,計算出dex檔案的大小,從記憶體中將dex匯出。
ps:檢視OpenMemory的匯出名稱,可以將手機中的libart.so通過adb pull命令匯出到電腦,然後利用:
nm libart.so |grep OpenMemory命令來檢視到出名。

0x3 指令碼用法

  • 在手機上啟動frida server端
  • 執行脫殼指令碼

    1

    ./inject.sh 要脫殼的應用的包名 OpenMemory.js

  • 脫殼後的dex儲存在/data/data/應用包名/目錄下

0x4 指令碼測試環境

此指令碼在以下環境測試通過

  • android os: 7.1.2 32bit (64位可能要改OpenMemory的簽名)
  • legu: libshella-2.8.so
  • 360: libjiagu.so

0x5 參考連結

0x06 python指令碼支援

python frida_unpack.py 應用包名

0x07 相關技巧

  • 利用c++filt命令還原C++ name managling之後的函式名

    1

    2

    3

    4

    c++filt _ZN3art7DexFile10OpenMemoryEPKhjRKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEjPNS_6MemMapEPKNS_10OatDexFileEPS9_

    輸出:

    art::DexFile::OpenMemory(unsigned char const*, unsigned int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned 

    int, art::MemMap*, art::OatDexFile const*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*)

原始碼見github連結:https://github.com/dstmath/frida-unpack