2016年12月28日星期三

Android 逆向学习笔记 (七)- ELF 简单介绍

现在越来越多的安卓 app 为了保证软件的安全性,会使用 NDK 来进行 Native 开发,最后会产生一个 .so 这样的 ELF 文件,通过动态加载这个 ELF 文件调用隐藏在 .so 文件里的方法。 不过有的时候经过处理的 ELF 文件直接拖入 IDA 会报错,像下面这样,如果强行在 IDA 里查看的话会丧失很多有用信息,比较麻烦。 可以看 IDA 载入 ELF 的时候报了两个错, 1. SHT 入口位置不对,2. SHT 表大小或者偏移量不对。归纳来说就是 IDA 加载 ELF 的 SHT( Section Header Table) 内容出了错误。不过为什么出了这样的错误对安卓程序来说没有影响呢? 这是因为...
Read More

2016年12月13日星期二

ANDROID 逆向实例(四)- com.qtfreet.crackme001

现在很多 apk 在开发中为了保证代码不被轻易逆向出来会对关键函数采用 ndk 的方式用 c 语言和 java 代码进行交互,所以学会分析 .so 文件(加载流程、方式等)对安卓逆向来说是比较重要的。 这里借助一个 CrackMe.apk 实例来帮忙分析。反编译 apk 文件得到 smali 代码,提取关键代码如下: # direct methods .method static constructor ()V .locals 2 .prologue .line 15 sget v0, Landroid/os/Build$VERSION;->SDK_INT:I ...
Read More

2016年11月24日星期四

ANDROID 逆向实例(三)- Gamex 恶意软件

流程太多 就不写了... 其实倒不是很复杂 代码没有做混淆和加壳还是比较好分析的 自己释放了几次得到最后的恶意 apk 执行 有兴趣的可以试试看 建议分析以加强对 smali 和安卓的了解 ~ * 相关文件上传到 Github 了 Reference Android Gamex 木马分析...
Read More

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

2016年9月25日星期日

Shadowsocks 的定制和 “不安全性” 的分析

用 Shadowsocks 有很长一段时间了,确实非常好用,速度不错而且能够满足很多工作中的需求。之前也只是一直用着没有做过多的分析,直到最近看见 ShadowsocksR 这个非官方的项目发现 Shadowsocks 稍做修改便能够实现定制化,比较方便。 SS 的工作流程图下图所示: 流程图中其实显示的很清楚了,要定制自己的 Shadowsocks 服务只需要对 # 2 处的代码进行相应的混淆,而在 # 3 处进行反混淆即可,通过看 SS 代码可以看到这部分的内容在 shadowsocks/tcprelay.py 文件定义的类 TCPRelayHandler 方法 _handle_stage_stream()...
Read More

2016年9月17日星期六

ASM 逆向学习笔记 (一)- 汇编基础

因为安卓逆向时而需要分析在 .so 文件中定义的 natvie 函数,所以对汇编的指令伪代码也需要进行学习,在《Android软件安全与逆向分析》中的第六章针对部分指令有所讲述,不过例子感觉举的不太充分,下面对部分内容做一个备忘。 Register R0 ~ R3 :用作传入函数参数,传出函数返回值,比方说 test 函数需要两个参数一个返回值,那么即使用 R0、R1 作为函数的参数,返回值保存在 R0 里。在子程序调用之间,可以将 R0 ~ R3 用于任何用途。 被调用函数在返回之前不必恢复。如果调用函数需要再次使用 R0 ~ R3 的内容,则它必须保留这些内容。 R4 ~ R11 :用作存放函数的局部变量,作用域是单个子程序。如果被调用函数使用了这些寄存器,它在返回之前必须恢复这些寄存器的值。在程序运行过程中,编译器会自动保护R4~R11。 R12:内部调用暂时寄存器...
Category:
Read More

ANDROID 逆向学习笔记 (三)- IDA 动态调试 so

前面几篇所说的均是对安卓进行 smali 静态分析的内容,本节探讨一下动态的调试和分析,将会使用到的是 IDA Pro (金山 leak)和 Android Studio 的部分工具(模拟器,ddms,adb 等)。 Android Studio 的官方网址是: https://developer.android.com/studio/intro/index.html,可以找到不同系统的版本,下载并安装好了之后在 ~/Library/android/sdk/tools 路径下可以找到安卓开发调试所需要的各种小工具。 安装好之后启动 Android Studio 找到 AVD...
Read More

2016年9月12日星期一

ANDROID 逆向实例(一)- acce3ft.aevbbb

对于恶意软件不进行打码处理了,网址是 http://hpwxn.com/ 浏览之后可以下载两个 apk ,不过从文件大小来看应该是一个文件只不过进行了改名。 一般这种恶意软件既不会加壳也不会做复杂的混淆处理,分析起来很简单。直接反编译看 AndroidManifest.xml,找到如下一行。 <activity android:label="@string/app_name" android:name="acce3ft.aevbbb.MainActivity"> 可以看到程序的 MainActivity, 直接看 acce3ft/aevbbb/MainActivity.smali...
Read More