一、目標
李老板: 奮飛呀,據說某電商App升級了,搞出了一個64位的sign。更牛的是入參都加密了!
奮飛:這么拉風,拉出來咱們盤盤。
main.png
v10.3.2
二、步驟
32位和64位
我們掌握了那么多方法,先搜字符串呢?還是先Hook呢?
子曾經曰過:看到32位簽名就要想起MD5和HmacSHA1,看到64位簽名就要想起HmacSHA256。
那就先搞搞java的密碼學相關函數:
var secretKeySpec = Java.use('javax.crypto.spec.SecretKeySpec');
secretKeySpec.$init.overload('[B','java.lang.String').implementation = function (a,b) {
var result = this.$init(a, b);
console.log(">>> 算法名" + b);
return result;
}
// /*
var mac = Java.use('javax.crypto.Mac');
mac.getInstance.overload('java.lang.String').implementation = function (a) {
// showStacks();
var result = this.getInstance(a);
console.log("mac ======================================");
console.log("算法名:" + a);
return result;
}
mac.doFinal.overload('[B').implementation = function (a) {
// showStacks();
var result = this.doFinal(a);
console.log("mac ======================================");
console.log("doFinal參數:" + bytesToString(a));
console.log("doFinal結果(hex):" + bytesToHex(result));
console.log("doFinal結果(base):" + bytesToBase64(result));
// var stack = threadinstance.currentThread().getStackTrace();
// console.log("Full call stack:" + Where(stack));
return result;
}
// */
跑一下。
TIP: 記得參考之前的文章 http://91fans.com.cn/post/ldqsignone/ 把frida端口號改改
rc1.png
好幸運,果然就是。
key是多少?
HmacSHA256 和 md5之類的區別是: 它是傳一個key的。我們嘗試把這個key找出來。
先打印堆棧
Full call stack:dalvik.system.VMStack.getThreadStackTrace(Native Method)
java.lang.Thread.getStackTrace(Thread.java:1720)
javax.crypto.Mac.doFinal(Native Method)
com.jxxxxong.sdk.xxcrashreport.a.z.a(XXCrashReportFile:63)
com.jxxxxong.sdk.xxcrashreport.a.z.a(XXCrashReportFile:136)
com.jxxxxong.sdk.xxcrashreport.a.o.Ve(XXCrashReportFile:154)
com.jxxxxong.sdk.xxcrashreport.a.o.<init>(XXCrashReportFile:135)
com.jxxxxong.sdk.xxcrashreport.a.o.<init>(XXCrashReportFile:37)
com.jxxxxong.sdk.xxcrashreport.a.o$a.Vf(XXCrashReportFile:245)
com.jxxxxong.sdk.xxcrashreport.a.ai$a.run(XXCrashReportFile:133)
本來想直接從靜態代碼里把這個key找出來,結果被繞來繞去搞的頭暈。
算了,加個Hook吧。
var getKeyCls = Java.use("com.jxxxxong.sdk.xxcrashreport.a.z");
getKeyCls.a.overload('[B', '[B').implementation = function(a,b){
var result = this.a(a,b);
var StrCls = Java.use('java.lang.String');
var keyStr = StrCls.$new(b);
var dataStr = StrCls.$new(a);
console.log(">>> dataStr=" + dataStr);
console.log(">>> key=" + keyStr);
console.log(">>> rc=" + result);
return result;
}
繼續跑下
rc2.png
驗算下
明文有了,key有了,結果也有了。我們可以來驗算下了。
def main():
data = "yingyan&R4iSKKKKKKKKKK3Ckm6NCKyP4XpntPMcsmTiVIdoeOlPYBLNS1PK0O4e747X79c5P3zFQbh3LbJlFUCRaaIQTPKmipOYkJUu6OAqZT1xx6MMacwy/v5yxRvbdYAwdhXVCF7zmi+DHbQ16PPDpn/R9PPnPifGbirJeG9yKKKK&R4iSKKKKKKKKKBC0CtGnLKMgYWz/LGKKKK==&android&10.3.2&R4iSKKKKKKKKKOlFz0/FIGUKUpUcZGYKKKK=&R4iSKKKKKKKKKKlShOtDUJLIsFKLKA589d0AKKKK&uvReport&R4iSKKKKKKKKKNC0KKNrTV2rKqKKKK==&huawei&R4iSKKKKKKKKKNC0CJRGCtS3DKSK/BvloKuKKKK=&E1.1&1641614274084&R4iSKKKKKKKKKNDBjBK0JNG1DurECbE0iBGOKNhLaV4GKKKK".encode('utf-8')
# 890394FD47EB218CADB73B3FFF976CFE571AC255E1BD5F7AFE427CED13B52DBC
signature = hmac.new(appsecret, data, digestmod=sha256).hexdigest().upper()
print(signature)
人生苦短,快用Python
收工~ 休息一下,入參的加密明天搞吧。
三、總結
重新抓了一下包,比對了一下 &sign=xxx&sv=xxx 模式的簽名依然存在,大概率算法沒變。
64位的sign之前的版本也存在,大概率也沒變。
所以,老板永遠是對的。
ffshow.jpeg
從你站著的地方挖下去,一定可以挖出清泉來。