《Android 软件安全权威指南》学习笔记
菜鸟学习 Android 逆向之《Android 软件安全权威指南》(丰生强 著),聊作笔记,一来加深印象,二来查漏补缺(原书中有些地方现已不支持,有些地方的确有错误)
zlmm741
这个作者很懒,什么都没留下…
展开
-
第十二章 软件壳(五)(代码混淆壳)
文章目录代码混淆壳LLVM 基础编写 PassObfuscator-LLVM指令替换控制流平坦化伪造控制流代码混淆壳的脱壳指令替换混淆的还原控制流平坦化混淆的还原伪造控制流混淆的还原代码混淆壳分为Java 级别的代码混淆加密保护型的第一代壳原生程序的代码混淆代码混淆的第三代壳源于 LLVM 编译套件的编译器特性,通过编写 LLVM Pass 对编译原生程序时生成的 LLVM IR 进行操作,可实现类似 Windows 平台 VMProtect 等虚拟机软件壳的加密保护效果原创 2020-05-17 14:09:55 · 1362 阅读 · 0 评论 -
第十二章 软件壳(四)(代码抽取型壳)
文章目录代码抽取型壳内存重组脱壳法Hook 脱壳法系统定制脱壳法脱壳工具代码抽取型壳即第二代壳主要特点即使 DEX 已加载到内存,仍处于加密状态(所有 DEX 方法都在运行时解密)比第一代壳难脱内存重组脱壳法代码抽取型壳经历多次技术迭代最初是将 DEX 的 DexCode 提取后填 0,将 DEX 的所有内容保存在 APK 中,APK 运行时会在内存中动态解密,所有解密的方法内容指针位于 DEX 文件结构体外部的内存中,从而有效避免了只知道 DEX 的起始地址即可快速 D原创 2020-05-17 14:07:16 · 1555 阅读 · 0 评论 -
第十二章 软件壳(三)(动态加载型壳)
文章目录动态加载型壳缓存脱壳法内存 Dump 脱壳法动态调试脱壳法总结Hook 脱壳法系统定制脱壳法动态加载型壳即第一代壳其发展时期正是从 Android 4.4 向 Android 5.0 迈进的从 Dalvik 虚拟机向 ART 虚拟机转型时期这一时期的软件壳,早期版本主要针对 Dalvik 虚拟机的实现,特点是对本地 APK 中的数据加密,运行时在内存中解密缓存脱壳法动态加载型壳用 DexClassLoader 方式将加密后的 DEX 在内存中解密后动态加载,但一些软件壳没有处理原创 2020-05-17 14:04:51 · 713 阅读 · 0 评论 -
第十二章 软件壳(二)(软件壳的特征与侦察)
文章目录软件壳的特征与侦察编译器指纹软件壳的特征DEX 混淆DEX 加密与 Application 替换so 加密查壳工具软件壳的特征与侦察软件壳的特征侦察技术APK 中 DEX 和 so 动态库使用的编译器识别规则软件壳处理目标 APK 后留下的特征信息编译器指纹APK 的可执行代码DEX属于 Java 部分可用 dx 或 smali 的 dexlib2 库生成so 动态库属于 Native 部分可用 gcc 或 Clang 编译器生成用 de原创 2020-05-17 13:58:55 · 944 阅读 · 0 评论 -
第十二章 软件壳(一)(Android 软件壳)
文章目录软件壳Android 软件壳软件壳Windows 平台的软件壳压缩壳着重于减小软件体积代表UPXASPackNSPack不采用软件保护技术没有用于进行调试器检测的代码加密壳产品众多大多被恶意软件用来对抗杀软查杀可配合压缩壳进行多次加密,达到较高强度的加密效果保护壳比加密壳更难脱壳强调高强度的代码保护,包括对调用 API 的方法抽取、多进程保护、内存校验、反调试器与虚拟机、系统注入等代表ArmadilloASProtectSafeGu原创 2020-05-17 13:54:57 · 524 阅读 · 0 评论 -
第十一章 软件保护技术(六)(运行环境检测)
文章目录运行环境检测模拟器检测Root 检测Hook 检测运行环境检测动态分析技术除了静态分析和动态调试,还可用它分析软件基于自定义的沙盒环境,通过 Hook 系统中所有关键 API 来输出程序运行时的动态信息效率较高可在运行时检测软件的运行环境,判断程序是否被第三方恶意使用或跟踪分析模拟器检测主流沙盒的运行环境都是基于 Android 源码改造的定制版本的模拟器,只要检测运行环境是否为 Android 模拟器,即可判断是否运行于沙盒模拟器和真机的差异:手机服务的原创 2020-05-17 13:53:32 · 4147 阅读 · 4 评论 -
第十一章 软件保护技术(五)(反调试技术)
文章目录反调试技术调试器状态检测调试器端口检测结论进程状态检测反调试技术目的防止程序被第三方调试器调试和分析方法在程序启动过程中检查其是否被调试器附加自身程序的父进程是否存在异常进程列表中是否有正在运行的调试器……实例:CheckDebugger调试器状态检测动态调试通过调试器 Hook 软件,进而获取软件运行时的数据。可在软件中添加检测调试器的代码,检测到软件被调试器连接则中止运行Android SDK 提供 android.os.Debug.isDebu原创 2020-05-17 13:52:02 · 957 阅读 · 0 评论 -
第十一章 软件保护技术(三)(资源保护)
文章目录资源保护App 资源被篡改游戏素材资源被窃取游戏脚本资源被破解资源保护主要应用在:App 资源被篡改AS 正常开发生成的 APK,若未经加密处理,用 ApkTool 反编译后,可完整地重现 res 目录下的资源信息上述情况下 App 面临的安全隐患资源被恶意盗用资源与代码被修改并重新打包发布(即“重打包)游戏素材资源被窃取游戏的资源很重要山寨游戏大量盗用游戏脚本资源被破解游戏和 App 最大的区别游戏为保证高实时的动态特性,会采用脚本语言驱动程序运原创 2020-05-17 13:49:02 · 486 阅读 · 0 评论 -
第十一章 软件保护技术(二)(软件混淆技术)
文章目录软件混淆技术源码混淆模板混淆AST 混淆IR 混淆OLLVMDEX 混淆DEX 二次混淆软件混淆技术软件代码数据软件混淆(从宏观角度看)代码混淆数据混淆软件混淆(从软件的编译与链接生成过程看)事前的代码混淆事中的编译期混淆事后的二进制混淆代码混淆Code Obfuscation指混淆过程发生在代码级别,包括对源码进行静态修改的源码混淆,和基于源码(针对 C++ 语言)模板展开的模板混淆编译期混淆发生于代码编译期间使用 LLVM 编译原创 2020-05-17 13:47:17 · 1743 阅读 · 1 评论 -
第十一章 软件保护技术(一)(软件保护技术简介)
文章目录软件保护技术软件保护技术简介软件保护技术伴随软件破解技术发展经历软件安全对抗技术的演变,向信息安全技术标准化和安全服务产业化的方向发展(Android 平台)包括通用软件保护技术和特定平台的软件保护技术软件保护技术简介按不同授权类别,软件分为:专属软件拥有此类授权的软件不允许用户随意复制、研究、修改和发布它,违反此类授权违法传统商业软件采用此类授权自由软...原创 2020-04-21 15:51:41 · 985 阅读 · 0 评论 -
第十章 Hook 与注入(五)(注入框架 Frida)
文章目录注入框架 FridaFrida 的安装与配置执行注入与 Hook跟踪 Native 方法注入框架 FridaFrida:跨系统、跨平台的开源进程注入框架官网用 Frida 提供的 Shell 环境,可查看目标进程内存中的任何内容,调用进程中加载的函数,注入一个外部的 DEX 或 so 动态库等Frida 的安装与配置安装计算机端(Windows10、Python 3....原创 2020-04-21 14:49:31 · 4417 阅读 · 0 评论 -
第十章 Hook 与注入(四)(动态注入)
文章目录动态注入so 动态库注入DEX 注入动态注入指将一段程序或一个完整的可执行文件加载到目标程序中和 Hook 的异同同:都会修改目标程序的运行时行为异:Hook:用 Hook 框架对程序 Hook 后,会修改原方法或原函数的指针,让其转去执行 Hook 的方法动态注入:通过进程读写技术将一段代码或程序写进目标程序的内存空间,然后修改目标程序的指令指针,让加载的代码...原创 2020-04-20 14:22:43 · 1427 阅读 · 0 评论 -
第十章 Hook 与注入(三)(Hook 场景与应用)
文章目录Hook 场景与应用开启日志调试输出APK 插件绕过 SSL PinningHook 场景与应用Xposed 除了可修改 checkSN() 的执行逻辑,还可在实际的软件分析中做很多实用的工作开启日志调试输出在分析第三方代码时,常看到如下代码:class XXLog { public static void i(String s1, String s2) { ...原创 2020-04-19 22:38:53 · 624 阅读 · 0 评论 -
第十章 Hook 与注入(一)(Hook 的类型)
文章目录Hook 与注入Hook 的类型Dalvik HookART HookLD_PRELOAD HOOKGOT HookInline HookHook 与注入软件加密技术不断更新迭代,攻防双方水平不断提升,单纯的静态级别的安全对抗已很少出现,分析人员面对得更多的是高强度的代码加密技术和程序防篡改技术,在此背景下,新的软件分析技术 —— Hook 与注入应运而生反编译 APK、修改或添加...原创 2020-04-17 23:41:10 · 1653 阅读 · 0 评论 -
第九章 Android 原生程序动态调试(三)(使用 IDA Pro 调试 Android 原生程序)
文章目录使用 IDA Pro 调试 Android 原生程序使用 IDA Pro 调试 Android 原生程序和 gdb、lldb 一样,用 IDA 调试原生程序时也要在设备上通过调试服务端进行远程连接。IDA 的 dbdsrv 目录存放着所有远程调试服务端程序:目前 IDA 支持调试 x86、x86-64、ARM、ARM64 四种类型的 Android 原生程序。android...原创 2020-04-15 18:55:15 · 971 阅读 · 0 评论 -
第九章 Android 原生程序动态调试(二)(lldb 调试器)
文章目录lldb 调试器配置 lldb 调试器lldb 调试器的常用命令使用 lldb 调试 Android 原生程序lldb 调试器的 GUI 前端lldb 调试器随着 Android NDK 将编译工具链的重心放到 LLVM,lldb(LLVM 套件之一)成为 Android 原生程序动态调试器不仅可在开发时对 Android 原生程序进行源码级调试,也可进行汇编指令级的逆向动态调试...原创 2020-04-15 16:42:00 · 3688 阅读 · 1 评论 -
第九章 Android 原生程序动态调试(一)(gdb 调试器)
文章目录gdb 调试器ndk-gdb 脚本配置 gdb 调试器gdb 调试器的常用命令使用 gdb 调试 Android 原生程序gdb 调试器的 GUI 前端由于 Android 原生程序的软件保护技术日趋成熟,很多软件和病毒都开始用加密和混淆技术强化自己,对此,静态分析已很难奏效,要用到动态调试用 C、C++ 开发的原生程序,其语言的先天特性决定其二进制代码的分析难度比 Java 开发的...原创 2020-04-14 14:44:44 · 1172 阅读 · 0 评论 -
第八章 Android 原生程序开发与逆向分析(六)(原生 C++ 程序逆向分析 - 原生 so 动态库逆向分析)
文章目录原生 so 动态库逆向分析原生 so 动态库逆向分析原生 so 动态库可用 C 或 C++ 开发,除了前面介绍的代码特性,so 动态库还可用 JNI 接口函数来实现 Java 层与 Native 层的通信实例:之前的 ndkjnidemo用 IDA 载入 arm64-v8a 的 libnative-lib.so,查看 Java_com_droider_jnidemo_MainAc...原创 2020-04-12 22:46:45 · 3080 阅读 · 0 评论 -
第八章 Android 原生程序开发与逆向分析(六)(原生 C++ 程序逆向分析 - C++ 程序的 RTTI)
文章目录C++ 程序的 RTTIC++ 程序的 RTTIRTTI 全称 Run-Time Type Identification,译为“运行时类型信息”RTTI 提供如下两个非常有用的操作符:typeid 操作符:返回指针的引用所指的实际类型dynamic_cast 操作符:将基类类型的指针或引用安全地转换为派生类类型地指针或引用若 C++ 程序中用了 C++ 对象的多态特性(...原创 2020-04-12 22:44:17 · 489 阅读 · 0 评论 -
第八章 Android 原生程序开发与逆向分析(六)(原生 C++ 程序逆向分析 - C++ 类的逆向分析)
文章目录C++ 类的逆向分析C++ 类的逆向分析实例:app8.cpp#include <iostream>#include <stdio.h>class Person{public: Person() { age = 31; printf("Person: Person() called\n"); ...原创 2020-04-12 22:35:31 · 506 阅读 · 0 评论 -
第八章 Android 原生程序开发与逆向分析(六)(原生 C++ 程序逆向分析 - C++ STL 的逆向分析)
文章目录原生 C++ 程序逆向分析C++ STL 的逆向分析原生 C++ 程序逆向分析C++ 程序比 C 复杂很多:除了基本的分支语句结构,还有很多 C 不具备的面向对象的特性和标准模板库C++ STL 的逆向分析先看使用 STL 后如何对非面向对象的 C++ 程序静态分析实例:app7.cpp#include <iostream>#include <ma...原创 2020-04-12 22:24:42 · 874 阅读 · 0 评论 -
第八章 Android 原生程序开发与逆向分析(五)(原生 C 程序逆向分析)
文章目录原生 C 程序逆向分析编译原生 C 程序for 循环分支结构for1()for2()while 循环分支结构dowhile()whiledo()if……else 分支结构if1()if2()switch 循环分支结构优化后的 C 程序原生 C 程序逆向分析一个完整的原生程序中,除了顺序执行的代码流,还有 for 循环、while 循环、if……else 语句、switch 语句等分支...原创 2020-04-10 21:22:38 · 965 阅读 · 1 评论 -
第八章 Android 原生程序开发与逆向分析(四)(原生程序逆向分析工具)
文章目录原生程序逆向分析工具NDK ToolchainIDA ProHopper原生程序逆向分析工具NDK ToolchainNDK Toolchain(NDK 工具链)从引入至今,已发生很大变化:NDK r19 前版本官方指南;NDK r19 及之后版本官方指南NDK r19 前生成独立编译工具链:$NDK/build/tools/make_standalone_toolchain.p...原创 2020-04-08 23:34:43 · 1325 阅读 · 0 评论 -
第八章 Android 原生程序开发与逆向分析(三)(原生程序文件格式)(字符串表、符号表、got 表、plt 表、地址重定位表)
文章目录字符串表符号表got 表与 plt 表地址重定位表r_offsetr_infor_addend字符串表观察 ELF 文件格式,会发现其中包含 .dynstr、.shstrtab、.strtab 三张字符串表.dynstr 表位于 .dynstr 节区(dynstr 即 Dynamic String 的缩写),存放的是 .dynamic 节区使用的字符串,如 DT_NEEDED 类型...原创 2020-04-06 17:47:11 · 888 阅读 · 0 评论 -
第八章 Android 原生程序开发与逆向分析(三)(原生程序文件格式)
文章目录原生程序文件格式原生程序的文件类型AArch64 ELF 文件格式e_idente_typee_machinee_versione_entrye_phoffe_shoffe_flagse_phentsize、e_phnume_shentsize、e_shnume_shstrndxProgram Header Tablep_typep_flagsp_offsetp_vaddrp_paddrp...原创 2020-04-06 17:27:11 · 1059 阅读 · 0 评论 -
第八章 Android 原生程序开发与逆向分析(二)(原生程序入口函数)
文章目录原生程序入口函数原生程序入口函数分析so 入口函数分析原生程序入口函数入口函数指原生程序加载到内存后执行的第一个函数在入口函数处可做很多事,如软件壳的代码初始化与反调试等原生程序入口函数分析以 Android 平台上的 64 位原生程序为例,用之前学过的方法生成 app.c 程序用 gcc 方式编译:用 Clang 方式编译:编译完成后执行如下命令查看其 Ent...原创 2020-04-02 22:42:19 · 813 阅读 · 0 评论 -
第八章 Android 原生程序开发与逆向分析(一)(原生程序开发)
文章目录Android 原生程序开发与逆向分析原生程序开发原生程序工程STL 的选择JNI编译选项与配置项Android 原生程序开发与逆向分析Android 平台上的软件复杂多样,仅通过 Android SDK 使用 Java 编写程序已不能满足开发者需求,如:音频、视频播放软件解码器的编写涉及 CPU 的高性能运算;在一些平台开发的游戏,若是采用 C、C++ 编写的,可能因为涉及不同代码...原创 2020-04-01 14:24:13 · 1229 阅读 · 0 评论 -
第七章 ARM 反汇编基础(七)(AArch64 汇编指令集)
文章目录AArch64 汇编指令集AArch64 指令编码AArch64 指令格式解析AArch64 汇编指令集arm64-v8a 对应两套架构的指令集AArch32(简称“A32”)的 ARM、Thumb、Thumb-2 指令集AArch64(简称“A64”)的 64 位指令集AArch64 指令编码AArch64 指令根据指令不同的位域分布将指令集分成了编码组(Enc...原创 2020-03-31 00:46:32 · 4466 阅读 · 0 评论 -
第七章 ARM 反汇编基础(六)(Thumb 汇编指令集)
文章目录Thumb 汇编指令集16 位 Thumb 指令编码16 位 Thumb 指令格式解析32 位 Thumb 指令编码32 位 Thumb 指令格式解析Thumb 汇编指令集作为 ARM 指令集的一个子集,针对代码密度问题提出,具有 16 位的指令宽度与 ARM 指令的 32 位宽度相比,Thumb 指令集在保留 32 位宽度优势的同时大大节省了系统的存储空间Thumb 不是一个完...原创 2020-03-30 21:57:49 · 4179 阅读 · 1 评论 -
第七章 ARM 反汇编基础(五)(ARM 汇编指令集)
文章目录ARM 汇编指令集ARM 指令集分类ARM 指令编码ARM 指令格式解析常见 ARM 指令数据处理与杂项指令加载存储指令其他指令ARM 汇编指令集Android 平台的 ARM 汇编指令集根据架构支持类型的不同可分为四大类:注意:ARM 指令集一直在变化,armeabi 支持 ARMv7 以下版本的指令集,armeabi-v7a 支持 ARMv7 系列指令集,AArch32 ...原创 2020-03-29 23:35:36 · 2332 阅读 · 0 评论 -
第七章 ARM 反汇编基础(四)(ARM 汇编语言)
文章目录ARM 汇编语言ARM 汇编程序结构ARM 汇编语言一门语言通常有自己的关键字、代码规范、子程序调用、注释等,汇编语言也一样汇编语言:将一系列与处理器相关的汇编指令用某种语法和结构组织在一起的程序语言形式用特定汇编语法规范编写的汇编代码,可被完整地编译或嵌入其他高级语言Android 中的 ARM 汇编使用 GNU 汇编格式,现在开始学习 GNU ARM 汇编的一般语法格式及特...原创 2020-03-28 14:37:56 · 5266 阅读 · 3 评论 -
第七章 ARM 反汇编基础(三)(ARM 原生程序的生成过程)
文章目录ARM 原生程序的生成过程预处理编译汇编链接ARM 原生程序的生成过程Android 平台上的 ARM 原生程序是用 Android NDK 开发的,整个原生程序的编译生成工作由 Android NDK 提供的编译工具链完成Android NDK 目前提供了两套 ARM 编译器,分别是基于 GNU GCC 编译器的 gcc 编译器和基于LLVM 编译套件的 Clang 编译器...原创 2020-03-27 00:16:49 · 2281 阅读 · 0 评论 -
第七章 ARM 反汇编基础(二)(Android ARM EABI)
文章目录Android ARM EABIarmeabiarmeabi-v7aarm64-v8aAndroid ARM EABI不同的 Android 手机使用的 CPU 不同,其使用的指令集也可能不同。每种 CPU 与指令集的组合都有自己的应用二进制接口(Application Binary Interface, ABI)ABI 可非常精确地定义应用的机器代码在运行时如何与系统进行交互嵌...原创 2020-03-25 18:11:54 · 881 阅读 · 0 评论 -
第七章 ARM 反汇编基础(一)(Android 与 ARM 处理器)
文章目录ARM 反汇编基础Android 与 ARM 处理器ARM 处理器架构概述CortexAndroid 支持的处理器架构ARM 反汇编基础学习目的:掌握原生程序逆向技术Android 与 ARM 处理器ARM 处理器架构概述ARM:Advanced RISC Machine一家嵌入式处理器提供商一种处理器架构一套完整的处理器指令集为满足不同环境需求,ARM 公...原创 2020-03-23 15:05:56 · 972 阅读 · 1 评论 -
第六章 动态分析 Android 程序(四)(使用 JEB 动态调试 APK)
文章目录使用 JEB 动态调试 APK步骤总结使用 JEB 动态调试 APK要求:2.2.3 或更高版本实例:GitHub步骤启动要调试的目录,若要在 APK 启动前调试初始化部分的代码,就以调试模式启动它执行如下命令,以调试模式启动 MethodProfiling启动 JEB,载入要分析的 APK,定位要设置断点的地方,按“Ctrl+B”设置断点点击菜单项“调试器”(...原创 2020-03-22 17:20:47 · 1266 阅读 · 0 评论 -
第六章 动态分析 Android 程序(三)(使用 JDB 动态调试 APK)
文章目录使用 JDB 动态调试 APK步骤总结使用 JDB 动态调试 APKJDK 提供的 JDB 调试器是动态调试 Java 程序的标准工具。Android 系统的虚拟机实现了 Java 调试的 JDWP 通信协议实例:GitHub步骤确定 APK 的 AndroidManifest.xml 中的 Application 标签的 android:debuggable 为 tru...原创 2020-03-21 23:18:45 · 1032 阅读 · 1 评论 -
第六章 动态分析 Android 程序(二)(动态分析技巧)
文章目录动态分析技巧代码注入法栈跟踪法Method ProfilingUI 检查动态分析技巧主流的动态分析框架除了提供一套完整、通用的动态分析方法,通常还具备高度的可配置特性与可扩展性,如添加自定义分析模块、增加指定的 API 分析等功能但对一些应用,还有一些分析要点没有提供,这时就要分析人员动手解决这些问题代码注入法一个程序在发布时通常不会保留 Log 输出信息。若想观察程序特...原创 2020-03-21 22:03:41 · 862 阅读 · 0 评论 -
第六章 动态分析 Android 程序(一)(动态分析框架)
文章目录动态分析 Android 程序动态分析框架DroidBoxMobSF动态分析 Android 程序分析经过加密混淆的 Android 程序时,光静态分析往往达不到理想效果,这时候就要用到动态分析动态分析分为动态跟踪和动态调试动态跟踪侧重于自动化分析,工具一般是自主研发或第三方提供的分析平台。在软件开发领域编写大型项目安全检测分析报告,以及在软件安全领域进行恶意代码与病毒的分析时,...原创 2020-03-20 15:39:24 · 1119 阅读 · 0 评论 -
第五章 静态分析 Android 程序(五)(使用 IDA Pro 进行静态分析)
文章目录使用 IDA Pro 进行静态分析IDA Pro 对 Android 的支持分析 DEX 文件定位关键代码破解思路一破解思路二使用 IDA Pro 进行静态分析IDA Pro:目前功能最强大的静态反编译分析工具,具备可交互、可编程、可扩展、多处理器支持等特点,软件逆向分析必备工具IDA Pro 对 Android 的支持从 6.1 版本开始提供对 Android 的静态分析...原创 2020-03-15 21:47:10 · 1525 阅读 · 1 评论 -
第五章 静态分析 Android 程序(四)(使用 JEB 进行静态分析)
文章目录使用 JEB 进行静态分析安装 JEBJEB 的静态分析功能JEB 的脚本化与插件使用 JEB 进行静态分析JEB:一款强大的跨平台 Android 静态分析工具相比 jd-gui、jadx、bytecode-viewer 这类 jar 查看工具,JEB 提供类似 IDA Pro 的方法交叉引用与重命名功能JEB 的脚本化功能在自动分析与对抗代码混淆中很实用安装 JEB...原创 2020-03-13 14:55:45 · 1542 阅读 · 1 评论