Java.perform(function () { function showStack(){ var log = Java.use("android.util.Log"); var throwable = Java.use("java.lang.Throwable"); console.log(log.getStackTraceString(throwable.$new())); } var ByteString = Java.use("com.android.okhttp.okio.ByteString"); function toBase64(data){ console.log(ByteString.of(data).base64()); } function toHex(data){ console.log(ByteString.of(data).hex()); } function toUtf8(data){ console.log(ByteString.of(data).utf8()); } var cipher = Java.use("javax.crypto.Cipher"); cipher.init.overload('int', 'java.security.cert.Certificate').implementation = function () { console.log("Cipher.init('int', 'java.security.cert.Certificate') is called!"); return this.init.apply(this, arguments); } cipher.init.overload('int', 'java.security.Key', 'java.security.SecureRandom').implementation = function () { console.log("Cipher.init('int', 'java.security.Key', 'java.security.SecureRandom') is called!"); return this.init.apply(this, arguments); } cipher.init.overload('int', 'java.security.cert.Certificate', 'java.security.SecureRandom').implementation = function () { console.log("Cipher.init('int', 'java.security.cert.Certificate', 'java.security.SecureRandom') is called!"); return this.init.apply(this, arguments); } cipher.init.overload('int', 'java.security.Key', 'java.security.AlgorithmParameters', 'java.security.SecureRandom').implementation = function () { console.log("Cipher.init('int', 'java.security.Key', 'java.security.AlgorithmParameters', 'java.security.SecureRandom') is called!"); return this.init.apply(this, arguments); } cipher.init.overload('int', 'java.security.Key', 'java.security.spec.AlgorithmParameterSpec', 'java.security.SecureRandom').implementation = function () { console.log("Cipher.init('int', 'java.security.Key', 'java.security.spec.AlgorithmParameterSpec', 'java.security.SecureRandom') is called!"); return this.init.apply(this, arguments); } cipher.init.overload('int', 'java.security.Key', 'java.security.AlgorithmParameters').implementation = function () { console.log("Cipher.init('int', 'java.security.Key', 'java.security.AlgorithmParameters') is called!"); return this.init.apply(this, arguments); }
cipher.init.overload('int', 'java.security.Key').implementation = function () { console.log("Cipher.init('int', 'java.security.Key') is called!"); var algorithm = this.getAlgorithm(); var tag = algorithm + " init Key"; var className = JSON.stringify(arguments[1]); if(className.indexOf("OpenSSLRSAPrivateKey") === -1){ var keyBytes = arguments[1].getEncoded(); toUtf8(tag, keyBytes); toHex(tag, keyBytes); toBase64(tag, keyBytes); } console.log("======================================================="); return this.init.apply(this, arguments); } cipher.init.overload('int', 'java.security.Key', 'java.security.spec.AlgorithmParameterSpec').implementation = function () { console.log("Cipher.init('int', 'java.security.Key', 'java.security.spec.AlgorithmParameterSpec') is called!"); var algorithm = this.getAlgorithm(); var tag = algorithm + " init Key"; var keyBytes = arguments[1].getEncoded(); toUtf8(tag, keyBytes); toHex(tag, keyBytes); toBase64(tag, keyBytes); var tags = algorithm + " init iv"; var iv = Java.cast(arguments[2], Java.use("javax.crypto.spec.IvParameterSpec")); var ivBytes = iv.getIV(); toUtf8(tags, ivBytes); toHex(tags, ivBytes); toBase64(tags, ivBytes); console.log("======================================================="); return this.init.apply(this, arguments); }
cipher.doFinal.overload('java.nio.ByteBuffer', 'java.nio.ByteBuffer').implementation = function () { console.log("Cipher.doFinal('java.nio.ByteBuffer', 'java.nio.ByteBuffer') is called!"); return this.doFinal.apply(this, arguments); } cipher.doFinal.overload('[B', 'int').implementation = function () { console.log("Cipher.doFinal('[B', 'int') is called!"); return this.doFinal.apply(this, arguments); } cipher.doFinal.overload('[B', 'int', 'int', '[B').implementation = function () { console.log("Cipher.doFinal('[B', 'int', 'int', '[B') is called!"); return this.doFinal.apply(this, arguments); } cipher.doFinal.overload('[B', 'int', 'int', '[B', 'int').implementation = function () { console.log("Cipher.doFinal('[B', 'int', 'int', '[B', 'int') is called!"); return this.doFinal.apply(this, arguments); } cipher.doFinal.overload().implementation = function () { console.log("Cipher.doFinal() is called!"); return this.doFinal.apply(this, arguments); }
cipher.doFinal.overload('[B').implementation = function () { console.log("Cipher.doFinal('[B') is called!"); var algorithm = this.getAlgorithm(); var tag = algorithm + " doFinal data"; var data = arguments[0]; toUtf8(tag, data); toHex(tag, data); toBase64(tag, data); var result = this.doFinal.apply(this, arguments); var tags = algorithm + " doFinal result"; toHex(tags, result); toBase64(tags, result); console.log("======================================================="); return result; } cipher.doFinal.overload('[B', 'int', 'int').implementation = function () { console.log("Cipher.doFinal('[B', 'int', 'int') is called!"); var algorithm = this.getAlgorithm(); var tag = algorithm + " doFinal data"; var data = arguments[0]; toUtf8(tag, data); toHex(tag, data); toBase64(tag, data); var result = this.doFinal.apply(this, arguments); var tags = algorithm + " doFinal result"; toHex(tags, result); toBase64(tags, result); console.log("=======================================================", arguments[1], arguments[2]); return result; } });
|