自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

https://github.com/CYRUS-STUDIO

  • 博客(232)
  • 资源 (7)
  • 收藏
  • 关注

原创 手写 Android Dex VMP 壳:指令流 AES 加密 + 动态加载全流程

在上一篇《手写 Android Dex VMP 壳:自定义虚拟机 + 指令解释执行全流程》中,我们从零实现了一个简易的 Dex VMP 壳,通过自定义虚拟机和指令解释执行,让应用代码在运行时以“虚拟指令流”的方式运行,大大增加了逆向分析的难度。如果攻击者能够直接读取 Dex 中的虚拟指令流,那么依然可能进行还原。在 Dex VMP 基础上引入指令流加密与动态加载。通过AES 算法对指令流进行加密,运行时再解密并交给虚拟机执行,从而让静态分析几乎无从下手。

2025-09-22 19:06:43 1010 1

原创 手写 Android Dex VMP 壳:自定义虚拟机 + 指令解释执行全流程

在 Android 安全领域,VMP(Virtual Machine Protection,虚拟机保护)壳一直被视为最难攻克的加固技术之一。它通过将 Dex 指令转换为自定义字节码,再由虚拟机解释执行,从而大幅增加逆向分析的门槛。带你一步步手写一个 Dex VMP 壳如何把 Java/Dex 转换为字节码指令流如何构建一个最小可用的解释器如何模拟寄存器、字符串池如何解析并执行典型指令(const-string、invoke、return 等)

2025-09-22 19:05:33 1186

原创 Frida Stalker Trace 实战:指令级跟踪与寄存器变化监控全解析

是 Frida 提供的一个强大的指令级追踪引擎,它能够在目标进程运行时,动态捕获每一条指令的执行情况。putCallout:它允许在某条指令执行时触发回调,把当时的 CPU 上下文(寄存器状态、内存地址等)传递给我们的 JavaScript 脚本。putCallout 会在你指定的位置插入一个“钩子”,在那一刻调用你指定的 JS 函数,提供当前上下文(CPU 寄存器状态)。Stalker.follow:负责启动跟踪,它会附加到指定的线程上,对该线程的指令执行流进行捕获和分析。(实时保存日志到文件)

2025-09-18 15:09:41 797

原创 一文搞懂 Frida Stalker:对抗 OLLVM 的算法还原利器

在移动应用的安全加固中,是一种常见的代码混淆与保护手段。它通过控制流平坦化、虚假控制流、指令替换等方式,使逆向分析者很难直接还原出原始算法逻辑。然而,通过 Frida 提供的Stalker模块去动态分析让我们有机会对 OLLVM 的“黑盒逻辑”进行还原。通过 Stalker 的指令级追踪能力,我们不仅能捕获函数调用、记录调用参数,还可以打印调用堆栈,最终逐步揭开 OLLVM 加固算法的真实运行流程。比如,分析某个 so 中偏移为 0x23AD0 的加密函数。

2025-09-18 15:08:48 1306

原创 Frida 实战:Android JNI 数组 (jobjectArray) 操作全流程解析

在 Android 的 Native 层,Java 中的 Object[] 类型参数会以 jobjectArray 的形式传递到 C/C++ 代码中。与 JS 数组不同,你不能直接对 jobjectArray 进行索引访问或直接操作其元素。要获取或修改其中的内容,必须借助 JNI 提供的接口,例如获取数组长度、读取单个元素或创建新的数组等操作。

2025-09-17 13:53:55 450

原创 用 Frida 控制 Android 线程:kill 命令、挂起与恢复全解析

kill 是 Linux 系统中用来向进程发送信号的命令,最常用于终止进程。在底层,kill() 实际上会触发系统调用(比如 Linux 的 syscall kill),让内核发送信号给指定的进程。实现一个 suspendOtherThread 函数,挂起除了 excludeList 中指定名字的所有线程。kill 在 C 语言中是定义在 <signal.h> 中的一个标准函数,它本质上是一个系统调用的封装函数。这个目录中每一个子目录的名字就是该 App 的一个线程的 TID(Thread ID)。

2025-09-17 13:52:48 680

