一、抓包分析
二、用jadx-gui打開
打開某觀察app
搜索關鍵字sign
加密參數在so層 wtf文件中
結合抓包數據,以及分析sign的前后代碼發現:參數str 為空,參數token為空,參數3為時間戳。
下面開始so的分析,看看so中進行了哪些加密操作。
首先解壓apk,拖出wtf.so
將so文件拖入IDA,第一步既是查看Exports,由於JNI是靜態注冊的,所以很容易就定位到了加密函數:
F5轉換為偽C代碼,整理好代碼,進行so文件的初步靜態分析。由於代碼還算清晰,比較容易定位到了加密函數,初步判斷是一個MD5
一路跟下去,發現此函數具有典型的MD5加密特征
加密特征方法:https://www.52pojie.cn/thread-937282-1-1.html
到這里基本明白,傳入的數據在SO中進行了MD5加密。所以接下來動態調試看看此加密函數的三個參數分別是什么。
一定要 新開啟一個 IDA
為嘛要新開啟一個IDA呢,因為動態調試狀態下,IDA會簡化很多解析,讓代碼看起來更加難懂。比較方便的是一個IDA做靜態分析,一個IDA做動態調試,可以互相參考。
開啟IDA的debugger,選擇安卓遠程調試 Attach(debugger——>Attach——>Remote ARMLinux/Android debugger)將host設置為本地,端口默認
再次點擊OK后等待附加進程完畢。進程附加完畢后,F9讓程序繼續運行起來,處於Debugger狀態
接下來查康Module選項卡,找到要分析的so文件
雙擊跟入,一直到要調試的函數匯編代碼處。F5轉換成偽C代碼,
這里可以看出來動態調試的時候,和靜態分析時看到的代碼差別很大。IDA在動態調試狀態下不會將所有東西解析出來
結合另外一個IDA進行的靜態分析,確定需要在哪個BLX下斷點.雙擊進入后,按C,將代碼解析成匯編代碼。
可以看到被識別出來的函數名。(靜態分析的時候能識別出來的就能顯示出來)將函數名重命名,方便后繼使用
依據靜態分析得知,我們需要得到此函數的三個參數,所以分別是R0,R1,R2寄存器的值。
查看寄存器的值,分別得出了參數1,參數2的值。
R1(即參數2)的值:2D ,(十六進制)轉換成十進制為45,與參數1長度相符
接下去分析r0值的構成:
由於在java層靜態分析中得知,傳入so層加密的三個參數中,前兩個參數是空,只有第三個參數有值,是時間戳。
而so層的加密函數中,r0的值卻是一串字符串+傳進來的時間戳組成,必須找到這個字符串的來源。
加密函數中這個getAppSign很可疑。這是通過回調java層函數獲得appsign,初步猜測,由於我們並沒有修改過app,所以這個函數獲得的appsign基本可以確定是正確的,而也是固定的
可以直接hook (shut)方法
三、返回結果
import hashlib
s= "0093CB6721DAF15D31CFBC9BBE3A2B79"+timestamp
m = hashlib.md5(s.encode())
sign = (m.hexdigest()).upper()
print(sign)