BubblePig 发表于 2018-1-29 12:56

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

本帖最后由 BubblePig 于 2018-1-30 12:06 编辑



#0x00 前言
##不知所以然,请看
(https://www.52pojie.cn/thread-691091-1-1.html)
##以及java系列:
(https://www.52pojie.cn/thread-690674-1-1.html)
(https://www.52pojie.cn/thread-684492-1-1.html)
(https://www.52pojie.cn/thread-690679-1-1.html)
(https://www.52pojie.cn/thread-685752-1-1.html)
(https://www.52pojie.cn/thread-690689-1-1.html)
(https://www.52pojie.cn/thread-689279-1-1.html)
(https://www.52pojie.cn/thread-689936-1-1.html)
(https://www.52pojie.cn/thread-690542-1-1.html)
由于之前的Android逆向-Android基础逆向(2)的伪加密部分篇幅太长,导致其他内容没有完成,所以才有了这里的Android逆向-Android基础逆向(2-2)。希望可以完成计划中的内容。
##学习内容
(1)APK文件伪加密√
(2)资源文件防反编译
(3)apk打包流程
(4)apk反编译流程
(5)apk回编译流程、
#0x01 资源文件防反编译
之前说过可以通过更改第四个字段来进行防止一定程度的反编译。那么除了这种伪加密的方式,还有什么方式可以防止这种伪加密的出现呢。
来看看资源文件是如何防止反编译的。
自然我们需要研究一下xml文件的格式。四哥在2016年已经分析过了,不过那是人家分析的,只看别人分析的不能进行更深入的学习。纸上得来终觉浅,绝知此事要躬行。so,就有了这篇。
##1.第一个模块
![这里写图片描述](http://t1.aixinxi.net/o_1c4qonh643er1mfetkl1rqc1mr5a.png-j.jpg)
这里对应使用一个实例分析,就用Android逆向-Android基础逆向(1)中的简单的apk来分析吧。
###1.1 Magic Number
![这里写图片描述](http://t1.aixinxi.net/o_1c4qoqk4l1veta0e1a7s1f9p8uta.png-j.jpg)
这里魔数是00 08 00 03,这个是一个固定的值。
###1.2File Size
这个就是用来确认文件大小的。
![这里写图片描述](http://t1.aixinxi.net/o_1c4qp0f6a4i5rnbuut18tk6opa.png-j.jpg)
这里是00 00 07 90 ,也就是1936个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.第二个模块

![这里写图片描述](http://t1.aixinxi.net/o_1c4raf87m1qb53ub1bn03hes46a.png-j.jpg)
###1.Chunk Type
String Chunk 的标识符,默认是00 08 00 03
![这里写图片描述](http://t1.aixinxi.net/o_1c4t961av1sqkc3bqb31ptoqrfa.png-j.jpg)
### 2.Chunk Size
String Chunk的大小。
![这里写图片描述](http://t1.aixinxi.net/o_1c4t97kka6eu6is1ooa1cdq1b77a.png-j.jpg)
![这里写图片描述](http://t1.aixinxi.net/o_1c4ta8i7g1atjkgo1krgjln1vjma.png-j.jpg)
### 3.String Count
字符串的个数。
![这里写图片描述](http://t1.aixinxi.net/o_1c4tabv5oihr1agl12ag1u8a1dr1a.png-j.jpg)
### 4.Style Count
样式的个数
![这里写图片描述](http://t1.aixinxi.net/o_1c4tbuj8p3hatub1job14ambm3a.png-j.jpg)
![这里写图片描述](http://t1.aixinxi.net/o_1c4tc06m81shmvj81gd7dqd1r6ga.png-j.jpg)
### 5.Unknow
![这里写图片描述](http://t1.aixinxi.net/o_1c4tc2oq8nmlnhl12g1fe8bena.png-j.jpg)
![这里写图片描述](http://t1.aixinxi.net/o_1c4tc4cpf1dv216076an125q214a.png-j.jpg)
### 6.String Pool Offset
首部偏移量,也就是String Chunk的位置。
![这里写图片描述](http://t1.aixinxi.net/o_1c4tcgkpu1m5d5rm14uc3db1g55a.png-j.jpg)
![这里写图片描述](http://t1.aixinxi.net/o_1c4tcn54mdmd1834jjvkpb1fka.png-j.jpg)
### 7.Style Pool Offset
样式偏移,但是因为样式没有。所以这里全部为0
### 8.String Offsets
这个是字符串偏移,大小就是String count*4个bytes
![这里写图片描述](http://t1.aixinxi.net/o_1c4te093usgq1s8513hes8cucva.png-j.jpg)
### 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

```
运行结果展示:
![这里写图片描述](http://t1.aixinxi.net/o_1c4ttibvi6s7tg6enjiup1292a.png-j.jpg)
![这里写图片描述](http://t1.aixinxi.net/o_1c4ttk2stnrb1nma1alt19u2apa.png-j.jpg)
## 3.第三个模块 Resourceld Chunk
![这里写图片描述](http://t1.aixinxi.net/o_1c4tuf7o5h2djuk173goukc5ba.png-j.jpg)
这个Chunk主要是存放的是AndroidManifest中用到的系统属性值对应的资源Id
### 3.1 Chunk Type
和其他Chunk一样,都有特征值,Resourceld Chunk的特征值是:0x00080108
![这里写图片描述](http://t1.aixinxi.net/o_1c4tusbp913jb191la0otpm1b5ea.png-j.jpg)
### 3.2 Chunk Size
Size大小没有什么好解释的。
![这里写图片描述](http://t1.aixinxi.net/o_1c4tv90jkhng1bcr1qurmjr10ana.png-j.jpg)
### 3.3Resourcelds
![这里写图片描述](http://t1.aixinxi.net/o_1c4u0g6be1thrd4dq81pvt1ma4a.png-j.jpg)
![这里写图片描述](http://t1.aixinxi.net/o_1c4u0l2uu36sq2h1dhi14t8106ra.png-j.jpg)
这里可以根据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.第四个模块
![这里写图片描述](http://t1.aixinxi.net/o_1c4u176rcq9ng9c9u5uhdbnga.png-j.jpg)
这个Chunk主要包含一个AndroidManifest文件中的命令空间的内容
### 4.1 Chunk Type
特征码,这里不强调了。 特征码是00 10 01 00。
![这里写图片描述](http://t1.aixinxi.net/o_1c4u1ftk71uq419to8po1bpo4qna.png-j.jpg)
### 4.2 Chunk Size
Chunk的大小。
![这里写图片描述](http://t1.aixinxi.net/o_1c4u1ii0d1unhgsc6ss1i2b157aa.png-j.jpg)
### 4.3 Line Number
在AndroidManifest文件中的行号
![这里写图片描述](http://t1.aixinxi.net/o_1c4u1t3ul191od9ti498j1c4na.png-j.jpg)
### 4.4Unknown
未知区域,一般是ffff
![这里写图片描述](http://t1.aixinxi.net/o_1c4u1ubh2ga4991ts5cav9u5a.png-j.jpg)
### 4.5 Prefix
命名空间的前缀
![这里写图片描述](http://t1.aixinxi.net/o_1c4u27fv4v3r96al5a1arkj8ea.png-j.jpg)
### 4.6Uri
命名空间的Urk
![这里写图片描述](http://t1.aixinxi.net/o_1c4u2ems7nst319kdnir7ugra.png-j.jpg)
## 5.第五个模块
这个模块主要是为了存放标签信息
这里要啰嗦了。第五个模块要写完的时候,突然鼠标的返回键被按到了。我都在想是不是应该在本地写了,而不是在云端写,太感人了这个。伤心。准备偷懒了。
![这里写图片描述](http://t1.aixinxi.net/o_1c4vqek6a10e5i9q5rt1v1ndl4a.png-j.jpg)
### 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               
                except IndexError:
                        print "Namespace Uri is nothing"
![这里写图片描述](http://t1.aixinxi.net/o_1c4vrd0stg5t1jsjvcqjsf50ra.png-j.jpg)
### 5.6 name
标签名称字段
![这里写图片描述](http://t1.aixinxi.net/o_1c4vrfl2d1hpj1hqq183m97g16sma.png-j.jpg)
### 5.7 flags字段
标识是开始flags还是结束flags
![这里写图片描述](http://t1.aixinxi.net/o_1c4vrhl1t66fhj6qmc1vdsgv3a.png-j.jpg)
### 5.8 Attribute Count
包含属性的个数
![这里写图片描述](http://t1.aixinxi.net/o_1c4vrnnsl1n2h19ku157v9bbaqta.png-j.jpg)
### 5.9 Class Attribute
标签包含的类属性
![这里写图片描述](http://t1.aixinxi.net/o_1c4vs6e53h6r1ql10dp1hrk1ekta.png-j.jpg)
### 5.10Attributes Attribute
属性内容。包括NamespaceUri,Name,ValueString,type,Data,这五个字段。
![这里写图片描述](http://t1.aixinxi.net/o_1c4vuq1sj139con61la41d29rra.png-j.jpg)
## 6.第六个模块
![这里写图片描述](http://t1.aixinxi.net/o_1c4vunqga1jgq6r91j2414nv1c80a.png-j.jpg)
这个和第五个块一样。
![这里写图片描述](http://t1.aixinxi.net/o_1c4vvs4jebbt1mmeo1h1gfk4vja.png-j.jpg)
## 7.第七个模块
因为是和之前的模块一样这里就不做解释了
![这里写图片描述](http://t1.aixinxi.net/o_1c5005t11cjf1vh21ij3122b1tr8a.png-j.jpg)
# 收获
##python
1.python右移的方式
2.python格式转换
3.对二进制模块分析
4.这个是最大的收货,得到了一个xml文件分析工具。
5.github地址:(https://github.com/HLHai/HAI/blob/master/xml.py)
# 结束语
感觉这里需要的内容很多,就得要分成很多小块来说。为什么这里要写关于xml的分析呢,因为加固的目的就是为了防止反编译。那么我们可以针对反编译软件进行针对化加固,在下一个小块将会详细讲解。

筱瞄熊 发表于 2018-1-29 13:27

图片挂了,看不到啊/5666666

binbin240125 发表于 2018-1-29 13:38

感谢楼主分享!学习中~~~

wanmei195634 发表于 2018-1-29 15:30

不搜藏就对不起楼主阁下

kk1212 发表于 2018-1-29 19:06

筱瞄熊 发表于 2018-1-29 13:27
图片挂了,看不到啊/5666666

图片可以显示的 ,你再试试看

BubblePig 发表于 2018-1-29 19:19

筱瞄熊 发表于 2018-1-29 13:27
图片挂了,看不到啊/5666666

哪一张挂了

Andy0214 发表于 2018-1-30 08:16

l楼主大小算错了吧,应该是1936字节

Andy0214 发表于 2018-1-30 08:39

我用你的py脚本解析出来后面好多全是乱码,怎么回事??

BubblePig 发表于 2018-1-30 12:06

Andy0214 发表于 2018-1-30 08:16
l楼主大小算错了吧,应该是1936字节

thanks~~

筱瞄熊 发表于 2018-1-30 14:42

第二三四,这三个模块的图片我都看不到了……不知道是不是网络问题,
页: [1] 2
查看完整版本: Android逆向-Android基础逆向(2-2)