Android逆向-Android基础逆向(2-2)-创新互联

[toc]

创新互联公司是一家企业级云计算解决方案提供商,超15年IDC数据中心运营经验。主营GPU显卡服务器,站群服务器,西部信息机房,海外高防服务器,成都机柜租用,动态拨号VPS,海外云手机,海外云服务器,海外服务器租用托管等。

#0x00 前言
##不知所以然,请看
Android逆向-Android基础逆向(1)
Android逆向-Android基础逆向(2)
##以及java系列:
Android逆向-java代码基础(1)
Android逆向-java代码基础(2)
Android逆向-java代码基础(3)
Android逆向-java代码基础(4)
Android逆向-java代码基础(5)
Android逆向-java代码基础(6)
Android逆向-java代码基础(7)
Android逆向-java代码基础(8)
由于之前的Android逆向-Android基础逆向(2)的伪加密部分篇幅太长,导致其他内容没有完成,所以才有了这里的Android逆向-Android基础逆向(2-2)。希望可以完成计划中的内容。
##学习内容
(1)APK文件伪加密√
(2)资源文件防反编译
(3)apk打包流程
(4)apk反编译流程
(5)apk回编译流程、
#0x01 资源文件防反编译
之前说过可以通过更改第四个字段来进行防止一定程度的反编译。那么除了这种伪加密的方式,还有什么方式可以防止这种伪加密的出现呢。
来看看资源文件是如何防止反编译的。
自然我们需要研究一下xml文件的格式。四哥在2016年已经分析过了,不过那是人家分析的,只看别人分析的不能进行更深入的学习。纸上得来终觉浅,绝知此事要躬行。so,就有了这篇。
##1.第一个模块
Android逆向-Android基础逆向(2-2)
这里对应使用一个实例分析,就用Android逆向-Android基础逆向(1)中的简单的apk来分析吧。
###1.1 Magic Number
Android逆向-Android基础逆向(2-2)
这里魔数是00 08 00 03,这个是一个固定的值。
###1.2File Size
这个就是用来确认文件大小的。
Android逆向-Android基础逆向(2-2)
这里是00 00 07 90 ,也就是1970个bytes。
###1.3用python实现分析
四哥用java写的,我就献丑写个python的,还在学习python的过程中,有什么错误或者做的不好的地方,还请见谅。
这个是实现这个模块的代码。但是感觉自己写的好繁琐,等一会儿适当修改一下。
2018年1月27日11:57:35,忙别的事情去了。

def fenxi(filename):
    try:
        f=open(filename,'rb')
        print 'start--------'
        i=0
        p1=""
        p2=""
        p3=""
        p4=""
        p=""
       while True:
            t=f.read(1)
            t1=t.encode('hex')
            if i==0:
                p1=t1
            if i==1:
                p2=t1
            if i==2:
                p3=t1
            if i==3:
                p4=t1
            i=i+1
            if i<4:
                p=p+" "
            if i==4:
                break
            pass
        p=p4+" "+p3+" "+p2+" "+p1   
        print "Magic Number:",p
        i=0
        p1=""
        p2=""
        p3=""
        p4=""
        p=""
       while True:
            t=f.read(1)
            t1=t.encode('hex')
            if i==0:
                p1=t1
            if i==1:
                p2=t1
            if i==2:
                p3=t1
            if i==3:
                p4=t1
            i=i+1
            if i<4:
                p=p+" "
            if i==4:
                break
            pass
        p=p4+" "+p3+" "+p2+" "+p1   
        print "FileSize:",p
    except IOError:
        print "This is bad for input '",name,"'." 
        print "You can enter -h for help." 

2.第二个模块

Android逆向-Android基础逆向(2-2)
###1.Chunk Type
String Chunk 的标识符,默认是00 08 00 03
Android逆向-Android基础逆向(2-2)

2.Chunk Size

String Chunk的大小。
Android逆向-Android基础逆向(2-2)
Android逆向-Android基础逆向(2-2)

3.String Count

字符串的个数。
Android逆向-Android基础逆向(2-2)

4.Style Count

样式的个数
Android逆向-Android基础逆向(2-2)
Android逆向-Android基础逆向(2-2)

5.Unknow

Android逆向-Android基础逆向(2-2)
Android逆向-Android基础逆向(2-2)

6.String Pool Offset

首部偏移量,也就是String Chunk的位置。
Android逆向-Android基础逆向(2-2)
Android逆向-Android基础逆向(2-2)

7.Style Pool Offset

样式偏移,但是因为样式没有。所以这里全部为0

8.String Offsets

这个是字符串偏移,大小就是String count*4个bytes
Android逆向-Android基础逆向(2-2)

9.常量池

这个就是最主要的地方了。不过中间有一个0的空字符串。需要注意,然后使用一个循环就可以简单的分析出来了。
这里帖出代码部分。

