Android 技术: 追踪vm 如何调用基础类

SO逆向入门实战教程六:s 文章目录一、前言二、准备三、Undibg模拟执行四、算法还原五、尾声 一、前言 第六篇,主要内容是简单JAVA环境的填补。 二、准备 如图红框是我们的目标函数,入参是sortedMap接口的实现类对象,比如TreeMap对象,返回值是SignedQuery类对象。 参数和返回值都比较特殊,不是我们前面处理过的基本类型和对象,所以举个例子,这是Frida 的callSign代码 // Call Sign 函数 function callsign() { Java.perform(function. 阅读详情

Android 启动的时候创建第一个 vm 程序 zygote, 而后用它孵化所有的 vm 进程( 就是 java 进程), 这是因为 vm 比较吃内存, 用孵化的方法可以共享内存, 尤其是代码段. 而Linux的内存管理是 copy on write, 所以 fork 使得内存共享得以实现


虚拟机 vm 就是一个 runtime,  解释 byte 并运行而已.  loadloader 负责吧clas装载到内存中, 而且vm 可以注册本地函数, 而后用 native call 调用执行, 这个机制就是 JNI

当你运行一个vm的时候, 发现有如此多的 java 基础类可以调用, 而通过设定 class path 又可以调用更多的类库, 是否很神奇


通过分析 harmony 的一段代码,  探究vm 如何调用基础类

harmony 是一个开源的项目, 目标是替换掉 sun 提供的基础类(为了让java 脱离 sun (现在是 Oracle) 的控制)


我们运行java的时候,调用 System 那么他们是如何附着到 VM 上的.

察看: System.java
static {
         ...
        out = new String.ConsolePrintStream(new BufferedOutputStream(new FileOutputStream(
                FileDescriptor.out)));
        in = new BufferedInputStream(new FileInputStream(FileDescriptor.in));
        ...
    }

可以看看其调用了 FileInputStream
察看: FileInputStream.java
 private IFileSystem fileSystem = Platform.getFileSystem();
调用了 Platform

察看:  Platform.java
static final IMemorySystem MEMORY_SYSTEM = OSMemory.getOSMemory();
调用OSMemory

察看: OSMemory.java
    public native long malloc(long length) throws OutOfMemoryError;
    public native void free(long address);

再找到 OSMemory.c 如下
    这下真相大白了, 原来 基本类库 也是用 JNI 的方法实现的, 就是说调用关系是 java -> java 基础类-> jni

    那么可以预测 图形库, sockets 等也都是JNI来实现的了

JNIEXPORT jlong JNICALL Java_org_apache_harmony_luni_platform_OSMemory_malloc
  (JNIEnv * env, jobject thiz, jlong size)
{
  PORT_ACCESS_FROM_ENV (env);

  void *address = hymem_allocate_memory ((UDATA) size);

  if (address == NULL)
    {
      throwNewOutOfMemoryError(env, "Insufficient memory available.");
    }

  return (jlong) ((IDATA) address);
}

JNIEXPORT void JNICALL Java_org_apache_harmony_luni_platform_OSMemory_free
  (JNIEnv * env, jobject thiz, jlong address)
{
  PORT_ACCESS_FROM_ENV (env);

  hymem_free_memory ((void *) ((IDATA) address));
}


Frida动态追踪:穿透Android代码混淆,精准Hook核心函数实战 在移动安全与逆向工程领域,动态分析是理解应用行为的关键技术。其核心原理在于通过运行时注入,拦截和修改程序执行流程,从而在不依赖源代码的情况下分析逻辑、调试或测试应用。这项技术的核心价值在于能够穿透代码混淆、加密等保护措施,直接观察应用的真实行为。在Android平台,Frida作为主流的动态插桩框架,通过JavaScript脚本与目标进程交互,为安全研究员和开发者提供了强大的运行时分析能力。典型的应用场景包括分析混淆后的登录验证算法、定位加密函数、追踪网络请求数据流等。本文以Android应用安全分析为背景 阅读详情

相关推荐

ARM64栈回溯原理剖析:从Apatch内核模块到Android系统调用追踪

