frida常見演算法hook
阿新 • • 發佈:2021-10-25
function showStacks() { Java.perform(function () { send(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Exception").$new())); }); } function bytesToHex(arr) { var str = ""; for(var i=0; i<arr.length; i++) { var tmp = arr[i]; if (tmp < 0) { tmp =(255+tmp+1).toString(16); } else { tmp = tmp.toString(16); } if(tmp.length == 1) { tmp = "0" + tmp; } str += tmp; } return str; } function bytesToBase64(arr) { var str = ""; for(var i=0; i<arr.length; i++) { var tmp = arr[i]; if (tmp < 0) { tmp =(255+tmp+1).toString(16); } else { tmp = tmp.toString(16); } if(tmp.length == 1) { tmp = "0" + tmp; } str += tmp; } return str; } function bytesToString(arr) { var str = ""; for(var i=0; i<arr.length; i++) { var tmp = arr[i]; if (tmp < 0) { tmp =(255+tmp+1).toString(16); } else { tmp = tmp.toString(16); } if(tmp.length == 1) { tmp = "0" + tmp; } str += tmp; } return str; } Java.perform(function () { var secretKeySpec = Java.use('javax.crypto.spec.SecretKeySpec'); secretKeySpec.$init.overload('[B','java.lang.String').implementation = function (a,b) { showStacks(); var result = this.$init(a, b); send("======================================"); send("演算法名:" + b + "|Dec金鑰:" + bytesToString(a)); send("演算法名:" + b + "|Hex金鑰:" + bytesToHex(a)); return result; } var mac = Java.use('javax.crypto.Mac'); mac.getInstance.overload('java.lang.String').implementation = function (a) { showStacks(); var result = this.getInstance(a); send("======================================"); send("演算法名:" + a); return result; } mac.update.overload('[B').implementation = function (a) { showStacks(); this.update(a); send("======================================"); send("update:" + bytesToString(a)) } mac.update.overload('[B','int','int').implementation = function (a,b,c) { showStacks(); this.update(a,b,c) send("======================================"); send("update:" + bytesToString(a) + "|" + b + "|" + c); } mac.doFinal.overload().implementation = function () { showStacks(); var result = this.doFinal(); send("======================================"); send("doFinal結果:" + bytesToHex(result)); send("doFinal結果:" + bytesToBase64(result)); return result; } mac.doFinal.overload('[B').implementation = function (a) { showStacks(); var result = this.doFinal(a); send("======================================"); send("doFinal引數:" + bytesToString(a)); send("doFinal結果:" + bytesToHex(result)); send("doFinal結果:" + bytesToBase64(result)); return result; } var md = Java.use('java.security.MessageDigest'); md.getInstance.overload('java.lang.String','java.lang.String').implementation = function (a,b) { showStacks(); send("======================================"); send("演算法名:" + a); return this.getInstance(a, b); } md.getInstance.overload('java.lang.String').implementation = function (a) { showStacks(); send("======================================"); send("演算法名:" + a); return this.getInstance(a); } md.update.overload('[B').implementation = function (a) { showStacks(); send("======================================"); send("update:" + bytesToString(a)) return this.update(a); } md.update.overload('[B','int','int').implementation = function (a,b,c) { showStacks(); send("======================================"); send("update:" + bytesToString(a) + "|" + b + "|" + c); return this.update(a,b,c); } md.digest.overload().implementation = function () { showStacks(); send("======================================"); var result = this.digest(); send("digest結果:" + bytesToHex(result)); send("digest結果:" + bytesToBase64(result)); return result; } md.digest.overload('[B').implementation = function (a) { showStacks(); send("======================================"); send("digest引數:" + bytesToString(a)); var result = this.digest(a); send("digest結果:" + bytesToHex(result)); send("digest結果:" + bytesToBase64(result)); return result; } var ivParameterSpec = Java.use('javax.crypto.spec.IvParameterSpec'); ivParameterSpec.$init.overload('[B').implementation = function (a) { showStacks(); var result = this.$init(a); send("======================================"); send("iv向量:" + bytesToString(a)); send("iv向量:" + bytesToHex(a)); return result; } var cipher = Java.use('javax.crypto.Cipher'); cipher.getInstance.overload('java.lang.String').implementation = function (a) { showStacks(); var result = this.getInstance(a); send("======================================"); send("模式填充:" + a); return result; } cipher.update.overload('[B').implementation = function (a) { showStacks(); var result = this.update(a); send("======================================"); send("update:" + bytesToString(a)); return result; } cipher.update.overload('[B','int','int').implementation = function (a,b,c) { showStacks(); var result = this.update(a,b,c); send("======================================"); send("update:" + bytesToString(a) + "|" + b + "|" + c); return result; } cipher.doFinal.overload().implementation = function () { showStacks(); var result = this.doFinal(); send("======================================"); send("doFinal結果:" + bytesToHex(result)); send("doFinal結果:" + bytesToBase64(result)); return result; } cipher.doFinal.overload('[B').implementation = function (a) { showStacks(); var result = this.doFinal(a); send("======================================"); send("doFinal引數:" + bytesToString(a)); send("doFinal結果:" + bytesToHex(result)); send("doFinal結果:" + bytesToBase64(result)); return result; } var x509EncodedKeySpec = Java.use('java.security.spec.X509EncodedKeySpec'); x509EncodedKeySpec.$init.overload('[B').implementation = function (a) { showStacks(); var result = this.$init(a); send("======================================"); send("RSA金鑰:" + bytesToBase64(a)); return result; } var rSAPublicKeySpec = Java.use('java.security.spec.RSAPublicKeySpec'); rSAPublicKeySpec.$init.overload('java.math.BigInteger','java.math.BigInteger').implementation = function (a,b) { showStacks(); var result = this.$init(a,b); send("======================================"); //send("RSA金鑰:" + bytesToBase64(a)); send("RSA金鑰N:" + a.toString(16)); send("RSA金鑰E:" + b.toString(16)); return result; } });