前言
安卓加固的相关知识在安卓逆向中是很关键的,之前的写的方法都是针对早些的整体加固和函数抽取型保护的壳,今天的文章主要是针对VMP保护的一个原理分析学习,下面也列出了其他的文章,是之前在学RASP写的关于class文件的文章和fart的脱壳分析学习。
相关文章:
Class文件
达达,公众号:Th0r安全RASP前置知识点:监控与软件攻防
安卓加固
达达,公众号:Th0r安全Fart完成函数粒度脱壳分析
前言
这里通过源码和一个样例来查看字节码的一个解析。
这是codeietm结构各个代表的含义
u2 registers_Size_;//方法使用寄存器个数
u2 ins_Size_;//参数个数
u2 outs_Size_;//调用其他方法使用参数个数
u2 tries_Size_;
u4 debug_Info_Off_;
u4 insns_Size_in_code_units_;//方法指令长度,二字节为单位
可以得知,偏移16之后,就是字节指令。
字节指令包括操作码和操作数。
其中一种解释器是通过switch实现,可以看到这边是通过do while循环进行遍历,还要其他的实现,比如跳转表,这里作为示例的就是switch。
获取PC
针对字节码解析,比如第一条NOP,就是直接跳过。
对于MOV指令,就是通过设置虚拟寄存器,把后面的赋值给前面。
对于Invoke指令,就是通过methodid查找函数
这里看到网上的一个VMP壳,ADVMP,先对Codeitem进行抽离,包括方法指令/访问标志/参数个数等等信息
之后再通过解析之前保持信息在的yc文件,来进行复原
这里用的就是跳转表的形式
结尾
对于其他的VMP,就是更改了字节码的映射关系,然后增加自带的反调试。从现在的理解来看,VMP就是自己写的一套解析映射器,然后动态的注册JNI函数,所以一般的VMP加壳,java层的函数都会变为native。
原文始发于微信公众号(Th0r安全):从字节码解析看VMP防护