原创 利用 Linux 信号机制(SIGTRAP)实现 Android 下的反调试

首先,我们在 C 代码中编写反调试逻辑,核心是通过 raise(SIGTRAP) 触发 SIGTRAP 信号,并判断信号是否被捕获。// 标志变量,判断 SIGTRAP 是否被捕获// SIGTRAP 信号处理函数// 标记 SIGTRAP 被捕获// JNI 方法,触发 SIGTRAP 信号并检测调试器// 注册 SIGTRAP 处理器// 触发 SIGTRAP 信号// 检查信号是否被捕获// 没有检测到调试器} else {// 如果信号未被捕获,说明有调试器。

2025-09-16 15:11:21 1046

原创 Android 反调试攻防实战:多重检测手段解析与内核级绕过方案

TracerPid 检测通过读取 /proc/self/status,如果 TracerPid 不为 0,就说明当前进程正被调试器(如 gdb、lldb、IDA Pro)附加。stat 检测通过 /proc/self/stat 可以获取进程的运行状态,如果发现状态异常(如被调试中),就会触发保护逻辑。对 /proc/self/stat、/proc/self/wchan 的检测,同样可以在内核源码中找到对应实现,定制输出结果;在输出中,t (tracing stop) 表示 app 停止(被调试或其他暂停)

2025-09-16 15:10:18 1437

原创 如何防止 so 文件被轻松逆向?精准控制符号导出 + JNI 动态注册

在使用Android NDK 编译 so 文件时,默认情况下,所有 public C/C++ 函数都会被导出。这意味着无论函数是否真正需要对外使用,它们的符号表都会出现在 so 文件中。只要把 so 丢进IDA、GHIDRA 等逆向工具,攻击者就能轻松看到完整的函数名列表,进而快速定位核心逻辑。实际上,除了必须导出的JNI 函数外,其余大多数 C/C++ 函数根本不需要对外暴露。即便不导出,这些函数在编译器/链接器内部依然可以正常调用,运行时也不会受到影响。

2025-09-10 16:33:46 956

原创 C&C++ 代码安全再升级:用 OLLVM 给 so 加上字符串加密保护

在 Android 应用的 Native so 中,C/C++ 字符串是最容易泄露的弱点。只要用 IDA、Ghidra 等逆向工具打开 so,明文字符串往往一览无余,核心逻辑、协议关键字、敏感信息都可能直接暴露。这意味着,即使你对函数做了混淆,对控制流做了平坦化,只要字符串没保护,就等于把应用的秘密写在了明面上。对字符串加密。而基于 LLVM 的OLLVM,恰好提供了一个可扩展的平台,我们可以在编译过程中自动收集、加密、替换字符串,让 so 中不再出现明文常量。

2025-09-10 16:32:04 772

原创 别让 so 裸奔!移植 OLLVM 到 NDK 并集成到 Android Studio

在 Android 应用安全中,Native 层 so 库往往是最容易被逆向分析的目标。无论是游戏的核心逻辑,还是 App 的关键算法,一旦 so 被反编译,核心代码就可能暴露无遗。传统的 Java 层混淆工具(如 ProGuard、R8)对 C/C++ 代码无能为力,因此NDK 层代码的保护成了安全加固中的难点。在编译阶段对 so 进行混淆处理,让逆向难度大幅提升。LLVM 生态中有一个安全扩展 ——,它在编译流程里插入了混淆 Pass,能对 C/C++ 代码做控制流平坦化、虚假控制流、指令替换。

2025-09-09 10:01:09 1784

原创 OLLVM 移植 LLVM18 踩坑:一步步调试修复控制流平坦化

把 OLLVM 移植到 LLVM18 后,发现 -fla(控制流平坦化)不能正常使用。OLLVM 移植 LLVM 18 实战,轻松实现 C&C++ 代码混淆测试代码 fla.cif(a == 0)return 1;return 0;从报错信息来看,Flattening.cpp 的第 101 行代码在运行时发生了异常,具体错误类型是 访问权限冲突 (0xC0000005),通常意味着代码尝试访问了无效或空的内存指针。

2025-09-09 09:59:53 936

