Oracle:安卓反混淆工具
Oracle:基于Dalvik 反混淆的一種模式,它使用了有限執(zhí)行來提高語義分析。此外,這個靈感激發(fā)了另一個安卓反混淆工具:Simplify。
之前:
之后:
比特幣:133bmAUshC5VxntCcusWJdT8Sq3BFsaGce
安裝:
步驟一. 安裝Smali / Baksmali
我確定如果你是安卓逆向精英,那你的路徑中肯定已經有smali和baksmali了。
步驟二. 安裝安卓 SDK / ADB
確保你的路徑中有adb。
步驟三. 安裝Gem
gem install dex-oracle
或者,你也可以選擇使用這種方式獲得源:
git clone https://github.com/CalebFenton/dex-oracle.git
cd dex-oracle
gem install bundler
bundle install
步驟四. 連接設備或者模擬器
你必須有一個模擬器運行或者一個接入Oracle能夠工作的設備。
Oracle需要在一個live的安卓系統(tǒng)上執(zhí)行方法。你可以選擇真正的安卓設備,也可以選擇模擬器(推薦)。如果你選擇了真正的安卓設備,確保你不介意在上面運行潛在的惡意代碼。
如果你更喜歡使用模擬器,并且已經安裝了Android SDK,你可以創(chuàng)建并啟動模擬器,如圖:
android avd
用法
Usage: dex-oracle [opts] <APK / DEX / Smali Directory> -h, --help 顯示屏幕 -s ANDROID_SERIAL, 執(zhí)行驅動的設備ID, default="" --specific-device -t, --timeout N ADB 命令執(zhí)行超時, default="120" -i, --include PATTERN 僅僅是優(yōu)化方法和類匹配模式, e.g. Ldune;->melange\(\)V -e, --exclude PATTERN 從優(yōu)化中排除這些類型,包括重寫 --disable-plugins STRING[,STRING]* 禁用插件, e.g. stringdecryptor,unreflector --list-plugins 列出可用插件 -v, --verbose 詳細內容 -V, --vverbose 非常詳細的內容
舉個例子,對于在一個類里面的唯一的deobfuscate方法調用Lcom/android/system/admin/CCOIoll,而不是一個APK調用obad.apk;
dex-oracle -i com/android/system/admin/CCOIoll obad.apk
如何運行
Oracle把Android app(APK), Dalvik可執(zhí)行文件(DEX)和Smali文件作為輸入源。第一,如果輸入源是一個APK或者DEX,它會被分解成很多個Smali文件。然后,這個Smali文件會被傳遞給很多執(zhí)行粉絲和修改的插件。插件搜索能夠被轉化為更易讀的模式。為了了解代碼做了什么工作,一些Dalvik方法真的被執(zhí)行了,然后我們收集了輸出。這樣,一些方法調用可以被替換為常量。之后,所有的Smali文件都被更新了。最后,如果輸入是一個APK或者一個DEX文件,被修改的Smali文件會被重新編譯,一個已更新的APK或者DEX就被創(chuàng)建了。
方法執(zhí)行是被驅動執(zhí)行的。輸入APK, DEX或者Smali都被和驅動混合進了一個使用dexmerge的DEX,然后被壓入了一個安卓設備或者安卓模擬器。無論插件是否請求,Oracle之后都會發(fā)送方法執(zhí)行信息到驅動。驅動程序在自己的DEX使用Oracle提供的參數使用Java反射來執(zhí)行方法,結果返回任何輸出或異常。這種方法對于很多字符串解密方法都非常有用,通常情況下,使用加密字符串或者一些one limitation都是執(zhí)行是限制的靜態(tài)方法。
攻擊
1. 創(chuàng)建自己的插件
這里有三個帶有Oracle的插件:
Undexguard – 刪除某些特定類型的Dexguard混淆
Unreflector – 刪除某些Java反射
String Decryptor - 簡單的能夠刪除一些常見加密字符串的插件
如果你遇到一類新的混淆,它可能會用Oracle反混淆。查看Smali并找出是否代碼可以這樣:
1. 重新排列
2. 執(zhí)行一些靜態(tài)方法理解
以上任何一種情況,你都應該嘗試并寫出你自己的插件。下面的四個步驟教你如何創(chuàng)建自己的插件:
1. 確定Smali模式
2. 搞清楚如何簡化模式
3. 搞清楚如何與驅動交互并調用方法
4. 搞清楚如何直接應用修改
這里包含的插件應該是理解步驟3、4的很好的指導。驅動被設計幫助步驟2 。
當然,我們非常歡迎你分享任何你遇到的混淆。
更新驅動程序
首先,確保DX在你的路徑上。這是Android SDK的一部分,但是它可能不在你的路徑上,除非你是硬核。
驅動程序文件夾是一個由Gradle管理的Java項目。將它導入Eclipse,IntelliJ等,然后進行修改。為了完成驅動的更新,運行./update_driver。這將重建驅動并轉換輸入JAR進入一個DEX。
更多信息