#-*-コーディング: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()