Java.perform(function() { var use_single_byte = false; var complete_bytes = new Array(); var index = 0; var secretKeySpecDef = Java.use('javax.crypto.spec.SecretKeySpec'); var ivParameterSpecDef = Java.use('javax.crypto.spec.IvParameterSpec'); var cipherDef = Java.use('javax.crypto.Cipher'); var cipherDoFinal_1 = cipherDef.doFinal.overload(); var cipherDoFinal_2 = cipherDef.doFinal.overload('[B'); var cipherDoFinal_3 = cipherDef.doFinal.overload('[B', 'int'); var cipherDoFinal_4 = cipherDef.doFinal.overload('[B', 'int', 'int'); var cipherDoFinal_5 = cipherDef.doFinal.overload('[B', 'int', 'int', '[B'); var cipherDoFinal_6 = cipherDef.doFinal.overload('[B', 'int', 'int', '[B', 'int'); var cipherUpdate_1 = cipherDef.update.overload('[B'); var cipherUpdate_2 = cipherDef.update.overload('[B', 'int', 'int'); var cipherUpdate_3 = cipherDef.update.overload('[B', 'int', 'int', '[B'); var cipherUpdate_4 = cipherDef.update.overload('[B', 'int', 'int', '[B', 'int'); var secretKeySpecDef_init_1 = secretKeySpecDef.$init.overload('[B', 'java.lang.String'); var secretKeySpecDef_init_2 = secretKeySpecDef.$init.overload('[B', 'int', 'int', 'java.lang.String'); var ivParameterSpecDef_init_1 = ivParameterSpecDef.$init.overload('[B'); var ivParameterSpecDef_init_2 = ivParameterSpecDef.$init.overload('[B', 'int', 'int'); secretKeySpecDef_init_1.implementation = function(arr, alg) { var key = b2s(arr); send("Creating " + alg + " secret key, plaintext:\\n" + hexdump(key)); return secretKeySpecDef_init_1.call(this, arr, alg); } secretKeySpecDef_init_2.implementation = function(arr, off, len, alg) { var key = b2s(arr); send("Creating " + alg + " secret key, plaintext:\\n" + hexdump(key)); return secretKeySpecDef_init_2.call(this, arr, off, len, alg); } /*ivParameterSpecDef_init_1.implementation = function(arr) { var iv = b2s(arr); send("Creating IV:\\n" + hexdump(iv)); return ivParameterSpecDef_init_1.call(this, arr); } ivParameterSpecDef_init_2.implementation = function(arr, off, len) { var iv = b2s(arr); send("Creating IV, plaintext:\\n" + hexdump(iv)); return ivParameterSpecDef_init_2.call(this, arr, off, len); }*/ cipherDoFinal_1.implementation = function() { var ret = cipherDoFinal_1.call(this); info(this.getIV(), this.getAlgorithm(), complete_bytes, ret); return ret; } cipherDoFinal_2.implementation = function(arr) { addtoarray(arr); var ret = cipherDoFinal_2.call(this, arr); info(this.getIV(), this.getAlgorithm(), complete_bytes, ret); return ret; } cipherDoFinal_3.implementation = function(arr, a) { addtoarray(arr); var ret = cipherDoFinal_3.call(this, arr, a); info(this.getIV(), this.getAlgorithm(), complete_bytes, ret); return ret; } cipherDoFinal_4.implementation = function(arr, a, b) { addtoarray(arr); var ret = cipherDoFinal_4.call(this, arr, a, b); info(this.getIV(), this.getAlgorithm(), complete_bytes, ret); return ret; } cipherDoFinal_5.implementation = function(arr, a, b, c) { addtoarray(arr); var ret = cipherDoFinal_5.call(this, arr, a, b, c); info(this.getIV(), this.getAlgorithm(), complete_bytes, ret); return ret; } cipherDoFinal_6.implementation = function(arr, a, b, c, d) { addtoarray(arr); var ret = cipherDoFinal_6.call(this, arr, a, b, c, d); info(this.getIV(), this.getAlgorithm(), complete_bytes, c); return ret; } cipherUpdate_1.implementation = function(arr) { addtoarray(arr); return cipherUpdate_1.call(this, arr); } cipherUpdate_2.implementation = function(arr, a, b) { addtoarray(arr); return cipherUpdate_2.call(this, arr, a, b); } cipherUpdate_3.implementation = function(arr, a, b, c) { addtoarray(arr); return cipherUpdate_3.call(this, arr, a, b, c); } cipherUpdate_4.implementation = function(arr, a, b, c, d) { addtoarray(arr); return cipherUpdate_4.call(this, arr, a, b, c, d); } function info(iv, alg, plain, encoded) { send("Performing encryption/decryption"); if (iv) { send("Initialization Vector: \\n" + hexdump(b2s(iv))); } else { send("Initialization Vector: " + iv); } send("Algorithm: " + alg); send("In: \\n" + hexdump(b2s(plain))); send("Out: \\n" + hexdump(b2s(encoded))); complete_bytes = []; index = 0; } function hexdump(buffer, blockSize) { blockSize = blockSize || 16; var lines = []; var hex = "0123456789ABCDEF"; for (var b = 0; b < buffer.length; b += blockSize) { var block = buffer.slice(b, Math.min(b + blockSize, buffer.length)); var addr = ("0000" + b.toString(16)).slice(-4); var codes = block.split('').map(function(ch) { var code = ch.charCodeAt(0); return " " + hex[(0xF0 & code) >> 4] + hex[0x0F & code]; }).join(""); codes += " ".repeat(blockSize - block.length); var chars = block.replace(/[\\x00-\\x1F\\x20]/g, '.'); chars += " ".repeat(blockSize - block.length); lines.push(addr + " " + codes + " " + chars); } return lines.join("\\n"); } function b2s(array) { var result = ""; for (var i = 0; i < array.length; i++) { result += String.fromCharCode(modulus(array[i], 256)); } return result; } function modulus(x, n) { return ((x % n) + n) % n; } function addtoarray(arr) { for (var i = 0; i < arr.length; i++) { complete_bytes[index] = arr[i]; index = index + 1; } } });