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

[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.第七个模块

因为是和之前的模块一样这里就不做解释了

收获

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

结束语

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

原文地址:http://blog.51cto.com/12213986/2066337

时间: 2024-09-30 01:52:20

Android逆向-Android基础逆向(2-2)的相关文章

Android逆向系列文章— Android基础逆向(6)

本文作者:HAI_ 0×00 前言 不知所以然,请看 Android逆向-Android基础逆向(1) Android逆向-Android基础逆向(2) Android逆向-Android基础逆向(2-2) Android逆向-Android基础逆向(2-3补充篇) Android逆向-Android基础逆向(3) Android逆向-Android基础逆向(4) Android逆向-Android基础逆向(4-2) Android逆向-Android基础逆向(5) 以及java系列: Andr

逆向Android软件的步骤

逆向Android软件的步骤: 首先使用反编译的工具对反编译,然后阅读反汇编代码,如果有必要还会对其进行动态调试,找到突破口后注入或直接修改反汇编代码,最后重新编译软件进行测试.整个过程可分为反编译.静态分析.动态调试.重编译等4个环节. 结论:反破解技术也是从这四个方面进行的. 一.对抗反编译工具(如ApkTool.BackSmali.dex2jar),使其无法进行反编译,或者反编译后无法得到软件正确的反汇编代码. 思路是:寻找反编译工具在处理apk或dex文件时的缺陷,然后在自己的软件中加以

Android应用开发基础篇(12)-----Socket通信(转载)

转自:http://www.devdiv.com/android_socket_-blog-258060-10594.html 一.概述 网络通信无论在手机还是其他设备上都应用得非常广泛,因此掌握网络编程是非常有必要的,而我觉得socket编程是网络编程的基础.在进入正题之前,先介 绍几点网络知识,一:socket编程有分TCP和UDP两种,TCP是基于连接的,而UDP是无连接的:二:一个TCP连接包括了输入和输出两条独立的 路径:三:服务器必须先运行然后客户端才能与它进行通信.四:客户端与服务

Java(Android)线程池---基础篇

1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? 1 newThread(newRunnable(){ 2 3 @Override 4 publicvoidrun(){ 5 // TODO Auto-generated method stub 6 } 7 }).start(); 那你就out太多了,new Thread的弊端如下: a. 每次new Thread新建对象性能差.b. 线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致

Android应用开发基础篇(12)-----Socket通信

链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/03/2378669.html 一.概述 网络通信无论在手机还是其他设备上都应用得非常广泛,因此掌握网络编程是非常有必要的,而我觉得socket编程是网络编程的基础.在进入正题之前,先介绍几点网络知识,一:socket编程有分TCP和UDP两种,TCP是基于连接的,而UDP是无连接的:二:一个TCP连接包括了输入和输出两条独立的路径:三:服务器必须先运行然后客户端才能与它进行通信.四:客户端与服

Android应用开发基础篇(4)-----TabHost(选项卡)

链接地址:http://www.cnblogs.com/lknlfy/archive/2012/02/18/2357093.html 一.概述 TabHost是一种用来显示标签的组件,不清楚?看一下来电通这个应用就知道了.这个组件用起来与其他组件不太一样,它需要继承TabActivity这个类,还有它的布局文件与我们平时用的也有些不一样. 二.要求 实现一个具有三个标签的选项卡,每个标签使用不同的布局作为内容,当切换不同的标签时向用户发出提示. 三.实现      声明:这个应用需要用到前面一篇

Android的Fragement基础

在Android3.0的时候,为了适配平板等大屏幕,谷歌引入了碎片(Fragement)的概念. Fragement可以有自己的布局,同时又可以相当于控件一样显示在Activity里.可以动态添加,也可以静态添加. Fragement的生命周期和Activity很相似,在Activity的基础上多了五个方法: onAttach -> onCreate -> oncreateView -> onActivityCreated -> onStart -> onResume -&g

Android 触摸手势基础 官方文档概览2

Android 触摸手势基础 官方文档概览 触摸手势检测基础 手势检测一般包含两个阶段: 1.获取touch事件数据 2.解析这些数据,看它们是否满足你的应用所支持的某种手势. 相关API: MotionEvent 兼容版的: MotionEventCompat  (Note that MotionEventCompat is not a replacement for the MotionEvent class. Rather, it provides static utility metho

Android应用开发基础篇(3)-----ListView

链接地址:http://www.cnblogs.com/lknlfy/archive/2012/02/16/2354625.html 一.概述 ListView是一个列表显示控件,它的应用非常广泛,在很多应用程序中都可以看到它的身影,比如来电通,网易新闻等等,特别是QQ.因此非常有必要熟练掌握它. 二.要求 能够利用ListView显示一些内容,如数据.文本,某一行被点击时有相应的提示:能够实现简单的ListView的动态插入和删除. 三.实现 新建工程MyListView,修改/res/lay