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

安卓应用程序的逆向工程

来源:本站整理 作者:佚名 时间:2017-09-20 TAG: 我要投稿
          return
    except:
        pass  
  if message['type'] == 'send':
     print('[*] {0}'.format(message['payload']))
  elif message['type'] == 'error':
    if "'encrypted' undefined" in message['description']:
          print('[!] Encrypted value not updated yet, try to rotate the device')
    else:
          print('[!] ' + message['description'])
  else:
    print message
      
jscode = open('punsec.js').read()
print('[+] Running')
process_name = 'com.punsec.demo'
device = frida.get_usb_device()
try:
    pid = device.get_process(process_name).pid
    print('[+] Process found')
except frida.ProcessNotFoundError:
    print('[+] Starting process')
    pid = device.spawn([process_name])
    device.resume(pid)
    time.sleep(1)
process = device.attach(pid)
script = process.create_script(jscode)
script.on('message', on_message)
script.load()
while True:
    time.sleep(1)
    if encrypted:
      script.post({'type':'encrypted','value':encrypted})
      break
sys.stdin.read()
让咱们逐步讲一些这些代码:
这个Encrypted变量最后是一个无范例的工具,它不久以后就会被剧原来将它更新为一个加密的值。这个 on_message 函数是一个回调函数可以或许被 frida 的 javascript 代码来应用,在javascript代码当中,咱们将注入到咱们法式的过程中往返调咱们的python代码。这个回调函数可以或许被经由过程在javascript代码中的send() 函数来履行。下一个变量是jscode, 它可以或许将咱们的js代码注入到法式的过程中。为了更便利咱们阅读,js代码被写到另一个文件中。Process_name变量是咱们的过程名字。咱们可以或许经由过程在adb shell中运转 "ps" 敕令 "pm list packages" 敕令获得咱们应用的过程名字。
这个 device 变量是来衔接咱们的USB装备(手机)的。Try except 用于处置非常(万一目的法式尚未在咱们的装备上运转的话,就会发生非常)。在晓得了运转法式的UID后,咱们可以或许挂接到目的法式上,而且在目的过程上注入jscode。经由过程应用js的 send() 函数,剧本就会开端注册咱们的回调函数。下面是 while 轮回,可以或许看到frida现实上是有何等的壮大,在这个轮回中,咱们检测能否encrypted变量它的范例曾经不是None了,假如它的范例发生了转变,剧本的post()函数将会发送一个信息将咱们的js代码注入到目的过程,而且信息将会被在js代码中的recv() 函数所处置。
在开端下一步的操纵以前,咱们必要对目的apk停止静态阐发。咱们起首要反编译apk而且将java bytecode转换为.java格局的代码来阅读。在这里,咱们应用的阐发工具是dex2jar。
$ ./d2j-dex2jar.sh CrackMe.apk
dex2jar CrackMe.apk -> ./CrackMe-dex2jar.jar
如今让咱们经由过程JD-GUI来阐发适才天生的CrackMe-dex2jar.jar文件
 

可以或许看到反编译后的代码与原始的java代码照样有很大的分歧的。咱们来阐发一下分歧的处所:起首可以或许很显著的看到资本 id由原来的R.x.x变换称为了数字格局的。
正如咱们下面看到的,MainActivity只包括一个 onCreate() 函数。咱们起首来看一下android应用的性命周期: 

可以或许看到: onCreate() 函数在app启动以后就运转。为了坚持应用的现实功效,咱们如今就在hook这个函数,来履行对原始函数的挪用,可以或许获得到今朝activity的上下文来获得一些字符串的值,就像下面这一行异样:

String str = MainActivity.this.getString(2131099669);
如今让咱们创立punsec.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)});
    };
});
Java.perform() 是 frida 界说的,它的功效是:奉告frida server来运转曾经包装好的js代码。 Java.use() 是一个包装器为了可以或许静态的加载packages到咱们的目的过程中。为了下一步的必要,咱们将会应用send() 回调函数来发送数据到咱们的python法式中。如今运转着的python剧本给咱们前往了如许的信息:
$ python punsec.py
[+] Running
[+] Starting process
[+] Received str : vXrMphqS3bWfIGT811/V2Q==
要记着,要想onCreate() 函数触发,必需要履行回调函数,也便是在启动过程以后,必需要让它在后盾运转后再关上法式,请参考下面的Activity性命周期。
咱们也看到了代码中有几个挪用来履行 Base64.decode() 和经由过程数字id来获得string, 咱们能够也会必要这些值,以是让咱们来改动一下咱们的代码

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

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