while True:
            t1=f.read(1)
            t2=f.read(1)
            tf1=t1.encode('hex')
            tf2=t2.encode('hex')
            p1=tf2+tf1
            ph=int(p1, 16)
            p3=""
            i=0
           while True:
                t=f.read(1)
                t1=t.encode('hex')
                p=int(t1, 16)
                p3=p3+chr(p)
                t=f.read(1)
                i=i+1
                if i==ph:
                    break
                pass
            print "first string:",p3
            t=f.read(2)
            if l==12:
                t=f.read(4)
            l=l+1
            if l==x-1:

                break

运行结果展示:
Android逆向-Android基础逆向(2-2)
Android逆向-Android基础逆向(2-2)

3.第三个模块 Resourceld Chunk

Android逆向-Android基础逆向(2-2)
这个Chunk主要是存放的是AndroidManifest中用到的系统属性值对应的资源Id

3.1 Chunk Type

和其他Chunk一样,都有特征值,Resourceld Chunk的特征值是:0x00080108
Android逆向-Android基础逆向(2-2)

3.2 Chunk Size

Size大小没有什么好解释的。
Android逆向-Android基础逆向(2-2)

3.3Resourcelds

Android逆向-Android基础逆向(2-2)
Android逆向-Android基础逆向(2-2)
这里可以根据id在frameworks\base\core\res\res\values\public.xml中查找到相对应的string。
一下是简单的代码模块:

a=p/4-2
        i1=0
       while True:
            i=0
            p1=""
            p2=""
            p3=""
            p4=""
            p=""
           while True:
                t=f.read(1)
                t1=t.encode('hex')
                if i==0:
                    p1=t1
                if i==1:
                    p2=t1
                if i==2:
                    p3=t1
                if i==3:
                    p4=t1
                i=i+1
                if i==4:
                    break
                pass
            p=p4+p3+p2+p1   
            p5=p4+" "+p3+" "+p2+" "+p1
            p=int(p, 16)
            print "123id:",p,"bytes","hex:",p5
            i1=i1+1
            if i1==a:
                break

4.第四个模块

Android逆向-Android基础逆向(2-2)
这个Chunk主要包含一个AndroidManifest文件中的命令空间的内容

4.1 Chunk Type

特征码,这里不强调了。 特征码是00 10 01 00。
Android逆向-Android基础逆向(2-2)

4.2 Chunk Size

Chunk的大小。
Android逆向-Android基础逆向(2-2)

4.3 Line Number

在AndroidManifest文件中的行号
Android逆向-Android基础逆向(2-2)

4.4Unknown

未知区域,一般是ffff
Android逆向-Android基础逆向(2-2)

4.5 Prefix

命名空间的前缀
Android逆向-Android基础逆向(2-2)

4.6Uri

命名空间的Urk
Android逆向-Android基础逆向(2-2)

5.第五个模块

这个模块主要是为了存放标签信息
这里要啰嗦了。第五个模块要写完的时候,突然鼠标的返回键被按到了。我都在想是不是应该在本地写了,而不是在云端写,太感人了这个。伤心。准备偷懒了。
Android逆向-Android基础逆向(2-2)

5.1 Chunk Type

标志字段,固定字符。
00 10 01 02

5.2 Chunk Size

Chunk 大小

5.3 Line Number

行数,和上一个段一样

5.4 Unknown

位置区域

5.5Namespace Uri

标签用的uri,但是也有可能是返回 ff ff ff ff。
代码实现:

i=0
    p1=""
    p2=""
    p3=""
    p4=""
    p=""
   while True:
        t=f.read(1)
        t1=t.encode('hex')
        if i==0:
            p1=t1
        if i==1:
            p2=t1
        if i==2:
            p3=t1
        if i==3:
            p4=t1
        i=i+1
        if i==4:
            break
        pass
    p=p4+p3+p2+p1   
    p=int(p, 16)
    try :
        print "Namespace Uri:",list[p]      
    except IndexError:
        print "Namespace Uri is nothing"

Android逆向-Android基础逆向(2-2)

5.6 name

标签名称字段
Android逆向-Android基础逆向(2-2)

5.7 flags字段

标识是开始flags还是结束flags
Android逆向-Android基础逆向(2-2)

5.8 Attribute Count

包含属性的个数
Android逆向-Android基础逆向(2-2)

5.9 Class Attribute

标签包含的类属性
Android逆向-Android基础逆向(2-2)

5.10Attributes Attribute

属性内容。包括NamespaceUri,Name,ValueString,type,Data,这五个字段。
Android逆向-Android基础逆向(2-2)

6.第六个模块

Android逆向-Android基础逆向(2-2)
这个和第五个块一样。
Android逆向-Android基础逆向(2-2)

7.第七个模块

因为是和之前的模块一样这里就不做解释了
Android逆向-Android基础逆向(2-2)

收获

##python
1.python右移的方式
2.python格式转换
3.对二进制模块分析
4.这个是大的收货,得到了一个xml文件分析工具。
5.github地址:xml.py文件分析

结束语

感觉这里需要的内容很多,就得要分成很多小块来说。为什么这里要写关于xml的分析呢,因为加固的目的就是为了防止反编译。那么我们可以针对反编译软件进行针对化加固,在下一个小块将会详细讲解。

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


网站名称:Android逆向-Android基础逆向(2-2)-创新互联
标题链接:http://myzitong.com/article/dpippp.html