小紅書app之shield 逆向


1.通過Jni_load 找到函數偏移

​ 定位到jni_load 函數,跟蹤函數sub_A654。如圖

其中sub_2e1f4 是對app的簽名進行驗證,直接nop,sub_736B0 是通過jni調用java的okhttp類的一些方法。sub_7306 是動態注冊的函數。

找到地址off_8E0D0,各個函數地址如圖所示。

2、分析各個函數的作用

2.1 initializeNative函數

initializeNative函數是對jni調用java方法的一些類進行初始化操作,建議對變量進行改名,類用c開頭,方法用m開頭便於后續分析。

2.2 initialize 函數

initialize 函數是從s.xml文件中讀取key為main_hmac的值value。

把讀取的value使用sub_AAAC函數進行傳參, sub_AAAC 函數的主要功能是對value和device_id 進行aes得到一個key,把key存入ptr + 0x28C 處, 如果sub_AAAC返回值為1,則使用新版的shield算法,反之則使用舊版的s1-s12算法。

2.3 intercept函數

intercept 是shield算法的邏輯部分

通過ptr+650的值來判斷使用哪種算法,sub_ABB8為新版,sub_AD14為舊版。

sub_1fbb0函數對sub_AAAC 函數的key進行異或0x36和0x5c,這里大膽猜測shield使用的是hmacmd5算法,sub_1fbb0是對key進行初始化,sub_1fc52是對url進行md5,sub_1fc7e是對前面兩步進行收尾工作計算出真正的shield。

像這種a1+12 是一個函數指針我是通過動態調試得到函數地址。使用的是魔改的md5。

3、算法還原

3.1 算法流程

1、result = md5((key ^ 0x36) + param)

2、shield = md5((key ^ 0x5c) + result)

aes部分的算法暫時沒進行還原,md5的部分使用c語言進行了還原,本來想移植到python的,但是python沒有無符號等數據類型,每一次操作都要進行&0xFFFFFFFF,心態有點爆炸,所以編譯了一個shield.so供python調用,最終完成圖如下:

md5的參數為(urlpath+xy-common-params+xy-platform-info) (ps:urlpath 需要去掉? 比如urlpath為: /api/sns/v6/homefeed?oid=homefeed_recommend,傳入的為/api/sns/v6/homefeedoid=homefeed_recommend)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM