hook 摘要算法 (MD5…)
function HookMessageDigest(){
var digest = Java.use("java.security.MessageDigest");
digest.getInstance.overload('java.lang.String').implementation = function (arg){
console.log("Digest name ('java.lang.String') --->>", arg);
return this.getInstance(arg);
}
digest.getInstance.overload('java.lang.String', 'java.lang.String').implementation = function (arg1, arg2){
console.log("Digest name ('java.lang.String', 'java.lang.String') --->>", arg1, arg2);
return this.getInstance(arg1, arg2);
}
digest.getInstance.overload('java.lang.String', 'java.security.Provider').implementation = function (arg1, arg2){
console.log("Digest name ('java.lang.String', 'java.security.Provider') --->>", arg1, arg2);
return this.getInstance(arg, arg2);
}
digest.update.overload('byte').implementation = function (arg){
console.log("Digest update('byte') 入参--->>", arg);
var result = this.update(arg);
return result;
}
digest.update.overload('java.nio.ByteBuffer').implementation = function (arg){
console.log("Digest update('java.nio.ByteBuffer') 入参(hex)--->>", bytesToHex(arg));
if( log_str ) console.log("Digest update('java.nio.ByteBuffer') 入参(str)--->>", bytesToString(arg));
var resutl = this.update(arg);
return result;
}
digest.update.overload('[B').implementation = function (arg){
console.log("Digest update('[B') 入参(hex)--->>", bytesToHex(arg));
if( log_str ) console.log("Digest update('[B') 入参(str)--->>", bytesToString(arg));
var result = this.update(arg);
return result;
}
digest.update.overload('[B', 'int', 'int').implementation = function (arg1, arg2, arg3){
console.log("Digest update('[B', 'int', 'int') 入参(hex)--->>", bytesToHex(arg1), arg2, arg3);
if( log_str ) console.log("Digest update('[B', 'int', 'int') 入参(str)--->>", bytesToString(arg1), arg2, arg3);
return this.update(arg1, arg2, arg3);
}
digest.digest.overload().implementation = function (){
var result = this.digest();
console.log("Digest digest('') retufn result: ", bytesToHex(result));
return result;
}
digest.digest.overload('[B').implementation = function (arg){
console.log("Digest digest('[B') 入参(hex)--->>", bytesToHex(arg));
if( log_str ) console.log("Digest digest('[B') 入参(str)--->>", bytesToString(arg));
var result = this.digest(arg);
console.log("Digest digest('[B') retufn result: ", bytesToHex(result));
return result;
}
digest.digest.overload('[B', 'int', 'int').implementation = function (arg1, arg2, arg3){
console.log("Digest digest('[B', 'int', 'int') 入参(hex)--->>", bytesToHex(arg1), arg2, arg3);
if( log_str ) console.log("Digest digest('[B', 'int', 'int') 入参(str)--->>", bytesToString(arg1), arg2, arg3);
var result = this.digest(arg1, arg2, arg3);
console.log("Digest digest('[B', 'int', 'int') retufn result: ", bytesToHex(result));
return result;
}
}
hook Hmac摘要算法 (HmacMD5…)
function HookHmacMessageDigest(){
var hmac = Java.use('javax.crypto.Mac');
hmac.getInstance.overload('java.lang.String').implementation = function (arg){
console.log("HmacDigest name ('java.lang.String') --->>", arg);
return this.getInstance(arg);
}
hmac.getInstance.overload('java.lang.String', 'java.lang.String').implementation = function (arg1, arg2){
console.log("HmacDigest name ('java.lang.String', 'java.lang.String') --->>", arg1, arg2);
return this.getInstance(arg);
}
hmac.getInstance.overload('java.lang.String', 'java.security.Provider').implementation = function (arg1, arg2){
console.log("HmacDigest name ('java.lang.String', 'java.security.Provider') --->>", arg1, arg2);
return this.getInstance(arg);
}
hmac.init.overload('java.security.Key').implementation = function (arg){
console.log("HmacDigest init ('java.security.Key') --->>", arg);
return this.init(arg);
}
hmac.init.overload('java.security.Key', 'java.security.spec.AlgorithmParameterSpec').implementation = function (arg1, arg2){
console.log("HmacDigest init ('java.security.Key', 'java.security.spec.AlgorithmParameterSpec') --->>", arg1, arg2);
return this.init(arg);
}
hmac.update.overload('byte').implementation = function (arg){
console.log("HmacDigest update('byte') --->>", arg);
return this.update(arg);
}
hmac.update.overload('java.nio.ByteBuffer').implementation = function (arg){
console.log("HmacDigest update('java.nio.ByteBuffer') --->>", arg);
return this.update(arg);
}
hmac.update.overload('[B').implementation = function (arg){
console.log("HmacDigest update('[B') --->>", arg);
console.log("HmacDigest update('[B') hex--->>", bytesToHex(arg));
console.log("HmacDigest update('[B') str--->>", bytesToString(arg));
return this.update(arg);
}
hmac.update.overload('[B', 'int', 'int').implementation = function (arg1, arg2, arg3){
console.log("HmacDigest update('[B', 'int', 'int') --->>", arg1, arg2, arg3);
console.log("HmacDigest update('[B', 'int', 'int') hex--->>", bytesToHex(arg1), arg2, arg3);
console.log("HmacDigest update('[B', 'int', 'int') str--->>", bytesToString(arg1), arg2, arg3);
return this.update(arg1, arg2, arg3);
}
hmac.doFinal.overload().implementation = function (){
var value = this.doFinal();
console.log("HmacDigest doFinal return: ", bytesToHex(value));
return value;
}
hmac.doFinal.overload('[B').implementation = function (arg){
console.log("HmacDigest doFinal('[B') --->>", arg);
console.log("HmacDigest doFinal('[B') hex--->>", bytesToHex(arg));
console.log("HmacDigest doFinal('[B') str--->>", bytesToString(arg));
var value = this.doFinal(arg);
console.log("HmacDigest doFinal return: ", bytesToHex(value));
return value;
}
hmac.doFinal.overload('[B', 'int').implementation = function (arg1, arg2){
console.log("HmacDigest doFinal('[B', 'int') --->>", arg1, arg2);
console.log("HmacDigest doFinal('[B', 'int') hex--->>", arg1, arg2);
console.log("HmacDigest doFinal('[B', 'int') str--->>", arg1, arg2);
var value = this.doFinal(arg1, arg2);
console.log("HmacDigest doFinal return: ", bytesToHex(value));
return value;
}
}
Hook DES AES RSA
function Hook_DES_AES_RSA(){
var DES = Java.use("javax.crypto.SecretKeyFactory");
DES.getInstance.overload('java.lang.String').implementation = function (arg){
console.log("对称算法 name ('') --->>", arg);
return this.getInstance(arg);
}
DES.getInstance.overload('java.lang.String', 'java.lang.String').implementation = function (arg1, arg2){
console.log("对称算法 name ('java.lang.String', 'java.lang.String') --->>", arg1, arg2);
return this.getInstance(arg);
}
DES.getInstance.overload('java.lang.String', 'java.security.Provider').implementation = function (arg1, arg2){
console.log("对称算法 name ('java.lang.String', 'java.security.Provider') --->>", arg1, arg2);
return this.getInstance(arg);
}
var AES = Java.use("javax.crypto.spec.SecretKeySpec");
AES.$init.overload('[B', 'java.lang.String') .implementation = function (arg1, arg2){
console.log("对称算法 name ('[B', 'java.lang.String') --->>", bytesToHex(arg1), arg2);
return this.$init(arg1, arg2);
}
AES.$init.overload('[B', 'int', 'int', 'java.lang.String') .implementation = function (arg1, arg2, arg3){
console.log("对称算法 name ('[B', 'int', 'int', 'java.lang.String') --->>", bytesToHex(arg1), arg2, bytesToString(arg3));
return this.$init(arg1, arg2);
}
var RSApublicKey = Java.use("java.security.spec.X509EncodedKeySpec");
RSApublicKey.$init.overload('[B').implementation = function (arg){
console.log("RSA-PublicKey init('[B') 密钥参数-->" + bytesToBase64(arg))
return this.$init(arg)
}
var generateSecret = Java.use("javax.crypto.spec.DESKeySpec");
generateSecret.$init.overload('[B').implementation = function (arg){
console.log("generateSecret.init('[B') 参数-->: ", bytesToHex(arg));
return this.$init(arg);
}
generateSecret.$init.overload('[B', 'int').implementation = function (arg1, arg2){
console.log("generateSecret.init('[B', 'int') 参数-->: ", bytesToHex(arg1), arg2);
return this.$init(arg1, arg2);
}
var ivParams = Java.use("javax.crypto.spec.IvParameterSpec");
ivParams.$init.overload('[B').implementation = function (arg) {
console.log("ivParams.init('[B') 参数-->: ", bytesToHex(arg));
return this.$init(arg);
};
ivParams.$init.overload('[B', 'int', 'int').implementation = function (arg1, arg2, arg3) {
console.log("ivParams.init('[B', 'int', 'int') 参数-->: ", bytesToHex(arg1), arg2, arg3);
return this.$init(arg1, arg2, arg3);
}
var cipher = Java.use("javax.crypto.Cipher");
cipher.getInstance.overload('java.lang.String').implementation = function (arg){
console.log("cipher.getInstance('java.lang.String') 参数--->", bytesToString(arg));
return this.getInstance(arg);
}
cipher.getInstance.overload('java.lang.String', 'java.lang.String').implementation = function (arg1, arg2){
console.log("cipher.getInstance('java.lang.String', 'java.lang.String') 参数--->", bytesToString(arg1), bytesToString(arg2));
return this.getInstance(arg1, arg2);
}
cipher.getInstance.overload('java.lang.String', 'java.security.Provider').implementation = function (arg1, arg2){
console.log("cipher.getInstance('java.lang.String', 'java.security.Provider') 参数--->", bytesToString(arg1), arg2);
return this.getInstance(arg1, arg2);
}
cipher.update.overload('[B').implementation = function (arg){
console.log("cipher.update('[B') 参数--->", bytesToHex(arg));
return this.update(arg);
}
cipher.update.overload('java.nio.ByteBuffer', 'java.nio.ByteBuffer').implementation = function (arg1, arg2){
console.log("cipher.update('java.nio.ByteBuffer', 'java.nio.ByteBuffer') 参数--->", bytesToHex(arg1));
return this.update(arg1, arg2);
}
cipher.update.overload('[B', 'int', 'int').implementation = function (arg1, arg2, arg3){
console.log("cipher.update('[B', 'int', 'int') 参数--->", bytesToHex(arg));
return this.update(arg1, arg2, arg3);
}
cipher.update.overload('[B', 'int', 'int', '[B').implementation = function (arg1, arg2, arg3, arg4){
console.log("cipher.update('[B', 'int', 'int', '[B') 参数--->", bytesToHex(arg));
return this.update(arg1, arg2, arg3, arg4);
}
cipher.update.overload('[B', 'int', 'int', '[B', 'int').implementation = function (arg1, arg2, arg3, arg4, arg5){
console.log("cipher.update('[B', 'int', 'int', '[B', 'int') 参数--->", bytesToHex(arg));
return this.update(arg1, arg2, arg3, arg4, arg5);
}
cipher.doFinal.overload().implementation = function (){
var result = this.doFinal();
console.log("cipher doFinal() return: ", bytesToHex(result));
return result;
}
cipher.doFinal.overload('[B').implementation = function (arg){
console.log("cipher doFinal('[B') 参数(hex)--->>", bytesToHex(arg));
var result = this.doFinal(arg);
console.log("cipher doFinal('[B') return: ", bytesToHex(result));
return result;
}
cipher.doFinal.overload('java.nio.ByteBuffer', 'java.nio.ByteBuffer').implementation = function (arg1, arg2){
console.log("cipher doFinal('java.nio.ByteBuffer', 'java.nio.ByteBuffer') 参数(hex)--->>", bytesToHex(arg1), bytesToHex(arg2));
var result = this.doFinal(arg1, arg2);
console.log("cipher doFinal('java.nio.ByteBuffer', 'java.nio.ByteBuffer') return: ", bytesToHex(result));
return result;
}
cipher.doFinal.overload('[B', 'int').implementation = function (arg1, arg2){
console.log("cipher doFinal('[B', 'int') 参数(hex)--->>", bytesToHex(arg1), arg2);
var result = this.doFinal(arg1, arg2);
console.log("cipher doFinal('[B', 'int') return: ", bytesToHex(result));
return result;
}
cipher.doFinal.overload('[B', 'int', 'int').implementation = function (arg1, arg2, arg3){
console.log("cipher doFinal('[B', 'int', 'int') 参数(hex)--->>", bytesToHex(arg1), arg2, arg3);
var result = this.doFinal(arg1, arg2, arg3);
console.log("cipher doFinal('[B', 'int', 'int') return: ", bytesToHex(result));
return result;
}
cipher.doFinal.overload('[B', 'int', 'int', '[B').implementation = function (arg1, arg2, arg3, arg4){
console.log("cipher doFinal('[B', 'int', 'int', '[B') 参数(hex)--->>", bytesToHex(arg1), arg2, arg3, bytesToHex(arg4));
var result = this.doFinal(arg1, arg2, arg3, arg4);
console.log("cipher doFinal('[B', 'int', 'int', '[B') return: ", bytesToHex(result));
return result;
}
cipher.doFinal.overload('[B', 'int', 'int', '[B', 'int').implementation = function (arg1, arg2, arg3, arg4, arg5){
console.log("cipher doFinal('[B', 'int', 'int', '[B', 'int') 参数(hex)--->>", bytesToHex(arg1), arg2, arg3, bytesToHex(arg4), arg5);
var result = this.doFinal(arg1, arg2, arg3, arg4, arg5);
console.log("cipher doFinal('[B', 'int', 'int', '[B', 'int') return: ", bytesToHex(result));
return result;
}
}