原创 OLLVM 移植 LLVM 18 实战,轻松实现 C&C++ 代码混淆

OLLVM(Obfuscator-LLVM)是基于LLVM 编译器框架的一个开源扩展项目,主要用于程序代码混淆与保护。OLLVM 基于 LLVM 的Pass 插件机制,在优化环节增加代码混淆功能,从而增加二进制程序的逆向难度。常见的混淆手段包括:控制流平坦化(Control Flow Flattening):打乱程序的控制流结构,使其执行路径不再直观。指令替换(Instruction Substitution):将简单指令替换为等价的复杂指令序列。

2025-09-08 11:49:12 1407

原创 LLVM 不止能编译!自定义 Pass + 定制 clang 实现函数名加密

LLVM 是一个编译器框架,用来把 C/C++ 源码编译成目标文件,似乎和日常的 GCC、Clang 没什么两样。事实上,LLVM 的能力远不止于此。LLVM 全面解析:NDK 为什么离不开它?如何亲手编译调试 clang凭借它灵活的中间表示(LLVM IR)和强大的Pass 插件机制,我们不仅能优化代码,还能在编译阶段对程序进行“改造”——比如函数名加密、混淆、代码保护,让逆向工程变得更加困难。本文带你从零开始,体验一次完整的 LLVM 定制之旅:学习如何生成和操作 LLVM IR。

2025-09-08 11:47:45 751

原创 LLVM 全面解析:NDK 为什么离不开它?如何亲手编译调试 clang

LLVM(Low Level Virtual Machine)最初是一个编译器研究项目,如今已发展成一个模块化、可重用的编译器框架。它包含前端(Frontend)、中间表示(IR, Intermediate Representation)、优化器(Optimizer)和后端(Backend, Code Generator)等组件。开发者可以使用 LLVM 将高级语言源代码(如 C/C++、Rust、Swift 等)转换成中间表示,再经过优化和代码生成,最终编译为机器码。

2025-09-06 16:21:55 866

原创 静态分析神器 + 动态调试利器:IDA Pro × Frida 混合调试实战

IDA Pro 作为静态分析神器,能快速反编译 so 库,展示清晰的函数结构和反汇编代码,但它对运行时行为却一无所知;而 Frida 能在设备上动态 Hook 任意函数,实时观察寄存器、参数、返回值。把 Frida 直接集成进 IDA Pro!这样我们就能在IDA 里调用 Frida API,实时获取目标 App 中 so 的基址、动态执行状态,甚至一键启动 Trace。

2025-09-06 16:20:10 1270

原创 静态分析根本不够!IDA Pro 动态调试 Android 应用的完整实战

在进行 Android 应用逆向分析时,很多时候仅靠静态分析(例如反编译 Java 代码或反汇编 so 库)是远远不够的。开发者常常会使用混淆、加壳、动态加载等技术,使得代码逻辑在静态视角下难以完整还原。此时,动态调试就显得尤为重要。通过动态调试,我们可以在应用运行过程中实时观察其行为,例如:精确跟踪函数调用过程监控寄存器与内存的变化分析加密/解密算法的输入与输出定位并绕过反调试逻辑IDA Pro。

2025-09-05 14:51:48 1233 1

原创 攻防 FART 脱壳:实现 AJM 壳级别的对抗功能 + 绕过全解析

proc/self/maps 是 Linux(含 Android)系统中一个非常重要的伪文件,它提供了当前进程内存映射(memory mapping)信息,是分析当前进程加载了哪些资源的重要窗口。再重新 dump dex,这时可以看到 dump 下来的 dex 魔数都是 dex 039 / dex 035 (标准 Dex 文件的魔数)不是 cdex001,可以直接用 jadx 去反编译了。映射的 /system/, /data/, /apex/, /dev/ashmem 等文件。

2025-09-05 14:49:29 730

原创 别再手工写 Hook 了!Python + Frida 一网打尽 SO 层动态注册 JNI 调用