本文深入剖析了ARM64架构下的栈回溯原理,重点介绍了Apatch内核模块在Android系统调用追踪中的应用。通过解析FP/LR寄存器工作机制和用户态栈帧布局,详细讲解了如何在内核模块中实现高效的栈回溯算法,并提供了系统调用监控的实战示例,为移动安全分析和性能调优提供了重要技术参考。

weixin_29276847的博客 145

unidbg学习笔记

修改src/main/java/com/github/unidbg/AbstractEmulator.java 中的如下位置,使PID固定,因为PID不停变动可能会影响后续分析,但这不是必须的操作。千万不要先管它,非法JNI Verision的错误往往代表JNI OnLoad的总体执行情况不符合预期,它是。JNIOnLoad的最终结果,我们应该在修复完其他错误后看它是否存在。

爬虫工程师的日常笔记 2530

Android 应用启动优化:Perfetto 系统级追踪实战,定位 186ms 布局耗时瓶颈

本文详细介绍了如何使用Perfetto进行Android应用启动优化,通过系统级追踪工具定位186ms布局耗时瓶颈。文章涵盖Perfetto环境配置、追踪捕获、与Android Studio Profiler的对比分析,以及实战案例和高级优化技巧,帮助开发者全面提升应用启动性能。

weixin_30765577的博客 399

unidbg 模拟执行案例(某汽车类app)(续)

