
安卓逆向
文章平均质量分 85
烬柒小云
大学生
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
IDA动态调试环境配置全流程
IDA 动态调试 Android 原生程序指南 摘要:本文介绍使用 IDA 动态调试 Android 原生层程序的方法。主要内容包括:环境搭建(root 手机、IDA、android_server)、调试原理(ptrace 技术)、调试流程(程序上传、权限设置、端口转发),以及两种调试方法(直接调试原生程序和调试 APK 中的 so 文件)。特别说明了调试 APK 时需要以调试模式启动应用,并通过 DDMS 恢复执行。文章还提供了调试过程中常见问题的解决方法,如权限不足时的处理方案。原创 2025-06-15 14:42:37 · 1807 阅读 · 0 评论 -
怎么通过 jvmti 去 hook java 层函数
本文介绍了如何使用JVMTI在Android上手动实现Java函数Hook。核心原理有两种方式:监听方法调用事件和修改字节码。实现步骤包括:1)创建JVMTI Agent项目,编写包含ClassFileLoadHook和MethodEntry回调的C++代码;2)编译生成.so动态库;3)通过root设备注入或应用加载的方式部署Agent。关键技术点涉及JVMTI能力设置、字节码修改和事件回调处理,为Android逆向工程和安全研究提供了一种底层实现方案。原创 2025-06-04 17:40:17 · 975 阅读 · 0 评论 -
认识一下jvmti(很厉害的)
JVMTI(Java Virtual Machine Tool Interface)是JVM提供的原生编程接口,用于开发调试、性能分析和监控工具。它支持访问运行时数据(类信息、线程状态、内存管理等)、控制程序执行(断点调试、字节码修改)、事件监听(类加载、GC、异常)及性能分析(方法耗时、锁竞争)。JVMTI通过C/C++本地库以代理模式工作,需注意性能影响和线程安全。典型应用包括IDE调试器(如IntelliJ)、性能工具(JProfiler)和内存分析工具(MAT)。开发时需编写回调函数并编译为动态库,原创 2025-06-04 16:40:04 · 1081 阅读 · 0 评论 -
DexClassLoader 动态加载机制
文件中的类,而不需要在编译时静态引入。是 Android 提供的。示例:检测 Xposed。原创 2025-03-18 19:24:00 · 1100 阅读 · 0 评论 -
安卓7.0到11.0的更新变化(简单理解)
ART 内部结构和编译机制的改变使得传统的动态 hook 技术面临巨大挑战,迫使工具和技术不断更新。系统安全性和隐私保护措施的加强(如更严格的 SELinux、隐藏 API 限制、一次性权限等)增加了动态调试和代码注入的难度。内存保护和代码完整性检查机制的完善使得逆向工程师在进行内存补丁、dump 解密后的代码时需要额外的步骤和技巧。工具适配性和动态分析环境的构建要求逆向工程师不断跟进系统更新,采用新工具并开发新的绕过技术。原创 2025-03-11 10:45:08 · 827 阅读 · 0 评论 -
ART(Android Runtime)下 JNI 静态注册流程解析
来自动完成 Java 方法与本地(Native)方法的关联,不需要额外的。在 C/C++ 代码中,按照。静态注册是 JNI 方法的。在 Java 代码中,使用。,静态注册比动态注册略快。,因为方法名必须遵循。原创 2025-03-05 20:57:38 · 1026 阅读 · 0 评论 -
FridaHook_initarray 介绍
汇编程序通常分为几个段,每个段用于不同的目的。代码段(.text):存放程序的可执行指令。数据段(.data):存放已初始化的全局变量和静态变量。BSS 段(.bss):存放未初始化的全局变量和静态变量。堆栈段(.stack):用于存放函数调用时的局部变量和返回地址。_start:;程序入口.data:定义数据段,存放已初始化的变量。.data定义一个名为 myVar 的变量,初始值为 10.text:定义代码段,存放可执行指令。.text.equ:定义常量。定义常量 PI.byte。原创 2025-03-05 20:41:40 · 652 阅读 · 0 评论 -
ARM 可执行程序的生成过程
汇编程序通常分为几个段,每个段用于不同的目的。代码段(.text):存放程序的可执行指令。数据段(.data):存放已初始化的全局变量和静态变量。BSS 段(.bss):存放未初始化的全局变量和静态变量。堆栈段(.stack):用于存放函数调用时的局部变量和返回地址。_start:;程序入口.data:定义数据段,存放已初始化的变量。.data定义一个名为 myVar 的变量,初始值为 10.text:定义代码段,存放可执行指令。.text.equ:定义常量。定义常量 PI.byte。原创 2025-02-25 11:14:11 · 586 阅读 · 0 评论 -
安卓逆向之脱壳-认识一下动态加载 双亲委派(二)
自定义通常用于插件化框架中,它允许我们根据特定的需求,动态加载外部的dex文件或插件包。在实现自定义处理父类委托问题:如果插件中有类与系统类或主应用类冲突,需要通过委托机制避免重复加载。动态加载插件:使用自定义的加载插件中的.dex文件或.jar文件。// 使用系统默认的类加载器作为父加载器@Override// 逻辑:从插件的 dex 文件中读取字节码// 读取文件内容并返回字节数据我们可以通过重写方法来确保自定义类加载器按照双亲委派模式加载类。原创 2025-01-29 16:16:16 · 1813 阅读 · 0 评论 -
安卓逆向之脱壳-认识一下动态加载 双亲委派(一)
Android 使用多种来加载不同类型的类。默认情况下,Android 使用的是来加载应用程序的dex文件。系统 ClassLoader (:它负责加载 Android 系统核心库(如android.*和java.*等)。应用 ClassLoader (:负责加载应用程序的主dex文件。用户 ClassLoader (:在一些高级应用中,允许动态加载外部的dex文件(例如插件化框架)。每个都有自己的类加载路径,它们通过层层委托的方式来加载类。委托模式意味着一个会请求父加载类,直到找到该类为止。如果父。原创 2025-01-29 16:14:51 · 1750 阅读 · 1 评论 -
ARM指令修复逻辑与对齐机制
在ARM指令修复过程中,PC相关的指令通过LDR指令进行跳转,而PC无关的指令则可以直接复制。插入的NOP指令用于确保指令的4字节对齐,以提高性能和简化硬件设计。理解这些基本概念对于深入学习ARM架构和优化程序性能至关重要。原创 2025-01-17 13:36:03 · 496 阅读 · 0 评论 -
ARM处理器的指令流水技术与跳转机制
ARM处理器通过指令流水技术和PC寄存器的巧妙设计,实现了高效的指令执行和灵活的跳转机制。理解这些基本概念对于深入学习ARM架构和嵌入式系统开发至关重要。通过合理利用ARM指令集,开发者可以编写出高效、灵活的程序,充分发挥ARM处理器的性能优势。原创 2025-01-17 13:27:56 · 456 阅读 · 0 评论 -
IPC协议获取签名信息
IPC(Inter-Process Communication,进程间通信)协议是一组规则和机制,用于在不同进程之间交换数据和信息。IPC协议允许在同一台机器或通过网络连接的不同机器上的进程进行有效的通信与协作。常见的IPC机制包括管道(Pipes)、消息队列(Message Queues)、共享内存(Shared Memory)、套接字(Sockets)等。在IPC通信中,签名信息用于确保数据的完整性、真实性和不可否认性。原创 2024-12-23 11:40:45 · 1039 阅读 · 0 评论 -
安卓逆向之认识一下ioctl`函数
ioctl是一个功能强大的系统调用,允许用户空间程序与内核空间的设备驱动进行通信。它的灵活性使得它在设备控制和管理中非常重要。在 Android 逆向工程中,理解ioctl的使用和参数对于分析和修改设备驱动程序的行为至关重要。通过具体的示例代码,可以看到如何在实际应用中使用ioctl来获取设备信息并进行状态检查。原创 2024-12-12 16:30:29 · 1065 阅读 · 0 评论 -
安卓逆向之内部类没有重载方法的话,会是其他什么情况?(以及解决方案)
内部类没有重载方法不一定是唯一原因,可能是因为类没有普通的重载方法、使用了回调、接口、匿名类等机制。通过逐步打印类的信息(方法、构造函数、字段、父类等),你可以更详细地了解该类的结构,进而决定如何 Hook 该类的行为。[*] 找到嵌套类: com.ishumei.O000O00000OoO.O000O00000o0O\$1] 内部类没有重载方法.[*] 内部类所有方法:[*] 内部类所有构造函数:[*] 内部类所有字段:匿名类实现:这个类是一个内部匿名类,它实现了某些接口(很可能是。原创 2024-12-09 14:33:05 · 1247 阅读 · 0 评论 -
frida_hook_dlopen
Frida 脚本用于拦截 Android 应用程序中的dlopen和函数。这两个函数用于动态加载共享库,脚本通过拦截这些函数的调用来记录加载的库的路径。原创 2024-11-28 00:05:57 · 1155 阅读 · 0 评论 -
frida_hook_libart(简单解释)
这个 Frida 脚本是一个强大的工具,用于监控 Android 应用程序中的 JNI 调用。通过拦截libart.so中的关键方法,可以深入了解 Java 和本地代码之间的交互,帮助进行调试、分析和安全研究。脚本的灵活性和可扩展性使其能够适应多种分析需求。原创 2024-11-27 23:46:18 · 729 阅读 · 0 评论 -
通过抓包,使用frida定位加密位置
首先我们抓取一下我们要测试的app的某一个目标api,通过抓api的包,得到关键字。例如:关键字:x-sap-ri我们得到想要的关键字后,通过拦截 类,寻找我们的关键字,及找到发包收包的位置,并输出当时的调用栈,在栈里我们阔以定位到,是那个包里的类调用了。使用 Frida 脚本用于监控 Java 中HashMap的put方法,特别是当键为"x-sap-ri"时,记录调用栈和键值对。这个脚本可以帮助我们在动态分析 Android 应用时捕获特定的键值对操作。原创 2024-11-27 23:31:16 · 774 阅读 · 0 评论 -
安卓逆向的角度认识一下HashMap 类
HashMap是 Java Collections Framework 的一部分,属于java.util包。它实现了Map接口,提供了一种基于哈希表的键值对存储方式。由于 Android 应用程序是基于 Java 的,因此HashMap在 Android 开发中也被广泛使用。在 Android 逆向工程中,HashMap类的理解和使用是非常重要的。通过静态和动态分析,可以深入了解应用程序的行为,识别潜在的安全问题,并监控数据流动。使用工具如 Frida,可以有效地拦截和修改HashMap。原创 2024-11-27 21:48:29 · 964 阅读 · 0 评论 -
详解应用层抓包通杀原理(frida hook)(一)
简介仅限安卓平台,测试安卓7、8、9、10、11、12、13、14 可用;无视所有证书校验或绑定,不用考虑任何证书的事情;通杀TCP/IP四层模型中的应用层中的全部协议;通杀协议包括:Http,WebSocket,Ftp,Xmpp,Imap,Smtp,Protobuf等等、以及它们的SSL版本;通杀所有应用层框架,包括HttpUrlConnection、okhttp1/3/4、Retrofit/Volley等等;无视加固,不管是整体壳还是二代壳或VMP,不用考虑加固的事情;原创 2024-11-27 00:13:38 · 1284 阅读 · 0 评论 -
Frida高级逆向api(一)
Java.use用于获取 Java 类的引用。用于替换方法的实现。overloads用于处理方法重载,允许你指定特定的重载版本进行替换。修改返回值: 通过在新的实现中直接返回所需的值来实现。修改参数: 在新的实现中接收原始参数,进行修改后再调用原始方法。同时修改: 可以在同一个实现中同时修改参数和返回值,以满足特定的需求。调用静态函数: 直接通过类名调用,无需实例化。调用非静态函数: 需要先创建类的实例,然后通过实例调用方法。原创 2024-11-26 01:16:33 · 1539 阅读 · 0 评论 -
实战代码之unicorn模拟调用JNI接口函数(详细注释版,配合前面几篇食用更舒服(*^_^*))
首先,导入了必要的库,包括 Unicorn 和 Capstone,这些库提供了 CPU 模拟和反汇编的功能。钩子函数在特定事件发生时被触发,例如代码执行、内存读写和系统调用,这些函数的设计使得开发者能够实时监控模拟过程中的关键操作。代码的核心目标是实现对 ARM 代码的动态分析和调试,允许监控寄存器状态、内存操作和函数调用的细节。在模拟过程中,代码首先映射了内存区域,并将目标代码和数据写入模拟的内存中。在执行过程中,钩子函数会被调用,打印出当前的寄存器状态、内存读写操作和反汇编指令。原创 2024-11-14 20:39:59 · 290 阅读 · 0 评论 -
认识一下Unicorn
前缀: 使用特定的前缀(如)来标识寄存器的架构。寄存器名称: 使用寄存器的名称或编号,通常以大写字母表示。一致性: 保持命名的一致性,以便于开发者理解和使用。简化概况:UC_ + 指令集 + REG + 大写寄存器名UC_ARMREG + 大写寄存器名 (UC_ARM_REG_R0)UC_X86REG + 大写寄存器名 (UC_X86_REG_EAX)虽然 Unicorn 本身没有专门的异常处理类,但开发者可以创建自定义异常类来处理 Unicorn 模拟中的错误。原创 2024-11-13 20:50:56 · 1333 阅读 · 0 评论 -
使用 unicorn 和 capstone 库来模拟 ARM Thumb 指令的执行,并实现多个钩子(hook)来监控代码执行、系统调用和内存读写操作(二)
使用unicorn和capstone库来模拟 ARM Thumb 指令的执行,并实现了多个钩子(hook)来监控代码执行、系统调用和内存读写操作。主要功能是加载一段机器码,执行这些指令,并在执行过程中打印出相关信息。这些钩子提供了对模拟器执行过程的深入监控,允许开发者在指令执行、系统调用和内存操作时获取详细信息。这对于调试、分析和理解程序的行为非常有帮助。通过这些钩子,开发者可以实时观察寄存器和内存的状态变化,从而更好地理解程序的执行流程。原创 2024-11-13 17:24:29 · 1075 阅读 · 0 评论 -
使用 unicorn 和 capstone 库来模拟 ARM Thumb 指令的执行(一)
这段代码使用了unicorn和capstone库来模拟 ARM Thumb 指令的执行。它的主要功能是加载一段机器码,执行这些指令,并打印出执行前后寄存器的值。反汇编: 代码首先将机器码反汇编为可读的汇编指令,并打印出每条指令的信息。模拟执行: 使用 Unicorn 模拟器执行这些指令,并在执行前后打印寄存器的值,以便观察指令对寄存器的影响。寄存器操作: 通过指令的执行,寄存器的值会根据指令的逻辑进行更新。原创 2024-11-13 17:16:23 · 905 阅读 · 0 评论 -
认识一下ollvm的三种混淆(指令替换,虚假的控制流程,控制流平坦化)
描述这种混淆技术的目标只是将标准的二进制运算符(如加法、减法或布尔运算符)替换为功能等效但更复杂的指令序列。当有多个等效的指令序列可用时,随机选择一个。这种混淆相当简单,并且不会增加很多安全性,因为可以通过重新优化生成的代码来轻松删除它。但是,如果伪随机生成器的种子具有不同的值,则指令替换会带来生成的二进制的多样性。目前,只有整数运算符可用,因为替换浮点值的运算符会带来舍入误差和不必要的数值不准确。可用的编译器选项mllvm -sub:激活指令替换:如果通道已激活,则将其应用于函数 3 次。原创 2024-11-07 21:46:34 · 3579 阅读 · 0 评论 -
安卓逆向之过frida检测总结版
启动一个服务(fs1),监听。使用adb设置端口转发,使得本地计算机的6666端口可以与 Android 设备的6666端口通信。使用 Frida 连接到这个服务,指定要注入的目标应用程序(wuaipojie)和要加载的脚本(hook.js。原创 2024-11-04 11:41:26 · 4307 阅读 · 2 评论 -
安卓逆向之ARM汇编寻址,汇编指令
寄存器移位寻址允许对寄存器的值进行位移操作,适用于算术和逻辑运算。加载/存储寻址方式是 ARM 汇编中最常用的方式,用于在寄存器和内存之间传输数据。栈寻址是通过栈实现局部变量和函数调用的管理,使用PUSH和POP指令进行操作。在 ARM 汇编语言中,指令集非常丰富,涵盖了数据处理、控制流、内存访问等多个方面。以下是一些常见的 ARM 汇编指令的详细介绍,包括它们的功能、语法和示例。将两个寄存器的值相加,并加上进位标志(C)。语法示例。原创 2024-10-29 17:39:43 · 1051 阅读 · 0 评论 -
ELF文件格式解读及其生成过程(上)
Exccutable和Linkable标识ELF文件的俩大特性:可执行和可链接。ELF文件由各种各样的结构体连接在一起。1.Executable(执行状态)ELF文件将参与文件的执行工作,包括二进制程序的运行以及动态so的加载,它保持一个Execution View执行状态。它的单位是段。2.Linkable(链接状态)链接态的单位是节,链接视图在一个个节中,它的组成就是一个个节,我们介绍的就是这些节,了解这些节就可以清楚的认识链接视图。16// 魔数和其他信息// 其他字段...原创 2024-10-29 00:51:07 · 1544 阅读 · 0 评论 -
认识一下:__asm { int 80h; LINUX - sys_fork }
是一个用于调用 Linuxfork系统调用的汇编指令。虽然可以直接使用汇编语言进行系统调用,但在实际开发中,使用标准库函数通常是更好的选择。补充一下其他的c语言系统函数。原创 2024-10-22 10:14:36 · 553 阅读 · 0 评论 -
xposed与frida有什么区别?
Xposed 是一个框架,允许用户在不修改 APK 文件的情况下更改系统和应用程序的行为。它通过替换。原创 2024-10-21 13:56:50 · 1015 阅读 · 0 评论 -
dlopen函数
dlopen是一个强大的函数,允许程序在运行时动态加载共享库,提供了灵活性和扩展性。通过结合使用dlsym和dlclose,开发者可以有效地管理动态库的加载和使用。正确使用dlopen可以帮助开发者构建更灵活和可扩展的应用程序。原创 2024-10-15 14:08:27 · 908 阅读 · 0 评论 -
ART下的system.loadlibrary和System.load详细介绍
方法用于加载本地库(native library),这些库通常是用 C 或 C++ 编写的,并通过 Java Native Interface (JNI) 与 Java 代码进行交互。方法用于加载本地库(native library),与。在 Android Runtime (ART) 环境下,类似,但它的使用方式和参数略有不同。假设你有一个本地库文件位于。在 Android 中,原创 2024-10-15 13:34:15 · 1022 阅读 · 0 评论 -
【安卓逆向之内存读写
在 Android 逆向工程中,内存读写是一个常见的操作,通常用于分析和修改应用程序的行为。原创 2024-10-11 15:35:54 · 605 阅读 · 0 评论 -
IDA dump so脚本
要创建一个IDA脚本用于将特定内存区域的数据dump到文件,我们可以使用IDA Python API。原创 2024-09-29 11:51:45 · 557 阅读 · 0 评论 -
IDA快捷键
步过,一条一条执行命令,但是不进入子函数调用,并把寄存器的信息加入到Run跟踪的存储数据中。Ctrl+F11:Run跟踪步入,一条一条执行命令,进入每个子函数调用,并把寄存器的信息加入到Run跟踪的存储数据中。shift+f12:可以打开string窗口,一键找出所有的字符串,右击setup,还能对窗口的属性进行设置。Ctrl+F8:自动步过,一条一条的执行命令,程序到达断点,或者发生异常时,自动步过过程都会停止。Ctrl+F7:自动步入,在所有的函数调用中一条一条地执行命令,断点或异常时,自动 停止。原创 2024-09-24 14:51:49 · 763 阅读 · 0 评论 -
.plt段和.got段
plt段是动态链接的重要组成部分,允许程序在运行时调用动态库中的函数。通过延迟绑定机制,.plt提高了程序的灵活性和可扩展性。.got段是动态链接的重要组成部分,允许程序在运行时访问动态库中的全局变量和函数。通过动态链接器的重定位机制,.got提高了程序的灵活性和可扩展性。原创 2024-09-24 14:44:54 · 841 阅读 · 0 评论 -
进一步对.bss段,.data段和.text段的认识
全称.bss段的全称是 “Block Started by Symbol”。用途.bss段用于存储未初始化的全局变量和静态变量。它的主要目的是节省存储空间,因为未初始化的变量在程序加载时不会占用实际的存储空间,只在运行时分配内存。用途.data段用于存储程序中所有已初始化的数据。这些数据在程序编译时就已经被赋予了初始值。.text段是可执行文件(如 ELF、PE 等)中的一个重要部分,专门用于存储程序的可执行代码。它包含了程序中所有函数的机器指令,是程序的核心所在。原创 2024-09-24 14:31:39 · 2341 阅读 · 0 评论 -
INIT与init_array
使用INIT可以在 JNI 中创建 Java 对象。通过NewObject调用构造函数,并使用和调用对象的方法。确保在适当的地方释放局部引用,以避免内存泄漏。使用INITARRAY可以在 JNI 中创建和初始化 Java 对象数组。通过创建数组,并使用方法将元素添加到数组中。确保在适当的地方释放局部引用,以避免内存泄漏。这种方式可以有效地在 C++ 和 Java 之间传递对象数组,方便在 Android 应用中实现复杂的数据结构。static {原创 2024-09-22 21:55:13 · 1180 阅读 · 0 评论 -
作业报告┭┮﹏┭┮(Android反调试)
主要是用来防止IDA进行附加的,主要的方法思路就是,判断自身是否有父进程,判断是否端口被监听,然后通过调用so文件中的线程进行监视,这个线程开启一般JNI_OnLoad中进行开启的。但是这个是在这个之前断开的。思路→过反调试的话呢,就要把相关的函数进行NOP掉,直接将这几个字节改为00就可以了。原创 2024-09-22 21:41:15 · 900 阅读 · 0 评论