很多 Android 应用会把核心逻辑都写在 SO 层,并通过动态注册 JNI 方法,把 Java 层的 native 方法和真实的 C/C++ 函数地址在运行时绑定。通过这样隐藏真实函数名和地址,增加逆向难度。虽然我们可以 Hook RegisterNatives 拿到所有 JNI 绑定信息,但是:函数数量巨大:可能有上百上千个 JNI 方法。调用路径未知:不知道哪些函数会被实际调用。手动 Hook 成本高:一个个写 Frida Hook 既耗时又容易漏掉。

2025-09-04 15:17:23 1782

原创 深入内核交互:用 strace 看清 Android 每一个系统调用

strace 是 Linux 下用于跟踪一个程序在运行时所发生的系统调用(system calls)和信号(signals)的调试工具。它可以快速了解程序与内核之间的交互,是定位程序异常、分析行为、逆向工程等场景中的利器。相关链接:hl=zh-cn。

2025-09-04 15:15:43 1273

原创 FART 脱壳不再全量!用一份配置文件精准控制节奏与范围

FART 在默认模式下会对所有 App 执行全量脱壳:每次 App 启动都会自动触发脱壳对 App 内所有类进行主动调用这种“全覆盖”方式虽然简单粗暴,但效率低、启动时间长,且无法跳过针对 FART 的对抗类,甚至会被无意义的垃圾类拖慢进程。如果能通过一份简单的配置文件,就能精准控制 FART 的脱壳过程——包括是否启用脱壳、延迟启动时间、指定需要主动调用的类、排除特定类规则等。不仅能显著提升脱壳效率,还能有效规避对抗类带来的干扰,让 FART 更加灵活、可控。干掉抽取壳!

2025-09-03 14:44:54 393 2

原创 FART 自动化脱壳框架优化实战:Bug 修复与代码改进记录

FART 中通过 mkdir 函数在 sdcard 上创建 dump 文件存放目录,但是这样必须 app 拥有存储卡读写权限。在 Android 编译构建阶段的 dex2oatd 工具执行时 调用了 art_method.cc 中的方法,导致出现下面的日志。这个判断条件其实是不严谨的,导致 if 中 的 close(dexfilefp);解决方案:把 dump 路径改为:/data/data/<packageName>/fart。成功时:返回一个非负整数(即 >= 0),它是打开的文件描述符。

2025-09-03 14:43:34 847

原创 Frida + FART 联手:解锁更强大的 Android 脱壳新姿势

主动调用时 dump 得到的 dex (*_dex_file.dex)和此时 dex 中的所有类列表,以及该 dex 中所有函数的 CodeItem( bin 文件)Execute 脱壳点得到的 dex (*_dex_file_execute.dex)和 dex 中的所有类列表( txt 文件)枚举出所有 ClassLoader 后,再结合 FART 的 api 就可以实现动态加载 dex 的脱壳。增强 FART 的脱壳能力:解决对抗 FART 的壳、动态加载的 dex 的 dump 和修复;

2025-09-02 15:32:40 1416

原创 FART 主动调用组件深度解析:破解 ART 下函数抽取壳的终极武器

/ DEX 字节码必须按照 4 字节对齐private:// 方法使用的虚拟寄存器数量(包括本地变量和参数)// 方法的入参占用的寄存器数量// 方法调用其他方法时所需的最大出参寄存器数量(即调用其他方法时的参数空间)// try-catch 块的数量。如果不为 0,则在 insns_ 后紧跟 try_item 和 catch_handler。// 调试信息在 DEX 文件中的偏移,指向 debug_info 结构// 包括局部变量名、源码行号映射等。

2025-09-02 15:31:27 686

原创 一步步带你移植 FART 到 Android 10,实现自动化脱壳

~~~~~~~^说明:Android 6.0 中有 mirror::AbstractMethod;Android 10 中已经移除或合并进 Executable / Method 等类型。修复方式:使用 mirror::Executable(它是 ART 中 java.lang.reflect.Method 和 Constructor 的基类)代替。= nullptr);

2025-08-31 21:39:07 758

原创 FART 主动调用组件深度解析:破解 ART 下函数抽取壳的终极武器

