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

Android安卓 SO自动化逆向分析

来源:本站整理 作者:佚名 时间:2017-09-29 TAG: 我要投稿

历久从事Android SO静态库阐发时,时常会做一些重复性较高的事情。比方,SO库中的Java_com_xxx_yyy()等一体系与Java层桥接的办法,逆向它们时,平日必要做以下事情:

IDA Pro载入SO,完成第一次的反编译。

导入jni.h头文件,引入JNINativeInterface与JNIInvokeInterface布局体信息。

设置Java_com_xxx_yyy()范例办法的前两个参数为JNIEnv* env与jobject thiz。

假如有F5插件,则停止一次Force call type。

......。

将这些事情主动化,可以或许大大的进步逆向阐发的事情效力。基于IDA Pro供给的剧本与插件体系,可以或许很便利的完成以上前3项事情。上面,咱们一步步来打造一个SO主动化逆向阐发的对象。

目的细化


在开端完成一个对象前,必要将这些必要办理的成绩停止一次量化阐发。

起首,若何定位必要处置的SO库办法?因为Java_com_xxx_yyy()范例办法与Java层停止桥接,在java层代码中一定会有它的申明。一切的这些办法在Java代码中会有一个native属性,只必要遍历Java层的代码,获得一切的native办法便可。

其次,分歧的办法有分歧的参数范例,署名的分歧,该若何处置?为了让对象完成起来过于繁杂,咱们只处置Java中内置的数据范例,自界说的数据范例同一应用jobject停止处置与表现。

末了,就是将获得到的Java层的一切native办法信息与IDA Pro中的响应的办法停止逐一的对应,并停止办法的主动化范例处置,这就必要用到IDA Pro的剧本功效。

功效完成


明白了以上的3个步调后,上面来着手逐一的完成它。

剖析native办法

为了疾速的剖析native办法,我开端想到的是应用grep敕令(体系为macOS)。起首,应用JD-GUI反编译APK,导出一切的Java源文件,而后在敕令行下履行:


$ grep ' native ' -r ./java_dir -h public native String stringFromJNI();
或许履行以下敕令:


$ grep -Eo '^( |public|private|protected).* native .*;' -r ./java_dir -h public native String stringFromJNI();
不错,都可以或许准确获得到native办法,固然输入的后面会有一个JD-GUI反编译带的空格。

为了让Windows的用户,即使在不装置Mingw或其他的Linux模仿情况的情况下,也可以或许准确的获得到办法,我照样决议应用Python来写一个天生办法署名信息的剧本。就即名叫make_sig.py好了。

Python的便捷,让我可以或许很便利地在敕令行下测试re模块的正则表达式,以下:

$ python
Python 2.7.10 (default, Feb  7 2017, 00:08:15)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.34)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> l = "  public static native long nativeLoadMaster(String paramString, byte[] paramArrayOfByte1, String[] paramArrayOfString, byte[] paramArrayOfByte2);"
>>> rr = re.match('^( |public|private|protected).* native (.*) (.*)[(](.*)[)];', l)
>>> print "{}".format(rr.group(0))
  public static native long nativeLoadMaster(String paramString, byte[] paramArrayOfByte1, String[] paramArrayOfString, byte[] paramArrayOfByte2);
>>> print "{}".format(rr.group(1))
 
>>> print "{}".format(rr.group(2))
long
>>> print "{}".format(rr.group(3))
nativeLoadMaster
>>> print "{}".format(rr.group(4))
String paramString, byte[] paramArrayOfByte1, String[] paramArrayOfString, byte[] paramArrayOfByte2
OK,正则表达式弄对了!可以或许准确的剖析一条native办法的一切信息:前往值、办法名、署名。我这里不盘算睁开若何编写正则表达式,因为我感到很多人应当会了,假如你对付正则表达式不太熟,倡议你到这个链接疾速的进修一下:https://github.com/zeeshanu/learn-regex  。

上面的代码片段是剖析一个目次下一切的文件,找到native办法并保留到指定的文件中:

def make_sig_file(java_src_dir, sig_file):
    f = file(sig_file, 'w+')
    for parent, dirnames, filenames in os.walk(java_src_dir):
        for filename in filenames:
            #print "file: " + os.path.join(parent, filename)
            filepath = os.path.join(parent, filename)
            with open(filepath) as o:
                content = o.read()
                for m in re.finditer('( |public|private|protected).* native (.*) (.*)[(](.*)[)];', content):
                    rr = re.match('package (.*?);.*?class ([^\s]+)', content, re.S)
                    pkg_name = rr.group(1)
                    class_name = rr.group(2)
                    func_name = m.group(3)

[1] [2] [3] [4]  下一页

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