iT邦幫忙

2025 iThome 鐵人賽

DAY 30
0

正如之前所提到的開法者可以透過 NDK 在APP撰寫C++ 程式碼實現 更好的效能 也會增加逆向的難度 當這些被編譯好後會被打包成.so 檔案

這些.so 檔案可能會包含 hardCode 資料或是混淆程式 漏洞程式碼 等等 也是惡意程式分析會去看的重要檔案
Jadx 是沒辦法翻編譯 .so 檔案 只能透過 IDA Pro, Ghidra 進行反編譯

Strings 分析

先用Jadx 拆開 發現API 端點 並且Key 會放在參數上
https://ithelp.ithome.com.tw/upload/images/20251011/20149459chiRRQTDZr.jpg
雙擊 getAPIKey()
https://ithelp.ithome.com.tw/upload/images/20251011/20149459qiRZiNfo7B.jpg
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,}
https://ithelp.ithome.com.tw/upload/images/20251011/20149459990O8g7EzV.jpg

Ghidra

Ghidra 是由NASA 開發反編譯工具 適合我們對.so 進行反編譯 找尋敏感資訊或是防禦程式

安裝

apt install ghidra

把ghidra 打開後 先new 一個project
https://ithelp.ithome.com.tw/upload/images/20251014/20149459e9l6eKisk3.jpg
創好project 後 我們需要匯入 Share Object 到我們的Project中
https://ithelp.ithome.com.tw/upload/images/20251014/201494597nSzpsjZGQ.jpg

https://ithelp.ithome.com.tw/upload/images/20251014/201494590J3MpcQEvc.jpg

匯入 /app/lib/x86_64/libmyapp.so
https://ithelp.ithome.com.tw/upload/images/20251014/20149459sUTT3ol0Aq.jpg

雙擊剛匯入的檔案 進行反編譯
https://ithelp.ithome.com.tw/upload/images/20251014/20149459bTTRgWTDdB.jpg

預期會像這樣
https://ithelp.ithome.com.tw/upload/images/20251014/20149459ZDfC53M01N.jpg

Ghidra 基本視窗資訊
Symbol Tree 符號樹 這裡能快樹知道一個Program 的結構 包含Functions Variables Labels 等等
幫助我們可以快速查看我們有興趣的地方

https://ithelp.ithome.com.tw/upload/images/20251014/201494591Jq4pfx355.jpg

Listing 這裡主要是反組譯部分 把biniary 轉成可讀組語
https://ithelp.ithome.com.tw/upload/images/20251014/20149459mQ5WKTGcYk.jpg

Decompiler
Decompiler 會把組語轉換成 人類可讀C/C++ 代碼 增加可讀性
https://ithelp.ithome.com.tw/upload/images/20251014/20149459tQSR9ODdnD.jpg

Ghidra 混淆程式 分析

接下來知道 基本ghidra 操作後 我們可以開始來分析我們的.so 檔案 去查看有沒有有趣的function

其中有一個Get API 的function 透過名稱猜撤 會回傳可能會回傳APK key
https://ithelp.ithome.com.tw/upload/images/20251014/20149459WAmXSlLhVp.jpg

local_18 這裡可能是APK Key 但他會被傳進去 解混淆程式中 所以local_18 這裡可能是被混淆的API KEY
我猜local_40 就是指local_18 陣列位址進去 就是在deobfucate 前local_18 被Assign 到Local_40 但反編譯後看不出來
https://ithelp.ithome.com.tw/upload/images/20251014/20149459Ol1lOD6jdt.jpg

可以分析一下Deobfucator 方法
其中可以觀察一下 RSI 這個在呼叫慣例中會傳遞 函式的參數進來 可能就是API key
並且有 SSO (Small String Optimization) 檢查 RSI 的值 如果 RSI 標示符等於0 表示 LSB(最低位),就用內部 buffer 反之就透過heap 來動態分配

當uVar2 有就是string index 不等於0 就去遍立pbVar3 做~(Not 運算)存到 param_1

https://ithelp.ithome.com.tw/upload/images/20251014/20149459VaOjC2fdtP.jpg

我們已經知道解混淆方式 我們可以嘗試還原 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

https://ithelp.ithome.com.tw/upload/images/20251014/20149459TTNYgAynmo.jpg

L6gQdvcj2N8yZa5RkthB0UMWFozp4XsS

我就成功分析完Native 並把成功混淆API Key還原回來

總結

以上是我是不可能一直學Android 主題第30天 其實Android 還有很多很深入的地方 像是SSL pin Bypass 或是惡意程式分析 靜態分析Patch也還沒講完 寫這個還蠻開心 很開心有完成30天 下次可以挑戰180 天 如果有的話 哈哈


上一篇
DAY 29 靜態分析 反混淆 下
系列文
我是不可能一直學Android 絕對不會30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言