Android vmp加固样本分析

2023-10-06 22:30
文章标签 分析 android 样本 加固 vmp

本文主要是介绍Android vmp加固样本分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Android vmp 加固

即虚拟保护技术 通过 随机opcode 或者dex2c 保护代码的一种方式

之前分析样本拿到了一个vmp 加固的,由于时间急迫暂时没有管,

今天闲来没事就索性分析一波

该样本用jeb 打开 是这样的

和这样的

典型的vmp加壳特征

 NativeUtil.classesInit0(2); 

就是我们的突破口

我们直接找到该so 开整

我们看到有很多的native 函数 我们直接搜

很遗憾 没有搜到 很显然是 动态注册的函数

 接下来直接hook art 打印出动态注册的 函数地址

通过ida找打该地址

我们先看 onCreate 因为我们使用的最多 最频繁 知道该函数的大致功能

及opcode

onCreate sig: (Landroid/os/Bundle;)V fnPtr: 0xca1717f1 module_name: libdex2c.so module_base: 0xca146000 offset: 0x2b7f1

还有就是onCreate 第一条指令大多数都是如下代码

protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);

这样我们好观察vmp 的指令到底有没有随机化  

通过G 快捷键 弹出地址跳转窗口 直接ok

跟进去一看  他调用了 j_vmInterpret  跟进去 一看 这个函数蒙蔽了

 我们在回过来 看 sub_2B7F0

通过我们仔细观察发现 这里面有几个结构体  

这些结构体 应该就是vm 的指令信息

补一下dalvik 知识

https://source.android.com/docs/core/runtime/dalvik-bytecode?hl=zh-cn

我们直接hook 结构体 看看里面有什么东西

Hook之前 看看是什么指令 alt + G

 1 表示是 thumb 指令 所以hook 地址要加1

指令dump信息

这时候我们随便看一个其他未加固样本的  oncreate 指令 第一条确实就是 super 调用

这里我们也假设 我dump 的第一条指令也是 super 调用

就发现指令很明显对不上

.method public onCreate()V

  .registers 1
00000000  6F 10 03 00 00 00       invoke-super        Application->onCreate()V, p0
Dump 下来的指令为
73 20 00 00 21 00

找指令码解释看看  

6F 10 03 00 00 00 

未加固的指令 指令解释

6f 为操作码

10 为参数字数

00 03为方法索引

00 00 为参数寄存器

接下来我们看看 dump出来的指令 假设没有随机化的指令

73 20 00 00 21 00

我们直接查opcode  73

OP_UNUSED_73                    = 0x73,

直接告诉我没有使用  那肯定不可能 对吧

所以我断定这个指令肯定被随机化了

回到sub_2B7F0 在看看

 j_vmInterpret 参数信息

红框里面的最可疑

由于v4 我们已经确认了就是指令  

off_2FD54 有可能就是dex 信息

我们先优化一下F5 的显示,同步到一个我们自定义的结构体

 

这样就好看一些了

 off_2FD54 包含了 6 个函数的地址

 我们随便跟进其中一个函数, sub_2B9B4+1  

首先 同步一下JNIEnv  ida 7.5 自带有 JNIEnv  结构体

char *__fastcall sub_2B9B4(JNIEnv *a1, int a2, int a3)

同步过后  发现了获取 GetFieldID 函数 这应该就是dex 成员列表信息了

根据dex 文件格式 field 信息应该包含 3个信息

classIdx  nameIdx  typeIdx

依次 跟下一个函数

DCD sub_2BAD4+1 进来看到了 GetMethodID 这应该就是函数的详细信息了

函数的结构包含

classIdx nameIdx protoIdx

通过该函数可以看到  aHotfixDex_0 应该是一个数组  如果没有猜错他应该是 dex 的string 信息因为该函数很多信息都是在 aHotfixDex_0 里面去取的

点进去  果然看到热更的包名字,果断把该数组的信息复制出来

  处理一下大概长这个样子 处理之后我们尽量按行来显示 因为后面我们会通过索引找这些字符串 不要一股脑的不换行全贴进去

随便找一个翻译一下 猜的没有错 就是dex 的数组信息

 再次回到 73 20 00 00 21 00 这个指令  现在我假设他就是 super 调用

正确的应该是下面这个 :

00000000  6F 20 00 00 21 00      invoke-super        Activity->onCreate()V, p0

我们直接看 DCD sub_2BAD4+1  《6F 20 《00 00》 21 00 opcode调用约定00 00 就是方法索引》 获取的是不是 Activity->onCreate()V 

我们继续跟 sub_2BAD4+1 函数

通过FindClass 就应该能知道

    v8 = &aHotfixDex_0[dword_183D8[dword_1B4B4[v7]]]; 这里返回的就是class 类了

那我们现在把 00 00 参数带进去

v7 = word_24160[8 * a2];  返回 1  | class的索引

dword_1B4B4[v7] 返回  0xC0C -》3084  | class的索引 Stirng偏移下标

dword_183D8  返回15998  | String 偏移

aHotfixDex_0 所在的 string 信息

 

由于我们Strng下标信息和数组信息都是按行排的 所以对应上就是以下一窜数据

  616e64726f69642f6170702f416374697669747900

翻译一下 果然就是 android/app/Activity

类找到了 接下来找函数  即 nameidx

我标记的 数据 1  2 都有可能是函数的idex我们统统验证一下

 我们先看 结构体0xA97 的数据 即字符串下标2711的位置 翻译过来就是onCreate

 

 

 

所以连起来就是 android/app/Activity->onCreate 

所以 指令

73 20 00 00 21 00 -> 6F 20 00 00 21 00

 6F 20 00 00 21 00      invoke-super        Activity->onCreate()V, p0

通过以上操作 vmp 的第一条指令就解析出来了 接下来就是去找opcode 的操作码数组

String 数组

Method 数组

Filed 数组

Calss 数组等

然后把dump出来的 opcode 一一解析就可以了

这篇关于Android vmp加固样本分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/154280

相关文章

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

Android里面的Service种类以及启动方式

《Android里面的Service种类以及启动方式》Android中的Service分为前台服务和后台服务,前台服务需要亮身份牌并显示通知,后台服务则有启动方式选择,包括startService和b... 目录一句话总结:一、Service 的两种类型:1. 前台服务(必须亮身份牌)2. 后台服务(偷偷干

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

C#使用DeepSeek API实现自然语言处理,文本分类和情感分析

《C#使用DeepSeekAPI实现自然语言处理,文本分类和情感分析》在C#中使用DeepSeekAPI可以实现多种功能,例如自然语言处理、文本分类、情感分析等,本文主要为大家介绍了具体实现步骤,... 目录准备工作文本生成文本分类问答系统代码生成翻译功能文本摘要文本校对图像描述生成总结在C#中使用Deep

Android kotlin语言实现删除文件的解决方案

《Androidkotlin语言实现删除文件的解决方案》:本文主要介绍Androidkotlin语言实现删除文件的解决方案,在项目开发过程中,尤其是需要跨平台协作的项目,那么删除用户指定的文件的... 目录一、前言二、适用环境三、模板内容1.权限申请2.Activity中的模板一、前言在项目开发过程中,尤

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制

Redis主从复制的原理分析

《Redis主从复制的原理分析》Redis主从复制通过将数据镜像到多个从节点,实现高可用性和扩展性,主从复制包括初次全量同步和增量同步两个阶段,为优化复制性能,可以采用AOF持久化、调整复制超时时间、... 目录Redis主从复制的原理主从复制概述配置主从复制数据同步过程复制一致性与延迟故障转移机制监控与维

Redis连接失败:客户端IP不在白名单中的问题分析与解决方案

《Redis连接失败:客户端IP不在白名单中的问题分析与解决方案》在现代分布式系统中,Redis作为一种高性能的内存数据库,被广泛应用于缓存、消息队列、会话存储等场景,然而,在实际使用过程中,我们可能... 目录一、问题背景二、错误分析1. 错误信息解读2. 根本原因三、解决方案1. 将客户端IP添加到Re

Redis主从复制实现原理分析

《Redis主从复制实现原理分析》Redis主从复制通过Sync和CommandPropagate阶段实现数据同步,2.8版本后引入Psync指令,根据复制偏移量进行全量或部分同步,优化了数据传输效率... 目录Redis主DodMIK从复制实现原理实现原理Psync: 2.8版本后总结Redis主从复制实