正如之前所提到的開法者可以透過 NDK 在APP撰寫C++ 程式碼實現 更好的效能 也會增加逆向的難度 當這些被編譯好後會被打包成.so 檔案
這些.so 檔案可能會包含 hardCode 資料或是混淆程式 漏洞程式碼 等等 也是惡意程式分析會去看的重要檔案
Jadx 是沒辦法翻編譯 .so 檔案 只能透過 IDA Pro, Ghidra 進行反編譯
先用Jadx 拆開 發現API 端點 並且Key 會放在參數上
雙擊 getAPIKey()
getAPIkey 是native 方法 看起來像JNI 去調用myapp .so 檔案
我們可以先簡單 透過直接 讀strings方式來尋找
apktool d myapp.apk
收尋API key (有時候如果直接找apk 是會找不到 可以用API 可能的格式是去找
strings lib/x86_64/libmyapp.so | grep -e "api" //失敗
strings lib/x86_64/libmyapp.so | grep -E "[a-zA-Z0-9_-]{50,}"
匹配 符合前述條件a-zA-Z0-9字符 至少50 次 沒有上限{50,}
Ghidra 是由NASA 開發反編譯工具 適合我們對.so 進行反編譯 找尋敏感資訊或是防禦程式
安裝
apt install ghidra
把ghidra 打開後 先new 一個project
創好project 後 我們需要匯入 Share Object 到我們的Project中
匯入 /app/lib/x86_64/libmyapp.so
雙擊剛匯入的檔案 進行反編譯
預期會像這樣
Ghidra 基本視窗資訊
Symbol Tree 符號樹 這裡能快樹知道一個Program 的結構 包含Functions Variables Labels 等等
幫助我們可以快速查看我們有興趣的地方
Listing 這裡主要是反組譯部分 把biniary 轉成可讀組語
Decompiler
Decompiler 會把組語轉換成 人類可讀C/C++ 代碼 增加可讀性
接下來知道 基本ghidra 操作後 我們可以開始來分析我們的.so 檔案 去查看有沒有有趣的function
其中有一個Get API 的function 透過名稱猜撤 會回傳可能會回傳APK key
local_18 這裡可能是APK Key 但他會被傳進去 解混淆程式中 所以local_18 這裡可能是被混淆的API KEY
我猜local_40 就是指local_18 陣列位址進去 就是在deobfucate 前local_18 被Assign 到Local_40 但反編譯後看不出來
可以分析一下Deobfucator 方法
其中可以觀察一下 RSI 這個在呼叫慣例中會傳遞 函式的參數進來 可能就是API key
並且有 SSO (Small String Optimization) 檢查 RSI 的值 如果 RSI 標示符等於0 表示 LSB(最低位),就用內部 buffer 反之就透過heap 來動態分配
當uVar2 有就是string index 不等於0 就去遍立pbVar3 做~(Not 運算)存到 param_1
我們已經知道解混淆方式 我們可以嘗試還原 API key
local_18[2] = 0xa8b2aacfbd978b94;
local_18[3] = 0xac8ca7cb8f8590b9;
*local_18 = 0x959c899bae98c9b3;
local_18[1] = 0xadca9ea586c7b1cd;
由於x86_64 會從低位置開始放 例如 meow local[0] = w, local[1] = e等等
API key 實際樣子(混淆/HEX Strings)
local_18 local_18[1]
959c899bae98c9b3 adca9ea586c7b1cd a8b2aacfbd978b94 ac8ca7cb8f8590b9
b3c998ae9b899c95 cdb1c786a59ecaad 948b97bdcfaab2a8 b990858fcba78cac
反轉Hex bit 並轉回ASCLL
https://toolslick.com/math/bitwise/not-calculator
L6gQdvcj2N8yZa5RkthB0UMWFozp4XsS
我就成功分析完Native 並把成功混淆API Key還原回來
以上是我是不可能一直學Android 主題第30天 其實Android 還有很多很深入的地方 像是SSL pin Bypass 或是惡意程式分析 靜態分析Patch也還沒講完 寫這個還蠻開心 很開心有完成30天 下次可以挑戰180 天 如果有的話 哈哈