
Android Security
文章平均质量分 81
jltxgcy
热爱Android,热爱开源。
展开
-
Android SO ARM及Thumb2指令集
0x01 ARM寄存器 1.1 通用寄存器 1.未分组寄存器:R0~R7 2.分组寄存器:R8~812 R13:SP,常用作堆栈指针,始终指向堆栈的顶部,当一个数据(32位)推入堆栈时,SP(R13的值减4)向下浮动指向下一个地址,即新的栈顶,当数据从堆栈中弹出时,SP(R13的值加4)向上浮动指向新的栈顶。 R14:连接寄存器(LR),当执行BL子程序调用指令时,R原创 2016-08-13 10:06:36 · 3524 阅读 · 1 评论 -
Android程序反破解技术
0x1 对抗反编译可以大概分为以下几点: 1、对抗反编译工具,例如apktool、dex2jar等 2、对抗静态编译,分为代码混淆技术、NDK保护、apk加壳保护。 3、对抗动态调试,分为检测调试器、检测模拟器。 4、防止重编译,分为检查签名,校验保护。 更多相关内容请参考《Android软件安全与逆向分析》。 0x02 对抗反编译工具,例如dex2ja原创 2016-02-04 09:31:28 · 3803 阅读 · 0 评论 -
Android SO逆向-多重继承
0x00 这一节我们要讨论多重的汇编实现。 0x01 我们先直接看汇编代码:#include "com_example_ndkreverse7_Lesson7.h"#include #define LOG_TAG "lesson7"#define ALOGD(...) ((void)__android_log_print(ANDROID_LOG_DEBUG, LOG_TA原创 2016-04-23 11:36:37 · 1948 阅读 · 0 评论 -
Android SO逆向-对象的继承和虚函数
0x00 这一节我们要讨论对象的继承和虚函数的汇编实现。 0x01 我们先直接看汇编代码:#include "com_example_ndkreverse6_Lesson6.h"#include #define LOG_TAG "lesson6"#define ALOGD(...) ((void)__android_log_print(ANDROID_LOG_DEBUG,原创 2016-04-22 14:19:07 · 4084 阅读 · 0 评论 -
Android SO逆向-全局变量和静态局部变量
0x00 这一节比较简单,主要分析全局变量,全局静态变量,静态局部变量的实现。 0x01 我们直接看代码。#include "com_example_ndkreverse2_Lesson2.h"#include #define LOG_TAG "lesson2"#define ALOGD(...) ((void)__android_log_print(ANDROID_L原创 2016-04-17 11:57:22 · 3486 阅读 · 0 评论 -
Android SO逆向-对象的拷贝构造函数
0x00 这一节我们主要讨论对象的拷贝构造函数的汇编实现。 0x01 我们直接看C++代码: Test.h:#ifndef _TEST_H_#define _TEST_H_#include #define LOG_TAG "lesson5"#define ALOGD(...) ((void)__android_log_print(ANDROID_LOG_D原创 2016-04-21 09:45:17 · 3502 阅读 · 0 评论 -
Android SO逆向-对象的构造函数与析构函数
0x00 这一节我们主要讨论对象的构造函数和析构函数的汇编实现。 0x01 我们先直接看C++代码:#include "com_example_ndkreverse4_Lesson4.h"#include "Test.h"#include #define LOG_TAG "lesson4"#define ALOGD(...) ((void)__android_log_pr原创 2016-04-19 20:52:36 · 4197 阅读 · 0 评论 -
Android SO逆向-数组与指针
0x00 这一节主要分析一维数组、二维数组、数组指针和指针数组的汇编实现。 0x01 我们先直接看C++代码:#include "com_example_ndkreverse3_Lesson3.h"#include #define LOG_TAG "lesson3"#define ALOGD(...) ((void)__android_log_print(ANDROID_L原创 2016-04-18 11:09:39 · 2848 阅读 · 0 评论 -
Android SO逆向-流程控制语句及表达式运算
0x00 在前一篇文章Android SO逆向-基本数据类型及函数的工作原理中,我们介绍了ndk的使用,这篇文章直接列出C++源码及对应的汇编代码。 0x01 在java层主要是调用native方法,现在列出java层的代码: Lesson1.javapackage com.example.ndkreverse1;public class Lesson1 { sta原创 2016-04-17 10:02:34 · 2488 阅读 · 0 评论 -
Android SO逆向-基本数据类型及函数的工作原理
0x00 如果不熟悉ARM汇编的同学,请先阅读这两篇文章,常用ARM汇编指令,ARM子函数定义中的参数放入寄存器的规则。 0x01 这一节我们通过逆向Android SO文件,来理解C++基本数据类型,如int、float、bool、char、指针、引用、常量的ARM汇编形式。 还有理解C++函数调用,用ARM汇编是怎么实现的?参数如何传递,返回值怎么传?函数执行完毕后怎么原创 2016-04-16 10:40:06 · 3392 阅读 · 1 评论 -
apk安装和优化原理
0x00 apk安装的方式有: 1、开机启动时安装 2、通过adb install 或者在手机中点击apk,进行界面安装。 0x01 开机启动后在system_server中调用PackageManagerService.main,随着调用的深入,循环对每个apk都调用scanPackageLI方法,这个函数提取apk的AndroidManifest.xml里面的内容原创 2016-01-20 20:25:58 · 4050 阅读 · 0 评论 -
Android PLT/GOT 符号重定向过程
0x00 项目工程 项目地址:http://download.youkuaiyun.com/detail/jltxgcy/9602851。 下面列出核心代码:#include "com_example_ndkplt_PLTUtils.h"#include #include #include #include #define LOG_TAG "PLTUtils"#define ALOGD原创 2016-08-14 15:45:14 · 2933 阅读 · 0 评论 -
Inject Zygote and Hook Native Method(过反调试,过防dump)
0x00 进程注入 通过ptrace机制,调用目标进程的dlopen来加载我们的so,实现进程注入。 这部分知识在Android中的so注入(inject)和挂钩(hook) - For both x86 and arm,有详细的解释,请读者先阅读这篇文章。 那么被注入的进程是如何返回到我们的进程中呢?答案在regs->ARM_lr = 0。具体的分析请参考Android注入完全原创 2016-08-13 21:06:22 · 5979 阅读 · 1 评论 -
Android SO逆向-C++虚函数表解析
0x00 一般继承(无虚函数覆盖)class Base {public: Base() { ALOGD("Base ..."); } virtual void f() { ALOGD("Base::f"); } void g() { ALOGD("Base::g"); } virtual void h() { ALOGD("Base::h"); } virtual ~Base原创 2017-01-12 09:21:28 · 1961 阅读 · 0 评论 -
Android Apk加壳原理分析
0x00 阅读本文前,建议读者首先阅读Android加壳原理,参考文章Android中的Apk的加固(加壳)原理解析和实现。如果没有看过这篇文章,本文理解起来比较困难。 0x01 下面我们来分析脱壳代码为什么要这样写,核心脱壳代码在ProxyApplication类里面,首先执行成员方法attachBaseContext,然后执行成员方法onCreate。 那么attach原创 2016-01-19 17:43:19 · 8022 阅读 · 8 评论 -
AndroidManifest文件格式、Resource.arsc文件格式解析与混淆
0x01 AndroidManifest文件格式解析 1.1 文件格式解析 我们就不重新造车轮子了,参考Android逆向之旅---解析编译之后的AndroidManifest文件格式。 提示下,在看这篇文章时,大家最好下载了010editor,并且下载了解析AndroidManifest文件的模板AndroidManifestTemplate.bt,这样可以帮助我们更加清晰的理原创 2016-09-24 17:08:26 · 4435 阅读 · 0 评论 -
反编译利器Apktool和Dex2jar导入源码以及编译调试
0x00 Apktool源码下载与导入 0.1 apktool源码下载 地址:https://github.com/iBotPeaches/Apktool。 0.2 导入 打开Android Studio,选择Open an existing Android Studio project,选择Apktool文件夹导入。 0x01 编译并调试Apktool源码 1.原创 2016-09-20 21:30:21 · 3806 阅读 · 0 评论 -
Android SO 加壳(加密)与脱壳思路
0x01 常见的Android SO加壳(加密)思路 1.1 破坏Elf Header 将Elf32_Ehdr 中的e_shoff, e_shnum, e_shstrndx, e_shentsize字段处理,变为无效值。由于在链接过程中,这些字段是无用的,所以可以随意修改,这会导致ida打不开这个so文件。 1.2 删除Section Header ...原创 2016-08-14 17:56:23 · 20270 阅读 · 2 评论 -
Android SO 文件结构及readelf命令
0x00 Android SO 文件结构 so文件结构详细的分析,请看Android逆向之旅---SO(ELF)文件格式详解,这里就不重复造车轮子了。 我们待分析的so已经上传到csdn,下载地址:http://download.youkuaiyun.com/detail/jltxgcy/9602803。 0x01 readelf命令 1.1 so文件整体图 1.2 reade原创 2016-08-14 10:51:40 · 7631 阅读 · 0 评论 -
Android Inline Hook
0x00 Android Inline Hook Inline Hook即内部跳转Hook,通过替换函数开始处的指令为跳转指令,使得原函数跳转到自己的函数,通常还会保留原函数的调用接口。与GOT表Hook相比,Inline Hook具有更广泛的适用性,几乎可以Hook任何函数,不过其实现更为复杂,考虑的情况更多,并且无法对一些太短的函数Hook。 项目代码:https://github原创 2016-08-13 17:58:29 · 4440 阅读 · 1 评论 -
Android SO 加载分析与导入表Hook、导出表Hook
0x00 参考文章 关于so加载分析,就是从System.loadlibrary开始的,层层玻璃代码真相,在Android SO 加壳(加密)与脱壳思路,我们说ELF Header中的一些字段是无用的,Section Header也是无用的,这是为什么呢? 答案是在so加载的过程中,没有使用的,有关Android so加载深入分析,请参考这篇pdf,http://download.cs原创 2016-08-16 08:55:40 · 4215 阅读 · 0 评论 -
Android NDK中C++ STL库动态和静态链接
0x00 本文参考 本文参考Android NDK中C++运行时库介绍。 我们在开发NDK的时候,经常需要使用C++ STL库开发,那么这些库是如何和我们的程序链接的呢? 0x01 C++ STL分类 这些静态链接库和动态链接库都位于哪呢? 答案是位于ndkpat/sources/cxx-stl。我们截图看下这个目录: 我们可以清晰的对照两张图。libstlpo原创 2016-08-15 22:33:28 · 15626 阅读 · 0 评论 -
Anti-Debugging Skills In APK
0x00 本文参考 本文主要是参考Anti-Debugging Skills In APK ,请读者先阅读此文,本文只是对其中的难点进行讲解和说明。 0x01 ida调试so原理 要理解反调试原理,首先要理解调试原理。有关如何使用ida调试so,请参考ida动态调试so,在init_array和JNI_ONLOAD处下断点。 几个关键的步骤,说明下原理: 1.1 在手机原创 2016-08-15 20:32:22 · 2096 阅读 · 0 评论 -
一步一步学ROP之Android ARM 32位篇
0x00 本文仅解释说明蒸米大神一步一步学ROP之Android ARM 32位篇,读者应先阅读这篇文章,遇到问题再来看我这篇文章。 0x01 第一个问题:payload = 'A'*132 + p32(callsystemaddr),这个132是怎么来的? 要回答这个问题,我们需要把level6.c反汇编,level6.c代码如下: #include#include#i原创 2016-02-19 17:48:20 · 2726 阅读 · 1 评论 -
ida动态调试so,在init_array和JNI_ONLOAD处下断点
0x00 如何在JNI_ONLOAD下断点,参考安卓逆向学习笔记(5) - 在JNI_Onload 函数处下断点避开针对IDA Pro的反调试。最好使用模拟器调试,确保 Attach to process后,对应进程在DDMS中出现小红蜘蛛。 下面将如何在init_array下断点,首先要找到so的init_array端,把so拖入ida,然后按Crtl+s,会出现该so的所有段。如下原创 2016-01-28 09:55:26 · 7072 阅读 · 1 评论 -
一步一步学ROP之linux_x86篇
0x00 本文仅解释说明蒸米大神一步一步学ROP之linux_x86篇,读者应先阅读这篇文章,遇到问题再来看我这篇文章。 阅读完这两篇文章后,我们会理解ROP(返回导向编程),DEP(堆栈不可执行),ASLR(内存地址随机化),Stack Protector(栈保护),Memory Leak。 0x01 第一个问题:为什么要构造成”A”*140+ret字符串,这个140是怎么原创 2016-02-19 11:16:13 · 4614 阅读 · 2 评论 -
运行时动态修复dex
0x00 在本文中,我们首先分离原创 2016-01-26 14:24:24 · 4143 阅读 · 4 评论 -
DexClassLoader和PathClassLoader加载Dex流程
0x00 在上一篇文章apk安装和优化原理,在最后我们分析了DexClassLoader和PathClassLoader的构造函数的不同。 PathClassLoader最后调用的是new DexFile(pathFile),而DexClassLoader调用的是DexFile.loadDex(dexPathList[i], outputName, 0)。 0x01原创 2016-01-21 12:52:05 · 8263 阅读 · 1 评论 -
DexClassLoader和PathClassLoader类加载机制
0x00 在DexClassLoader和PathClassLoader加载Dex流程一文中,我们分析了dex文件如何形成了DexFile结构体。本文中讲解类加载机制,实际上就是生成ClassObject对象。 我们以DexClassLoader为例,讲解类加载机制,PathClassLoader是一样的。 我们在加载类时通常会调用loadClass,那么我们就从loadClas原创 2016-01-21 20:29:55 · 3787 阅读 · 0 评论 -
Android系统启动流程
我们先来看一张图,它清晰的说明了整个Android系统的启动流程,参考Android内核开发:图解Android系统的启动过程。 第一阶段:Android设备上电后,首先会从处理器片上ROM的启动引导代码开始执行,片上ROM会寻找Bootloader代码,并加载到内存。(这一步由“芯片厂商”负责设计和实现) 第二阶段:Bootloader开始执行,首先负责完成硬件的初始化原创 2015-09-22 18:46:51 · 2086 阅读 · 1 评论 -
Android 静态分析smail
即前篇文章Android 静态分析 smali,我一直在思考以下几个问题: 1、子类使用的父类中的方法,那么对应的smail是invoke-super还是invoke-virtual呢?对应的类是父类还是子类呢? 解释:invoke-direct {p0}, Landroid/app/Activity;->()V,这里所说的父类还是子类指的是invoke参数后面跟着的类,在这个例子原创 2015-09-28 11:01:31 · 1909 阅读 · 0 评论 -
Android中的权限管理(基于Permission ProtectionLevel)
1、什么是protectionlevel呢? 我们经常在AndroidManifest中使用权限,如果我们想让应用程序可以发短信,那么应该这样写: 那么这个权限的定义是在哪里定义的呢?如下: frameworks/base/core/res/AndroidManifest.xml<permission android:name="android.permission原创 2015-09-08 16:53:21 · 23732 阅读 · 4 评论 -
Android中的权限管理(基于uid gid gids setUid)
我们首先来说一下传统的Linux基于uid,gid的权限管理机制: 1、用户的uid gid gids: Ubuntu操作系统当前登陆的用户是jltxgcy,那么该用户的uid为jltxgcy,gid也是jltxgcy,那么gids怎么查看呢? 答案是使用命令:cat /etc/group | grep jltxgcy。如下图: 用户的...原创 2015-09-07 19:09:03 · 6771 阅读 · 6 评论 -
Android 签名机制
1、如何对APK签名 (1)、创建数字证书,android123.keystore keytool -genkey -alias android123.keystore -keyalg RSA -validity 20000 -keystore android123.keystore keytool工具是Java JDK自带的证书工具 -genkey参数表示:要生原创 2015-09-08 10:51:05 · 2479 阅读 · 0 评论 -
对称加密与非对称加密
什么是加密?加密分为算法和秘钥两部分。算法是不变的,秘钥是变化的,看下面的例子。 秘钥:abcedfgh->12345678。 算法:明文中每一位都换成秘钥表中的另一个位。 例如adfh经过加密后为1568。 加密密钥K和解密密钥K’是一样的则为对称加密。 对称加密的优点:加密速度快。 对称加密的缺点:密钥传输不安全。 什么是非对称加密,如下图:原创 2015-09-06 21:43:39 · 3916 阅读 · 6 评论 -
电子签名
再介绍电子签名前,我们首先介绍一下Hash,也叫作散列或者哈希。 Hash函数的定义是:变长的输入变换成定长的输出。 常见Hash算法:MD5(128位),输入无论多长,都会变成定长的128位输出。 Hash的特点: 1、易变性:即便原始信息发生1bit的变化,Hash的输出将会有不可预知的巨大变化。 2、不可逆:通过Hash结果构造出满足的输入信息是不可能的或者极其原创 2015-09-07 11:37:31 · 1892 阅读 · 0 评论 -
Android加壳native实现
本例仅在Android2.3虚拟机跑通过,如果要适配其他机型,请自行研究,这里只是抛砖引玉。 0x00 在Android中的Apk的加固(加壳)原理解析和实现,一文中脱壳代码都写在了java层很容易被识别出来,很多需求需要把脱壳的程序转移到native层,其实转移的思路也很简单,就是在native层通过JNI调用Java层代码。 0x01 public class Prox原创 2016-01-19 19:50:21 · 3888 阅读 · 2 评论 -
Android APP漏洞挖掘
0x00 1、组件公开安全漏洞 参考Android 组件安全。 2、Content Provider文件目录遍历漏洞 参考Content Provider文件目录遍历漏洞浅析。 3、AndroidManifest.xml中AllowBackup安全检测 参考两分钟窃取身边女神微博帐号?详解Android App AllowBackup配置带来的风险。 4原创 2016-02-16 19:06:46 · 5695 阅读 · 0 评论 -
IDA动态调试Android的DEX文件
0x00 我们以阿里比赛第一题为例,来动态调试dex文件。参考IDA动态调试Android的DEX文件一文,首先AndroidManifest.xml里面android:debuggable="true"。 0x01 下面详细说步骤。 1、将classes.dex拖入IDA中。 2、选择Debugger->Debugger options->Set specific原创 2016-01-28 14:44:26 · 7878 阅读 · 2 评论 -
使用NanoHttpd实现简易WebServer
0x00 在介绍使用NanoHttpd实现简易WebServer之前,我们首先熟悉下局域网Socket通信。一个Client工程,代码地址为https://github.com/jltxgcy/AppVulnerability/tree/master/MyClient。一个Server工程,代码地址为https://github.com/jltxgcy/AppVulnerability/tr原创 2016-02-17 16:16:32 · 9670 阅读 · 4 评论