您好,登錄后才能下訂單哦!
本篇內容介紹了“java數據加密算法實例分析”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
今天有空分享一下抖音的加密算法,作為擁有龐大用戶量的APP,其通信協議加密的強度肯定是不弱的,關鍵算法被VM,只能動態分析去理解。我們通過抓包分析,請求的URL上帶有AS、CP兩個加密字段,這兩個字段是早期版本算法,后又陸續添加了MAS、X-GORGON算法。我們今天先對AS、CP兩個字段進行分析,這個只能通過動態調試去跟蹤加密過程。
首先我們通過工具調試定位到函數
- [IESAntiSpam testForAlert:msg:]
定位的詳細過程忽略……,進入繼續調試后發現調用SUB_102E3345函數進行加密排序
1.整理分析流程
1.時間戳轉十六進制 2.將時間戳排序倆次, a1 v3 是排序key sprintf(byte_102323F30, "%08x", a1); sprintf(byte_102323F3A, "%08x", v3); 3.將url參數用MD5加密一次或倆次根據時間戳&運算 4.將第一次排序結果寫入前16位地址加一寫入(從1插入),隔一位插入,前邊拼a1 5.將第二次排序結果寫入后16位(從0插入)后邊拼e1
2.結果排序
a1d5b43se234dccea7 456dcd5s2320cf3e1 &cp=456fcd5s2320cfs3e1&as=a1d5b43se234dccea7 拼接完成后就可以請求了
后期版本添加了mas算法和最新的X-gorgon算法,目前最新系列版本算法如果需要了解的話可以交流。
3.流程詳述
cdn.nlark.com/yuque/0/2020/png/97322/1606705772468-a9630ae1-df91-45b8-8905-e6ac160a3cac.png?x-oss-process=image/resize,w_1500">
那么我們就能夠更加確信header里的x-gorgon對它進行了一次簽名,所以我們直接jadx上手閱讀一波反編譯后的代碼,這里我直接搜索了x-gorgon關鍵字,列出了以下結果:
那么我們就能夠更加確信header里的x-gorgon對它進行了一次簽名,所以我們直接jadx上手閱讀一波反編譯后的代碼,這里我直接搜索了x-gorgon關鍵字,列出了以下結果:
這里我選擇了hashMap.put("X-Gorgon", a3);這一行,跳轉進去我們來分析一下它的代碼
這里我們看到有一個它的值是來自a3,a3則是通過String a3 = a.a(com.ss.sys.ces.a.leviathan(i, currentTimeMillis, a.a(a2 + str4 + str5 + str6)));這行代碼進行獲取到的結果,我們看到它傳了4個參數,我們來仔細看一下這4個參數具體都是什么內容:
a2來源:
String b2 = tt.d(str);
d.a(b2);
str它就是該方法傳進來的參數,我們后面可以通過hook方式來獲取它的具體內容,而它會執行tt.d()、d.a() 進行2次操作,我們對其tt.d()跟進去
我們看到它對這個字符串進行了取 ? 和 # 中間值,懷疑是url,如果是url證明它只是取了url后面的參數,那么繼續看它的下一個方法:d.a()
我們看到這里就是進行了MD5簽名取值,那么a2分析到此結束,我們繼續分析第2個參數
str4來源:
這里非常簡單,它就是枚舉傳進來的第二個參數map,判斷如果有X-SS-STUB這個值的話就獲取,反之則填充32個0,那么我們抓包發現并沒有X-SS-STUB這個參數,實際上如果我們的包是POST的話它就會有,實際上它就是POST數據的一個MD5簽名值。
str5來源:
str5也非常簡單,也是枚舉map里面有沒有COOKIE,如果有就把COOKIE進行MD5,那么該參數也到此結束了
str6來源:
String c2 = tt.e(str3);if (c2 != null && c2.length() > 0) { str6 = d.a(c2); StcSDKFactory.getInstance().setSession(c2);}
這里我們記得str3是cookie,它執行了tt.e(str3) 方法獲取一個返回值,如果它不是空同樣給這個返回值md5,那么我們跟進去看一下它是做了什么處理:
這里我們看到它是枚舉了cookie里面有沒有sessionid這個值,如果有就取出來,那么str6到此結束
參數整理:
a2 = md5(url) 疑似對網址的參數進行md5
str4 = x-ss-stub,只有post時才有效,否則是32個0
str5 = md5(cookie) 對cookie進行md5
str6 = md5(cookie['sessionid']) 對cookie里面對sessionid進行md5,否則也是32個0
我們整理完了這4條參數后,繼續分析,它將這4個參數進行了字符串合并,接著執行 a.a(a2+str4+str5+str6),我們跟進去看看里面做了什么操作
我們看到它這里循環了總長度/2次,每次都是把 str[i] 轉換成十進制左移4,然后加上 str[i+1] 都一個簡單運算,并返回結果,也就是本來是4個32位(128位)然后經過加密后縮短成了64位長度。最后它執行了com.ss.sys.ces.a.leviathan(i, currentTimeMillis, a.a(a2 + str4 + str5 + str6))進行計算,我們看到它還傳了2個參數,i和currentTimeMillis,我們往前可以看到 i是-1,而currentTimeMillis是當前都十位時間戳。
最后把計算好都byteArray經過位移轉換成了string類型,并put到map里面,那么我們也清楚到看到,k-khronos也就是剛剛到currentTimeMillis時間戳了。我們發現由于om.ss.sys.ces.a.leviathan是在so層到libcms.so文件,并且里面有大量到混淆就沒有再度分析。我們可以通過xposed或者unidbg到方法進行調用。
這里我們分析完了它算法到具體參數構造完成后,我們還需要確認它傳到參數是否是我們所聯想到,那么這里我們發現由于它這個方法是一個callback,我們往前跟一下,尋找一個合適到hook點,使用frida進行hook
這里我對它進行了調用查找,看到只有1個地方,我們跟進去看看,跟進去之后它就是以下內容,就只是一個簡單對賦值給sAddSecurityFactorProcessCallback,我們在對它進行調用查找,看看是什么地方對它進行對調用。
public static void setAddSecurityFactorProcessCallback(a aVar) {
sAddSecurityFactorProcessCallback = aVar;
}
這里我們看到它從這里取的回調指針變量,然后判斷如果不為null則執行,那么我們就可以直接hook這個方法:tryAddSecurityFactor$___twin___,這里我的hook代碼也就比較簡單,直接輸出它傳進去的map和str的值以及返回的map進行確認。
//frida -U com.ss.android.ugc.aweme -l test.jsJava.perform(function() { var NetworkParams = Java.use("com.bytedance.frameworks.baselib.network.http.NetworkParams"); NetworkParams['tryAddSecurityFactor$___twin___'].implementation = function(str,map){ var keyset = map.keySet(); var it = keyset.iterator(); console.log("str:\t"+str) while(it.hasNext()){ var keystr = it.next().toString(); var valuestr = map.get(keystr).toString() console.log("map:\t"+keystr+"\t"+valuestr) } var ret ret = this.tryAddSecurityFactor$___twin___(str,map); var keyset = ret.keySet(); var it = keyset.iterator(); while(it.hasNext()){ var keystr = it.next().toString(); var valuestr = ret.get(keystr).toString() console.log("ret map:\t"+keystr+"\t"+valuestr) } return ret; }});
綠色部分就是str參數1的值,黃色則是map,藍色則是返回的map,我們看下charles的這個包的header里的xgorgon是不是返回的值。
“java數據加密算法實例分析”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。