2016年10月28日星期五

Android 逆向学习笔记 (六)- 安卓脱壳之 dvmDexFileOpenPartial

加壳 学习脱壳之前,首先先学习一下什么是加壳,加壳是在二进制的程序中植入一段代码,在运行的时候这段植入的代码会优先取得程序的控制权,做一些额外的工作(将原来的代码还原出来执行,以达到保护原来的代码直接暴露的问题)。大多数病毒就是基于此原理。 Android 作为新兴出现的平台,加壳方式不像 PC 端一样成熟,本次分析常见的 Dex 加壳和脱壳方式。在此之前,首先需要简单了解 Dex 文件的结构如下表所示。 字段名称偏移值长度描述 magic0x08'Magic'值,即魔数字段,格式如”dex/n035/0”,其中的035表示结构的版本。 checksum0x84校验码。 signature0xC20SHA-1签名。 file_size0x204Dex文件的总长度。 header_size0x244文件头长度,009版本=0x5C,035版本=0x70。 endian_tag0x284标识字节顺序的常量,根据这个常量可以判断文件是否交换了字节顺序,缺省情况下=0x78563412。 link_size0x2C4连接段的大小,如果为0就表示是静态连接。 link_off0x304连接段的开始位置,从本文件头开始算起。如果连接段的大小为0,这里也是0。 map_off0x344map数据基地址。 string_ids_size0x384字符串列表的字符串个数。 string_ids_off0x3C4字符串列表表基地址。 type_ids_size0x404类型列表里类型个数。 type_ids_off0x444类型列表基地址。 proto_ids_size0x484原型列表里原型个数。 proto_ids_off0x4C4原型列表基地址。 field_ids_size0x504字段列表里字段个数。 field_ids_off0x544字段列表基地址。 method_ids_size0x584方法列表里方法个数。 method_ids_off0x5C4方法列表基地址。 class_defs_size0x604类定义类表中类的个数。 class_defs_off0x644类定义列表基地址。 data_size0x684数据段的大小,必须以4字节对齐。 data_off0x6C4数据段基地址 可以看到...
Read More

2016年10月25日星期二

Android 逆向学习笔记 (五)- ARM 和 Thumb 指令集学习

学习安卓逆向,ARM 和 Thumb 是两个绕不开的内容。Thumb 可以看作是 ARM 指令集压缩形式的子集,是针对指令长度问题而提出的,它具有 16 位的指令长度(ARM:32 位),但操作数、指令地址这两项 Thumb 均和 ARM 相同,为 32 位,所以如果想要区分当前指令是 ARM 还是 Thumb 通过指令长度就可以知道。 Thumb 不是一个完整的指令体系结构,必须和 ARM 指令集结合才能正常工作。安卓逆向总是由 CODE32 声明的 ARM 指令集开始,执行的过程中可以通过 BX 指令切换到 CODE16 声明的 Thumb 指令集。 ARM 程序分析(I) 源码: #include...
Read More

2016年10月11日星期二

ANDROID 逆向实例(二)- XDCTF Mobile 100

刚刚接触安卓逆向不久看见 XDCTF 有部分安卓逆向的题目,拿过来看看,试试手,第一次分析 CTF 相关的题目确实用了不少时间,不过同时也学到了不少东西。 常规手段还原出 smali 文件(这里偷了个懒,直接用的 apktool),没有混淆也没有 so 加固,只需要理出 smali 处理流程即可。根据 AndroidManifest.xml 找到 com.example.ring.myapplication.MainActivity, 故从对应的 MainActivity.smali 作为起点分析。 进行了一系列的初始化操作,然后理出比较重要的代码:进入 p 函数、绑定类 d 为点击事件。 .method...
Read More

2016年10月10日星期一

Android 逆向学习笔记 (四)- 签名校验突破

有的时候在篡改 apk 并且重新打包之后不能直接运行,此时部分情况是因为存在软件的签名校验机制。在前面几篇的学习中可以知道,软件打包之后需要重新签名才可以安装到安卓机器上,此时重新签名一般用的都是公开的  platform.x509.pem 和 platform.pk8 , 有的软件为达到防篡改的目的会对新老签名进行比较,如果存在差异则确定被篡改,程序终止。 除了签名校验之外,还有一种情况是 classes.dex 的 MD5 检验,也可以发现被篡改的 classes.dex。怎么区分这两种不同的校验呢?拿到 apk 之后对其重新签名,如果仍然可以正常安装运行的即说明是 classes.dex 的 MD5 校验,反之则是签名校验。 一般在程序内进行的校验有两种途径,在线比对和离线比对,逆向者在意的是比对的这个过程及其参数。在线比对和离线比对的区别是:在断网情况下仍旧闪退的是离线比对,断网后先提示没有网络连接再闪退的是在线比对。 既然校验的过程是在本地程序进行的,那么在反编译得到代码之后,只要修改一下比较时的对应条件就可以简单的绕过校验了,整个校验过程有点掩耳盗铃的意思。 Signature...
Read More