欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

安卓应用程序的逆向工程

来源:本站整理 作者:佚名 时间:2017-09-20 TAG: 我要投稿
        send('UserInput : ' + x);
        return this.a(x,y);
    }
 
});
再次运转咱们的python法式,察看输入有哪些转变:
$ python punsec.py
[+] Running
[+] Process found
[*] Base64 Encoded : TXlTdXBlclNlY3JldEwzM3RQYXNzdzByZA==
[*] Base64 Decoded : MySuperSecretL33tPassw0rd
[*] UserInput : wrongSecretTest
极好的,咱们如今可以或许拦阻咱们的输入了。如今咱们可以或许发明 Util 类还有一个函数 Util.a(byte, SecretKey) 不停没有在app中应用,经由过程阐发可以或许看到这是一个解密函数。以是如今咱们该若何做呢? 加密函数曾经接管到了密钥,以是咱们可以或许在解密函数中应用,然则咱们还必要第一个参数。第一个参数是一个 base64 解密的string 变量。以是让咱们来改动咱们的代码,为了可以或许在咱们的 js中收到这个参数,而且过掉这个解密函数,如许的话,咱们就可以解密终极的Key来完成此次挑衅。如今末了一次改动咱们的js代码:
Java.perform(function () {
    var MainActivity = Java.use('com.punsec.demo.MainActivity');
    MainActivity.onCreate.implementation = function(a) {
        this.onCreate(a);
        send({'encrypted':this.getString(2131099669)});
    };
    var base64 = Java.use('android.util.Base64');
    base64.decode.overload('java.lang.String', 'int').implementation = function(x, y) {
        // send('Base64 Encoded : ' + x);
        // var buf = new Buffer(base64.decode(x, y));
        // send('Base64 Decoded : ' + buf.toString());
        return base64.decode(x, y);
    }
    var Util = Java.use('com.punsec.demo.Util');
    Util.a.overload('java.lang.String', 'javax.crypto.SecretKey').implementation = function(x, y) {
        recv('encrypted', function onMessage(payload) {
            encrypted = payload['value'];
        });
        cipher = base64.decode(encrypted, 0); // call the above base64 method
        secret = this.a(cipher, y); // call decrypt method
        send('Decrypted : ' + secret)
        return this.a(secret,y);
    }
 
});
咱们把一个 recv() 挪用放在了函数中以便于可以或许收到咱们写的python法式中曾经存储的加密string。如今解密这个曾经被加密过的base64密钥而且和密钥一路发送到解密函数中。如今让咱们再一次运转咱们的python法式:
$ python punsec.py
[+] Running
[+] Process found
[!] Encrypted value not updated yet, try to rotate the device
[+] Received str : vXrMphqS3bWfIGT811/V2Q==
[*] Decrypted : knb*AS234bnm*0
woah, 咱们获得了key。这也会笼罩掉任何的用户输入并将其调换为解密的string, 以是如今每个用户输入都是起作用的: 

如今咱们不仅用现实的secret笼罩了用户输入,而且还笼罩了现实的secret phrase为了经由过程这个挑衅。
假使咱们的apk应用中没有解密函数,咱们该怎么办呢? 不用担忧,咱们能奇妙的将js代码拔出到package中来履行解密操纵而且用必要的参数笼罩这个办法,或许咱们还可以或许用下面的python代码来解密:
import frida, sys, time, md5
from Crypto.Cipher import AES
 
encrypted = None
secretKey = None
 
 
def decrypt(encrypted, key):
  key = md5.new(key).hexdigest()[:16]
  cipher = AES.new(key)
  decrypted = cipher.decrypt(encrypted.decode('base64'))[:14]
 
  for i in range(1,len(encrypted.decode('base64'))/16):
    cipher = AES.new(key, AES, encodedEncrypted.decode('base64')[(i-1)*16:i*16])
    decrypted += cipher.decrypt(encodedEncrypted.decode('base64')[i*16:])[:16]
 
  return decrypted.strip()
 
def on_message(message, data):
    global encrypted, secretKey
    try:
      if not encrypted:
        encrypted = message['payload']['encrypted']
      if not secretKey:
        secretKey = message['payload']['secretKey']
    except:
      pass
    if message['type'] == 'send':
      print('[*] {0}'.format(message['payload']))
    elif message['type'] == 'error':

上一页  [1] [2] [3] [4] [5] [6] [7] [8] [9]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载