某次元app之data参数分析
今天我們要分析的app 是5Y2K5qyh5YWD54mI5pys5Y+3djUuMC44 ,小伙伴們可以去各大應(yīng)用商定自行下載。
同系列文章推薦下:
1.聚美app之 _sign參數(shù)分析
2.大潤發(fā)優(yōu)鮮app之paramsMD5參數(shù)分析
3.美圖秀秀 sig參數(shù)分析
4.貝殼app Authorization參數(shù)分析
5.豆瓣app sig參數(shù)分析
6.半次元app之data參數(shù)分析
1.先抓個包
老規(guī)矩,先用charles 抓個包,可以看到該app用的更多是post請求,請求參數(shù) 叫 “data”,請求值很明顯被加密了,那么今天研究的參數(shù)就是它,發(fā)現(xiàn)字符串是以"="結(jié)尾,根據(jù)經(jīng)驗大膽的猜測是被base64處理過,猜測估計是使用了AES/DES或者一些其他算法。
2.jadx靜態(tài)分析
直接搜索"data" ,肯定會有一大堆返回結(jié)果。那么就換個思路,比如一些常用詞,比如AES ,DES,base64,encryp。這里搜索AES
然后 看這里(SecretKeySpec secretKeySpec = new SecretKeySpec(randomString.getBytes(Charset.defaultCharset()), "AES");)感覺很像,來點進去看一看。
看關(guān)鍵詞,這里就很明顯使用了AES加密的ECB模式,在ECB模式中只需要一個16位的key。
然后繼續(xù)追進去看,發(fā)現(xiàn)key 是randomString.getBytes(Charset.defaultCharset()) 這個方法返回來的,它又是randomString = getRandomString(i); 方法回來的,繼續(xù)往上追。
這里來到了private static native String getRandomString(int i);,看關(guān)鍵詞 native,好吧,加密的key 是來自于so層的。這時候需要看看so里面的邏輯是咋寫的,不過從so里面返回的只是key,理論上來說這個key 應(yīng)該是固定的,所以說我們可以直接hook它在java層的返回結(jié)果。
3.frida動態(tài)調(diào)試
打開frida服務(wù),運行命令:
frida -U com.banciyuan.bcywebview -l hook_banciyuan_java.jsjs代碼如下:
Java.perform(function(){var Encrypt = Java.use("com.banciyuan.bcywebview.utils.encrypt.Encrypt");Encrypt.a.overload("java.lang.String").implementation = function (str){console.log("↓↓↓↓↓↓↓↓↓↓hook開始↓↓↓↓↓↓↓↓↓↓↓↓↓↓");console.log("AES加密前參數(shù): "+str);var res = Encrypt.a(str);console.log("AES加密后結(jié)果: "+res);console.log("↑↑↑↑↑↑↑↑↑↑↑hook結(jié)束↑↑↑↑↑↑↑↑↑↑↑↑↑");return res;}Encrypt.getRandomString.implementation = function (a) {console.log('getRandomString入?yún)?shù): ', a);var aes_key = this.getRandomString(a);console.log('加密的key: ', aes_key);return aes_key;}// Encrypt.b.implementation = function (str, str2){// console.log("b方法參數(shù)1: "+ str);// console.log("b方法參數(shù)2: "+ str2);// // console.log("↓↓↓↓↓↓↓↓↓↓↓↓打印b方法調(diào)用的堆棧↓↓↓↓↓↓↓↓↓↓↓↓");// // printStack();// // console.log("↑↑↑↑↑↑↑↑↑↑↑↑打印b方法調(diào)用的堆棧↑↑↑↑↑↑↑↑↑↑↑↑");// var bres = Encrypt.b(str, str2);// console.log("方法返回結(jié)果: "+ bres);// console.log("方法返回結(jié)果: "+ Object.keys(bres))// send(bres)// return bres;// }function printStack(){var threadef = Java.use('java.lang.Thread');var threadinstance = threadef.$new();var stack = threadinstance.currentThread().getStackTrace();for(var i = 0;i<stack.length;i++){send("stack:" + stack[i].toString());}}} )效果如圖:
這里就很明顯的能看到,輸入的參數(shù)和輸出的結(jié)果以及key。
然后key已經(jīng)被hook出來了,接下來,打開對應(yīng)的so文件,去驗證下我們的猜想。
查看so文件
這里的so文件叫 librandom.so,在導(dǎo)出表里面直接看到so層的方法名Java_com_banciyuan_bcywebview_utils_encrypt_Encrypt_getRandomString
,然后還找到對應(yīng)的aes-key,也驗證了hook出來的值。
4.python還原一下
該app使用的是AES加密算法,對該算法不清楚的可移步這篇文章(python 實現(xiàn)AES加密算法)。
可以看到data 計算的結(jié)果,和hook出來的值一樣,然后請求也成功了。
完事,手工。
總結(jié)
以上是生活随笔為你收集整理的某次元app之data参数分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: frida hook so层方法大全
- 下一篇: 某瓜数据之sign参数分析