對好搜小說app雜湊演算法的一次逆向
我用的好搜小說版本是1.8.183,需要測試的請自行下載
點選一個小說,抓包之,在androidKill中搜索關鍵字encode_sign
開啟關鍵字所在的類;
進去檢視,在靜態程式碼塊載入了個動態連結庫,核心的加密演算法寫在了native層
上IDA,進行動態除錯,將斷點下在urlEncodeFromJNI這個方法處:
然後手機上點選一部小說,執行到strlen的時候,將請求的連結傳了進來
請求的連結長度為87
再次傳進來一個引數,並計算其長度,這個引數是當前的時間戳
將0x97個記憶體長度初試化為0
將時間戳連結到請求連結後邊
連結以後的結果
我們來看看連續三次的連結,然後記下這個緩衝區的地址:
繼續申請長度為0x58的記憶體,並將其填充為0
呼叫md5Init初始化md5計算需要的資料結構
計算需要進行md5的資料段的長度
開始計算md5,在這裡的md5Update函式中,傳遞了緩衝區地址,要進行雜湊運算的地址,長度,這個長度等於拼接後的字串的長度
在放字串的後邊的記憶體地址,再申請一個16個位元組的空間,並用0初始化
呼叫MD5Final方法計算md5值
申請0x20個位元組的記憶體,並用0填充
sprintf這裡是個迴圈,執行和很多次,然後在剛才的緩衝區添加了一堆字串,md5final方法計算而來的值並不是字串,是一些十六進位制的字元,sprintf將這些字元按照assic碼轉換成人能夠看清的字元。總之md5+sprinf的值為在cmd5網站上計算的人眼能識別的字母,不瞭解可以等sprintf迴圈過去去看看給緩衝區寫的值,這些值和CMD5網站計算出來的一樣
將0x98長度的記憶體初始化為0
這個strcat將第一次拼接好的字串連線到第一次計算的md5的值後邊:
我們來看看連結完成後的結果
初始化0x58個位元組的記憶體,為MD5Init初始化用
將剛才初始化的記憶體的地址給md5Init
計算所有需要md5的字串長度(不明白一隻計算長度幹啥,也沒有仔細分析)
呼叫md5Update函式,這裡注意了:md5Update函式的第三個引數,為需要計算的字串的長度,這裡為0xa8,第一次我就是卡在這裡了,全部計算,當然結果不對
到這個sprintf又和上一個sprintf的作用一樣,不多解釋
最終的計算結果為連結中的encode_sign值
總結一下計算過程:
1.將請求連結中的部分欄位提取出來,加上時間戳,"eha",格式如下:
http://reader.m.so.com/app/index.php?m=Api&c=BookIntro&bid=3227333191007413155&uid=0dbc710c48e3d9ac0ebde
b116de326fe&ver=183&src=napp_sz1490169346086eha
2.計算步驟一中的雜湊得到雜湊結果
3.將步驟1中的字串拼接到步驟二中計算的雜湊結果後面
4.將步驟3中的字串取前168(0xA8)位進行雜湊,得到的結果就是連線中的
encode_sign欄位
實驗證明:
1.請求連結:
GET /app/index.php?m=Api&c=BookIntro&bid=3534808458083825046&uid=0dbc710c48e3d9ac0
ebdeb116de326fe&ver=183&src=napp_sz&encode_id=201703221490176124881&encode_sign=5
e9a514b1304f56b5a26f799e1d176df
2.製作成步驟1中的需要雜湊的部分:
http://reader.m.so.com/app/index.php?m=Api&c=BookIntro&bid=3534808458083825046&uid=0dbc710c48e3d9ac0ebdeb116de326fe&ver
=183&src=napp_sz1490176124881eha
3.計算這個字串的雜湊:
3.將這個雜湊放在第一次雜湊的字串前邊:
a6d06f88cecbc5ca342f6d204f15191ahttp://reader.m.so.com/app/index.php?m=Api&c=BookIntro&bid=3534808458083825046&uid=0dbc710c48e3d9ac0ebdeb116de326
fe&ver=183&src=napp_sz1490176124881eha
4.取前168位(上一步中紅色部分)做雜湊:
我們來對比一下原來請求連結中的雜湊:
分析正確