/ DEX 字节码必须按照 4 字节对齐private:// 方法使用的虚拟寄存器数量(包括本地变量和参数)// 方法的入参占用的寄存器数量// 方法调用其他方法时所需的最大出参寄存器数量(即调用其他方法时的参数空间)// try-catch 块的数量。如果不为 0,则在 insns_ 后紧跟 try_item 和 catch_handler。// 调试信息在 DEX 文件中的偏移,指向 debug_info 结构// 包括局部变量名、源码行号映射等。

2025-08-31 21:37:33 1117

原创 干掉抽取壳!FART 自动化脱壳框架与 Execute 脱壳点解析

在 Android ART 环境中,市面上一些加固方案会通过“函数抽取壳”将应用的核心逻辑剥离,运行时再动态加载执行,从而增加逆向分析的难度。FART 是一种基于主动调用的自动化脱壳方案,能够在 ART 虚拟机的执行流程中精准捕获并还原这些被抽空的函数,实现对被加固的 dex 文件整体 dump。打造基于 ART 的 Android 函数抽取壳:原理剖析与完整源码实战。

2025-08-30 14:27:02 1796

原创 深入解析 dex2oat:vdex、cdex、dex 格式转换全流程实战

为了提高性能,Android 会将 .dex 文件进一步编译为 .oat 文件(或 .odex/.vdex 文件),以便设备可以直接执行本地代码而不是解释执行 .dex 字节码。在 Android 9(Pie)中,APP 的 .cdex 文件 是由 dex2oat 优化生成的,通常以 odex, vdex 或直接优化后的 .art 文件形式存在。输入:一个或多个 .dex 文件(通常来自 APK 中的 classes.dex)。.oat / .odex:包含从 dex 编译来的 优化后的中间表示代码。

2025-08-30 14:04:10 1002

原创 Miniconda 全攻略:优雅管理你的 Python 环境

Miniconda 是 Conda 的简化版本,只包含 Conda 包管理器和 Python 的最小安装包,提供了一种轻量级的环境管理和包管理工具。相比于 Anaconda,Miniconda 更小巧灵活,适合那些不需要 Anaconda 提供的完整生态的用户。通过 Miniconda,开发者可以更高效地管理和定制自己的开发环境,避免不必要的依赖和资源浪费。把 Miniconda3 和 Miniconda3\Scripts 路径添加到 Path 系统环境变量完成安装后,打开终端或命令提示符,输入。

2025-08-29 17:19:09 1510

原创 使用 readelf 分析 so 文件:ELF 结构解析全攻略

readelf 是 GNU Binutils 提供的一个命令行工具,专门用于读取 ELF(Executable and Linkable Format)文件的结构信息。

2025-08-29 17:17:36 959

原创 Android 源码如何导入 Android Studio?踩坑与解决方案详解

解决90%踩坑问题!LineageOS 源码下载与编译保姆级教程idegen.sh 脚本生成项目文件,一步步排除导入过程中常见的坑点,将 Android 源码集成进 Android Studio 环境中,从而实现高效阅读与调试系统代码。

2025-08-28 15:20:00 843

原创 逆向某短视频App搜索协议:破解加密通信,还原真实数据!

TTNet 是****基于 Retrofit 深度改造的闭源网络框架,集成请求加密、拦截器链路、性能埋点和客户端密钥机制,广泛用于其内部 App 的网络通信。intercept(Request request) 是 “请求拦截器” 方法,用于修改或替换请求内容,添加 headers、加密参数、签名等。找到 TTNet 的拦截器:com/*********/ttnet/retrofit/SsInterceptor。截取下来的数据如下,Reqeust Body 是经过编码加密的二进制数据。

2025-08-28 15:12:05 1873

原创 动态篡改 so 函数返回值:一篇带你玩转 Android Hook 技术!

第三方 SDK 中的 so ,VMP壳 + OLLVM 混淆。ca 函数在 libhexymsb.so 偏移 0x09C8 的位置。需求:修改 so 中 ca 函数的返回值,固定为 true。只需要在 java 层添加如下代码,加载 sohooker 动态库就能实现篡改目标 so 函数的返回值。

2025-07-29 17:44:13 1041

原创 OLLVM 混淆 + VMP 壳照样破!绕过加壳 SDK 的核心检测逻辑

