コールスタックの印刷中にAndroidのリバースフリーシェリングフリーダフックJavaネイティブアルゴリズム

-*-コーディング:UTF-8-*- 
import frida、sys 
 
jsCode = "" " 
    function showStacks(){ 
        Java.perform(function(){ 
            send(Java.use(" android.util.Log ")。getStackTraceString (Java.use( "java.lang.Exception")。$ new())); 
        }); 
    } 
(関数(){ 
    var base64EncodeChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 + /'、
    base64DecodeChars = new Array((-1)、(-1)、(-1)、(-1)、(-1)、(-1)、(-1)、(-1)、(-1)、 (-1)、(-1)、(-1)、(-1)、(-1)、(-1)、(-1)、(-1)、(-1)、(-1)、 (-1)、(-1)、(-1)、(-1)、(-1)、(-1)、(-1)、(-1)、(-1)、(-1)、 (-1)、(-1)、(-1)、(-1)、(-1)、(-1)、(-1)、(-1)、(-1)、(-1)、 (-1)、(-1)、(-1)、(-1)、62、(-1)、(-1)、(-1)、63、52、53、54、55、56、57 、58、59、60、61、(-1)、(-1)、(-1)、(-1)、(-1)、(-1)、(-1)、0、1、2 3、4、5、6、7、8、9、10、11、12、13、14、15、16、17、18、19、20、21、22、23、24、25、(-1) 、(-1)、(-1)、(-1)、(-1)、(-1)、26、27、28、29、30、31、32、33、34、35、36、37、 38、39、40、41、42、43、44、45、46、47、48、49、50、51、(-1)、(-1)、(-1)、(-1)、(- 1)); 
    this.stringToBase64 = function(e){ 
        var r、a、c、h、o、t; 
        for(c = e.length、a = 0、r = ''; a <c;){
            if(h = 255&e.charCodeAt(a ++)、a == c){
                r + = base64EncodeChars.charAt(h >> 2)、
                r + = base64EncodeChars.charAt((3&h)<< 4)、
                r + = '=='; 
                break 
            } 
            if(o = e.charCodeAt(a ++)、a == c){ 
                r + = base64EncodeChars.charAt(h >> 2)、
                r + = base64EncodeChars.charAt((3&h)<< 4 |(240 &o)>> 4)、
                r + = base64EncodeChars.charAt((15&o)<< 2)、
                r + = '='; 
                ブレーク
            } 
            t = e.charCodeAt(a ++)、 
            r + = base64EncodeChars。
            r + = base64EncodeChars.charAt((3&h)<< 4 |(240&o)>> 4)、
            r + = base64EncodeChars.charAt((15&o)<< 2 |(192&t)>> 6 )、
            r + = base64EncodeChars.charAt(63&t)
        } 
        return r 
    } 
    this.base64ToString = function(e){ 
        var r、a、c、h、o、t、d; 
        for(t = e.length、o = 0、d = ''; o <t;){ 
            do 
                r = base64DecodeChars [255&e.charCodeAt(o ++)]; 
            while(o <t && r == -1); 
            if(r == -1)
                break; 
            do 
                a = base64DecodeChars [255&e.charCodeAt(o ++)];
            if(a == -1)
            d + = String.fromCharCode(r << 2 |(48&a)>> 4); 
            do { 
                if(c = 255&e.charCodeAt(o ++)、61 == c)
                    return d; 
                c = base64DecodeChars [c] 
            } while(o <t && c == -1); 
            if(c == -1)
                break; 
            d + = String.fromCharCode((15&a)<< 4 |(60&c)>> 2); 
            do { 
                if(h = 255&e.charCodeAt(o ++)、61 == h)
                    return d; 
                h = base64DecodeChars [h] 
            } while(o <t && h == -1); 
            if(h == -1)
            d + =文字列。 
        } 
        return d 
    } 
    this.hexToBase64 = function(str){ 
        return base64Encode(String.fromCharCode.apply(null、str.replace(/ \ r | \ n / g、 "").replace(/([\ da-fA-F] {2})?/ g、 "0x $ 1").replace(/ + $ /、 "").split( "" ))); 
    } 
    this.base64ToHex = function(str){ 
        for(var i = 0、bin = base64Decode(str.replace(/ [\ r \ n] + $ /、 ""))、hex = []; i <bin。長さ; ++ i){ 
            var tmp = bin.charCodeAt(i).toString(16); 
            if(tmp.length === 1)
                tmp = "0" + tmp; 
            hex [hex.length] = tmp; 
        } 
        return hex.join( ""); 
    }
    this.hexToBytes = function(str){
            if(k <0){
        var len = str.length; 
        if(len%2!= 0){ 
            nullを返す; 
        } 
        len / = 2; 
        var hexA = new Array(); 
        for(var i = 0; i <len; i ++){ 
            var s = str.substr(pos、2); 
            var v = parseInt(s、16); 
            hexA.push(v); 
            pos + = 2; 
        } 
        hexAを返します。
    } 
    this.bytesToHex = function(arr){ 
        var str = ''; 
        var k、j; 
        for(var i = 0; i <arr.length; i ++){ 
            k = arr [i]; 
            j = k; 
                j = k + 256; 
            } 
            if(j <16){ 
                str + = "0"; 
            } 
            str + = j.toString(16); 
        } 
        return str; 
    } 
    this.stringToHex = function(str){ 
        var val = ""; 
        for(var i = 0; i <str.length; i ++){ 
            if(val == "")
                val = str.charCodeAt(i).toString(16); 
            それ以外の場合は
                val + = str.charCodeAt(i).toString(16); 
        } 
        return val 
    } 
    this.stringToBytes = function(str){   
        var ch、st、re = [];
        for(var i = 0; i <str.length; i ++){ 
    this.bytesToBase64 = function(e){ 
            ch = str.charCodeAt(i);  
            st = [];                 
           do {   
                st.push(ch&0xFF);  
                ch = ch >> 8;          
            }     
            while(ch);  
            re = re.concat(st.reverse()); 
        }   
        return re;  
    } 
    // byte [] 
    转成文字列のメソッドthis.bytesToString = function(arr){   
        var str = ''; 
        arr = new Uint8Array(arr); 
        for(i in arr){ 
            str + = String.fromCharCode(arr [i]); 
        } 
        return str; 
    } 
        var r、a、c、h、o、t; 
        for(c = e.length、a = 0、r = ''; a <c;){
            if(h = 255&e [a ++]、a == c){ 
                r + = base64EncodeChars.charAt(h >> 2)、
                r + = base64EncodeChars.charAt((3&h)<< 4)、
                r + = '=='; 
                ブレーク
            } 
            if(o = e [a ++]、a == c){ 
                r + = base64EncodeChars.charAt(h >> 2)、
                r + = base64EncodeChars.charAt((3&h)<< 4 |(240&o )>> 4)、
                r + = base64EncodeChars.charAt((15&o)<< 2)、
                r + = '='; 
                ブレーク
            } 
            t = e [a ++]、 
            r + = base64EncodeChars。
            r + = base64EncodeChars.charAt((3&h)<< 4 |(240&o)>> 4)、
            r + = base64EncodeChars.charAt((15&o)<< 2 |(192&t)>> 6 )、
            r + = base64EncodeChars.charAt(63&t)
        } 
        return r 
    } 
    this.base64ToBytes = function(e){ 
        var r、a、c、h、o、t、d; 
        for(t = e.length、o = 0、d = []; o <t;){ 
            do 
                r = base64DecodeChars [255&e.charCodeAt(o ++)]; 
            while(o <t && r == -1); 
            if(r == -1)
                break; 
            do 
                a = base64DecodeChars [255&e.charCodeAt(o ++)];
            if(a == -1)6 |  
        dを返す 
                break; 
            d.push(r << 2 |(48&
            do { 
                if(c = 255&e.charCodeAt(o ++)、61 == c)
                    return d; 
                c = base64DecodeChars [c] 
            } while(o <t && c == -1); 
            if(c == -1)
                break; 
            d.push((15&a)<< 4 |(60&c)>> 2); 
            do { 
                if(h = 255&e.charCodeAt(o ++)、61 == h)
                    return d; 
                h = base64DecodeChars [h] 
            } while(o <t && h == -1); 
            if(h == -1)
                break; 
            d.push((3&c)<< 6 | h)
        } 
    } 
})(); 
// stringToBase64 stringToHex stringToBytes 
// base64ToString base64ToHex base64ToBytes 
// hexToBase64 hexToBytes     
// bytesToBase64 bytesToHex bytesToString 
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 +" | 12月密钥: "+ bytesToString(a)); 
        send("算法名: "+ b +" | Hex密钥: "+ bytesToHex(a)); 
        結果を返す;
    }
    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); 
        結果を返す; 
    } 
    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、 
        this.update(a、 b、c)
        send( "
        send( "更新:" + bytesToString(a)+ "|" + b + "|" + c); 
    } 
    mac.doFinal.overload()。implementation = function(){ 
        showStacks(); 
        var result = this.doFinal(); 
        send( "======================================"); 
        send( "doFinal结果:" + bytesToHex(result)); 
        send( "doFinal结果:" + bytesToBase64(result)); 
        結果を返す; 
    } 
    mac.doFinal.overload( '[B')。implementation = function(a){ 
        showStacks(); 
        var result = this.doFinal(a); 
        send( "======================================"); 
        send( "
        send( "doFinal结果:" + bytesToHex(result));
        send( "doFinal结果:" + bytesToBase64(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); 
        this.getInstance(a、b);を返します。
    } 
    md.getInstance.overload( 'java.lang.String')。implementation = function(a){ 
        showStacks(); 
        send( "======================================"); 
        send( "算法名:" + a); 
        this.getInstance(a);を返します。
    md.update.overload( '[B')。implementation = function(a){ 
        showStacks(); 
        send( "======================================"); 
        send( "update:" + bytesToString(a))は
        this.update(a);を返します。
    } 
    md.update.overload( '[B'、 'int'、 'int')。implementation = function(a、b、c){ 
        showStacks(); 
        send( "======================================"); 
        send( "更新:" + bytesToString(a)+ "|" + b + "|" + c); 
        this.update(a、b、c);を返します。
    } 
    md.digest.overload()。implementation = function(){ 
        showStacks(); 
        var result = this.digest(); 
        send( "digest结果:" + bytesToBase64(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)); 
        結果を返す; 
    } 
        var ivParameterSpec = Java.use( 'javax.crypto.spec.IvParameterSpec'); 
    ivParameterSpec。$ init.overload( '[B')。
        var result = this。$ init(a); 
        send( "======================================"); 
        send( "iv向量:" + bytesToString(a)); 
        send( "iv向量:" + bytesToHex(a)); 
        結果を返す; 
    } 
    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); 
        結果を返す; 
    } 
    cipher.update.overload( '[B')。implementation = function(a){ 
        showStacks();
        send( "======================================"); 
        send( "更新:" + bytesToString(a)); 
        結果を返す; 
    } 
    cipher.update.overload( '[B'、 'int'、 'int')。implementation = function(a、b、c){ 
        showStacks(); 
        var result = this.update(a、b、c); 
        send( "======================================"); 
        send( "更新:" + bytesToString(a)+ "|" + b + "|" + c); 
        結果を返す; 
    } 
    cipher.doFinal.overload()。implementation = function(){ 
        showStacks(); 
        var result = this.doFinal(); 
        send( "======================================");
        send( "doFinal结果:" + bytesToBase64(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)); 
        結果を返す; 
    } 
    var x509EncodedKeySpec = Java.use( 'java.security.spec.X509EncodedKeySpec'); 
    x509EncodedKeySpec。$ init.overload( '[B')。implementation = function(a){ 
        showStacks();
        send( "======================================"); 
        send( "RSA密钥:" + bytesToBase64(a)); 
        結果を返す; 
    } 
    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)); 
        結果を返す; 
    } 
}); 
「」; 
 = open(sys.argv [1]、' w + '、encoding = ' utf-8 ' 
 
def message(message、data):
     if message [ " type " ] == ' send ' print(u " [*] {0} " .format(message [ ' payload ' ]))
        fw.write(u " [*] {0} \ n " .format(message [ ' payload ' ]))
        fw.flush()
    else 
 
process = frida.get_remote_device()。attach(sys.argv [1 ])
script = process.create_script(jsCode)
script.on(" message " 、message)
script.load()
sys.stdin.read()

 

おすすめ

転載: www.cnblogs.com/easy-test/p/12703043.html