unidbg 模拟执行案例 直接frida hook hookClass.addCheckCode.overload('java.lang.String', 'int').implementation = function (p1, p2) { console.log('222p1 ===> ' + p1); console.log('222

chilly 2816

Hypervisor层Tracing实战:从VM Exit到虚拟化故障根因定位

虚拟化环境中,应用故障往往隐藏在不同层级之间,guest OS内部的调试工具难以观测到Hypervisor层的调度与拦截行为。Hypervisor Level Tracing技术通过在虚拟机监控器层捕获VM Entry/Exit、EPT Violation、中断注入等关键事件,为虚拟化调试提供了底层证据链。这项技术能够揭示虚拟CPU在用户态与内核态之间频繁切换的根源,定位中断注入延迟、TLB Shootdown异常等疑难问题,弥补guest内观测手段的盲区。在云原生基础设施保障、虚拟化平台运维等场景中,Hy

weixin_34269583的博客 460

HFSS实战(三)——过孔via TDR仿真

在上一讲中,主要是通过观察S参数确定via的优化是否达到目标。但S参数只能看到一个整体的结果,并不知道via真实的阻抗是多少?想要单独确定via的阻抗,最好还是通过TDR的仿真。

luohuo9844的博客 1万+

热修复原理学习(4)冷启动类加载原理,flutter路由动画

综上可知,如果类没有在加载时的verifyAndOptimizeClass()的方法打上 CLASS_ISPERVERIFIED/CLASS_ISOPTIMIZED这两个标识,则会在 类的初始化时去执行类的校验和优化。 由于类检验的任务可以认为是很重的,因为会对类的所有方法中的所有指令都做校验,单个类加载时耗时并不多,但是同一个时间点加载大量的类情况下,这种耗时就会被放大。所以这也是插桩给类的加载效率带来比较大影响的后果。(因为这些情况都是放在第一次安装Apk的时候做的) 我们知道若采用插桩,会导致所有类都

m0_65321095的博客 1746

GD32H7实战:5步搞定YOLO轻量化模型部署到MCU(附避坑指南)

本文详细介绍了如何将YOLO轻量化模型部署到GD32H7 MCU的完整实战流程。通过五个关键步骤,涵盖环境搭建、模型训练、格式转换到工程集成,并重点分享了使用GD32AI-ModelZoo工具链进行MCU部署的避坑指南,帮助开发者在资源受限的边缘设备上实现高效目标检测。

weixin_29070861的博客 445

Unidbg补环境实战第一篇:补环境入门

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。同时每个成长路线对应的板块都有配套的视频提供:当然除了有配套的视频,同时也为大家整理了各种文档和书籍资料&工具,并且已经帮大家分好类了。

ALLEN'Blog 6384

Windows安装ros2(Jazzy版本+win10/win11)-1.配置windows终端

更高版本的terminal可能设置里更加丰富, 有默认以管理员身份启动的选项等,可自行配置。打开微软应用商店, 在其中搜索并下载 Terminal 即可(注意别挂梯子)下载并安装, 安装的位置自行替换,建议别放到系统盘中。点击任务栏中的搜索, 输入store。

weixin_48398592的博客 1452

逆向实战:从x-mini签名到RPC调用,Frida动态分析小红书加密协议

本文通过实战案例,详细拆解了小红书App的加密协议逆向分析过程。从识别x-mini签名等关键参数入手,结合静态分析与Frida动态Hook技术,追踪到核心的RPC调用入口,并最终封装成可独立调用的RPC函数,为安全研究和协议理解提供了完整的技术路径。

moss5的博客 1025

Dart SDK 中 vm_service_protos 包详解:解码 VM 服务返回的 Perfetto 追踪 Protobuf

本文围绕 `pkg/vm_service_protos` 包的 README 及其实际源码展开,讲解这个用于解码 Dart VM 服务协议(VM Service Protocol)返回 Protobuf 数据的库:它导出了哪些 Perfetto proto 类型、如何配合 `getPerfettoVMTimeline` 与 `getPerfettoCpuSamples` 两个 RPC 把 Base

gitblog_00192的博客 1017

Arduino——GY39大气压、温湿度、光照模块

前几天买东西的时候买了一个GY39,这个模块集成了温湿度,大气压,海拔,光照一体,使用起来很方面。它有两种工作模式使用串口模式时需要搭配转接板,我选择了IIC模式,看一下通信协议吧,就是关于高八位和低八位的数据。看一下接线。

戚晨夕的博客 2604

Dart VM Timeline(时间线/追踪)机制完全指南:Recorder、Streams 与 VM Service 实战

本指南以 Dart SDK 官方文档 [runtime/docs/timeline.md](https://link.gitcode.com/i/098a556516d6a23736ed5ff5af20c521) 为核心骨架,系统讲解 Dart VM 的时间线(Timeline,又称 tracing)机制:如何通过 `--timeline_recorder` 选择事件收集器、通过 `--timel

gitblog_06897的博客 229

Greenplum基础

CREATE DATABASE 是 SQL 命令,用于创建一个新的数据库。name 是你要创建的数据库的名称。这个名称是必须的,并且在同一个数据库服务器上必须是唯一的。可选项,OWNER 指定了新数据库的所有者,如果未指定,新数据库的所有者默认是执行该命令的用户。dbowner 是数据库所有者的用户名。可选项,TEMPLATE 指定了用于创建新数据库的模板。在 PostgreSQL 和 GreenPlum 中,通常有一个名为 template1 的默认模板。如果不指定,就会使用这个默认模板。

m0_57697768的博客 1206

TSP:车为什么能和云端交互?

TSP:车为什么能和云端交互?

天赐好车的博客 408

Vectras VM Android虚拟化平台深度解析:移动设备多系统运行的技术实现

如何在Android设备上构建完整的虚拟化环境?Vectras VM作为基于QEMU架构的移动端虚拟化解决方案,为开发者提供了在单一移动设备上运行Windows、Linux、macOS和Android系统的技术能力。本文将从技术原理、配置优化到应用场景,全面剖析这一虚拟化平台的核心价值。 ## 技术架构与实现原理 ### QEMU虚拟化引擎的移动端适配 Vectras VM的核心技术在于将桌

gitblog_00555的博客 1150

基于HetConv与Dual策略的YOLOv8轻量化设计-CSPHet结构的优化与实现

在计算机视觉中,YOLOv8作为目标检测领域的最新版本,通过引入多种改进来提升检测精度和速度。然而,提升精度和保持实时性能往往需要更多参数与计算量。本文提出一种结合Dual思想与HetConv的新型轻量化结构,称为CSPHet。CSPHet能够在保持YOLOv8检测精度的基础上有效减少约70万参数量,实现模型的轻量化和速度的提升。HetConv(Heterogeneous Convolution)是一种混合卷积技术,通过同时使用1x1、3x3等不同大小的卷积核,来捕捉不同尺度的特征。

博客 1323

Android Framework 调用栈

在Android Framework开发中,添加调用栈(Call Stack)是调试复杂问题(如崩溃、死锁或流程追踪)的核心手段。适用于Activity、Service等组件或Framework中的Java代码。使用Log日志会输出从当前点回溯的完整调用链,包含类名、方法名及行号。onCreate()适用于HAL、JNI或系统服务等底层模块。(需链接libutils:Android 8.0+需用替代旧版libcutils。.sondk-stack适用于驱动或内核模块调试。VM。

aningxiaoxixi的博客 839

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Vectras VM Android虚拟化平台终极指南:移动设备多系统运行完整教程

在当前移动计算快速发展的时代,如何在单一Android设备上实现多系统运行已成为技术爱好者和开发者的迫切需求。Vectras VM作为基于QEMU架构的移动端虚拟化解决方案,通过创新的技术实现,让Android设备具备了运行Windows、Linux、macOS等多种操作系统的能力,为移动开发测试和跨平台应用提供了全新可能。 ## 移动虚拟化面临的核心技术挑战 传统虚拟化技术在移动设备上面临着

gitblog_00871的博客 975

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

基于eBPF的syscall追踪工具教程

基于eBPF的syscall追踪工具教程 1、项目介绍 estrace 是一个基于eBPF(Extended Berkeley Packet Filter)的syscall追踪工具,专门为安卓平台设计。eBPF是一种强大的内核技术,允许用户在不修改内核代码的情况下,动态地在内核中执行自定义代码。estrace 利用这一技术,能够实时追踪和分析安卓系统中的系统调用(syscall),帮助开发者深入了...

gitblog_00059的博客 527

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

android dalvikvm

以下是一份详细的dalvikvm。

qq_62784677的博客 620

kotlinx.coroutines 协程调试全指南:调试模式、堆栈追踪恢复与调试代理

调试使用协程的应用往往比调试普通线程代码更困难:多个协程可以并发运行、在一个线程上挂起、在另一个线程上恢复,且执行顺序与所用线程在不同运行之间还会变化,很难跟踪某个特定协程的执行过程。本指南基于 kotlinx.coroutines 官方调试文档 [docs/topics/coroutines-debugging.md](https://link.gitcode.com/i/1ffeb74b924

gitblog_00671的博客 207

堆栈追踪利器:基于eBPF的stackplz项目入门指南

**stackplz** 是一款专为Android平台打造的高效堆栈追踪工具,其核心优势在于利用先进的eBPF技术,实现了对系统调用、用户态动态库以及硬件断点的高度监控能力。它不仅能够精准捕捉syscall的细节,如参数信息、调用栈和寄存器状态,还能对64位用户态库的函数调用进行深入分析。此外,stackplz内置的硬件断点特性进一步增强了其调试灵活性,尤其在与Frida联动时展现了强大的互动性和...

gitblog_00108的博客 987

安卓Native层共享库fuzzing技术思路及实践

fuzzing技术在漏洞挖掘领域是一个无法绕开的话题,无恒实验室也一直在使用fuzzing技术发现产品的问题。虽然fuzzing不是万能的,但是没有它是万万不能的。说它不是万能的其实也是相对的说法,理想状态下,例如在可接受的时间范围内,计算资源足够丰富且系统复杂度足够低的情况下,fuzzing就能够给你任何想要的结果。这就好像是让一台计算机去随机的print一些文字,只要时间足够长,随机字符产生的效率足够快,那么早晚有一天会print出一部《三体》出来。

AzulSystems的博客 383

Android恶意代码分析流程,【技术分享】Android恶意软件分析

预估稿费:200RMB(不服你也来投稿啊!)投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿目的这个练习涵盖了技术分析Android恶意软件通过使用一个定制的恶意软件样本在Android设备上运行时,将会reverse shell给一个攻击者。我们将通过使用静态和动态分析技术分析完整功能应用程序。虚拟机使用:Santoku Linux VM工具:AVD Manager, ADB...

weixin_39865061的博客 1071
上一篇: Android 代码分析 私有析构函数
下一篇: CRC32 vs Java.HashCode
span76
博客等级 码龄18年 117粉丝 174原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值