逆向目标是一个第三方 SDK,核心代码在 so 层,已知 so 有加壳。调用入口是 *******************************************,会触发 libhexymsb.so 中的 token 和 time 检查方法,目标是绕过检查并成功调用 SDK。

2025-07-28 09:30:04 1386

原创 手把手教你改造 AAR:解包、注入逻辑、重打包,一条龙玩转第三方 SDK!

AAR 文件(Android Archive)是 Android Studio 用来打包 Android Library(库模块) 的一种压缩文件格式,扩展名是 .aar,类似于 Java 的 .jar 文件,但功能更丰富,用于复用 UI 组件、资源和代码。AAR 文件结构(解压后)├── AndroidManifest.xml # 库模块的清单文件├── classes.jar # 编译后的 Java/Kotlin 类文件(字节码)

2025-07-28 09:27:24 1118

原创 一键反编译、签名、安装 APK!手把手带你玩转 ApkTool + 签名工具

apktool 用于对 Android 应用(.apk 文件)进行 反编译 和 重打包(回编译)。它可以将 APK 中的资源文件、AndroidManifest.xml 以及 DEX 代码(转换为 smali 代码)提取出来并可编辑,便于进行逆向分析、修改资源或注入逻辑等操作。

2025-07-25 15:03:20 1097

原创 彻底搞懂 Retrofit:使用、封装与 Converter 原理

Retrofit 是 Square 公司开发的一个 类型安全的 HTTP 网络请求库,广泛应用于 Android 开发中。它极大地简化了 REST API 的调用方式,让网络请求就像调用本地接口一样简单。

2025-07-21 14:28:58 1088

原创 打造自己的 Jar 文件分析工具:类名匹配 + 二进制搜索 + 日志输出全搞定

在逆向分析、APK 解包或 Java 工程排查中,我们常常需要检查某个 .class 文件是否存在于某个 JAR 包中,或者判断某个关键字是否被硬编码在类的字节码里。如何通过编写 Python 脚本,帮助你在 JAR 文件中快速定位类、字段,甚至二进制内容。

2025-07-21 13:23:55 1058

原创 一文搞懂 Smali 与 Baksmali:Java 层逆向必备技能

dex2smali.py 是一个用于批量反编译 Android .dex 文件为 .smali 的 Python 脚本,底层调用 baksmali.jar 进行实际转换。支持将多个 dex 反编译结果:合并到一个目录(默认),或分别输出(使用 --no-merge)smali:将 smali 代码(Java汇编语言)编译成 DEX 文件。-o smali:指定输出目录,保存生成的 .smali 文件。-o new_classes.dex:输出的 DEX 文件名。smali:输入的 smali 文件目录。

2025-07-21 13:20:23 1677

原创 如何实现 Android App 的抓包防护?又该如何绕过?一文看懂攻防博弈

常见反抓包手段:No Proxy(禁用代理)启用 HTTPS + SSL Pinning使用 DNS-over-HTTPS / DoT(隐藏 DNS 请求)检查系统代理(Java 层检查 System.getProperty(“http.proxyHost”))检测 VPN 或 adb 代理使用 native 层自己实现网络请求(绕过 Java 层)证书双向校验所谓 “无代理模式” 实际上是通过主动避免走系统代理,从而规避传统的中间人抓包。设置 OkHttp 不使用系统代理,直接访问服务器:设置 NO_P

2025-07-02 15:36:34 1073

JS 精彩两百例

JS 精彩两百例

2015-05-30

工程打成jar包供第三方调用示例

工程打成jar包供第三方调用示例

2014-06-04

Cocos2d-x2.1.5的代码提示包

用于cocos code ide中的Cocos2d-x2.1.5的代码提示包

2014-10-17

Cocos2d-x 遮罩效果

Cocos2d-x实现遮罩效果

2014-10-15

Cocos2d Particle Builder粒子编辑器

Cocos2d Particle Builder粒子编辑器

2014-07-09

jar2exe绿色破解版

将jar包转换为exe执行文件的工具

2014-07-06

Java就业培训教程(带书签)

Java就业培训教程(带书签),pdf格式文件

2014-06-04

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除