用户
搜索
  • TA的每日心情
    开心
    前天 13:21
  • 签到天数: 130 天

    连续签到: 1 天

    [LV.7]常住居民III

    i春秋作家

    推荐小组成员

    Rank: 7Rank: 7Rank: 7

    113

    主题

    279

    帖子

    1032

    魔法币
    收听
    0
    粉丝
    18
    注册时间
    2017-7-24

    幽默灌水王突出贡献春秋文阁i春秋签约作者i春秋推荐小组积极活跃奖春秋游侠秦

    HAI_ i春秋作家 推荐小组成员 幽默灌水王 突出贡献 春秋文阁 i春秋签约作者 i春秋推荐小组 积极活跃奖 春秋游侠 秦 楼主
    发表于 2018-1-29 12:51:55 14670

    [toc]

    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基础逆向(1)中的简单的apk来分析吧。

    1.1 Magic Number

    这里写图片描述
    这里魔数是00 08 00 03,这个是一个固定的值。

    1.2File Size

    这个就是用来确认文件大小的。
    这里写图片描述
    这里是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.第二个模块

    这里写图片描述

    1.Chunk Type

    String Chunk 的标识符,默认是00 08 00 03
    这里写图片描述

    2.Chunk Size

    String Chunk的大小。
    这里写图片描述
    这里写图片描述

    3.String Count

    字符串的个数。
    这里写图片描述

    4.Style Count

    样式的个数
    这里写图片描述
    这里写图片描述

    5.Unknow

    这里写图片描述
    这里写图片描述

    6.String Pool Offset

    首部偏移量,也就是String Chunk的位置。
    这里写图片描述
    这里写图片描述

    7.Style Pool Offset

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

    8.String Offsets

    这个是字符串偏移,大小就是String count*4个bytes
    这里写图片描述

    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
    

    运行结果展示:
    这里写图片描述
    这里写图片描述

    3.第三个模块 Resourceld Chunk

    这里写图片描述
    这个Chunk主要是存放的是AndroidManifest中用到的系统属性值对应的资源Id

    3.1 Chunk Type

    和其他Chunk一样,都有特征值,Resourceld Chunk的特征值是:0x00080108
    这里写图片描述

    3.2 Chunk Size

    Size大小没有什么好解释的。
    这里写图片描述

    3.3Resourcelds

    这里写图片描述
    这里写图片描述
    这里可以根据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.第四个模块

    这里写图片描述
    这个Chunk主要包含一个AndroidManifest文件中的命令空间的内容

    4.1 Chunk Type

    特征码,这里不强调了。 特征码是00 10 01 00。
    这里写图片描述

    4.2 Chunk Size

    Chunk的大小。
    这里写图片描述

    4.3 Line Number

    在AndroidManifest文件中的行号
    这里写图片描述

    4.4Unknown

    未知区域,一般是ffff
    这里写图片描述

    4.5 Prefix

    命名空间的前缀
    这里写图片描述

    4.6Uri

    命名空间的Urk
    这里写图片描述

    5.第五个模块

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

    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"

    这里写图片描述

    5.6 name

    标签名称字段
    这里写图片描述

    5.7 flags字段

    标识是开始flags还是结束flags
    这里写图片描述

    5.8 Attribute Count

    包含属性的个数
    这里写图片描述

    5.9 Class Attribute

    标签包含的类属性
    这里写图片描述

    5.10Attributes Attribute

    属性内容。包括NamespaceUri,Name,ValueString,type,Data,这五个字段。
    这里写图片描述

    6.第六个模块

    这里写图片描述
    这个和第五个块一样。
    这里写图片描述

    7.第七个模块

    因为是和之前的模块一样这里就不做解释了
    这里写图片描述

    0x02收获

    python

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

    0x03 结束语

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

    走过路过,留下魔法币可好,嘿嘿嘿

    评分

    参与人数 2积分 +30 魔法币 +5 收起 理由
    W1ngs + 5 感谢你的分享,i春秋论坛有你更精彩!.
    Aedoo + 30 表哥666

    查看全部评分

    本帖被以下淘专辑推荐:

    破解的目的是为了更好的开发
    发表于 2018-2-2 11:46:44
    感谢分享
    使用道具 举报 回复
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册