安卓逆向学习笔记之ADVMP源码分析与VMP壳简单上手(下).docx
###安卓逆向学习笔记之ADVMP源码分析与VMP壳简单上手(下) ####一、概述本文档将深入探讨安卓逆向工程中的一个具体案例——ADVMP源码分析与VMP壳的基本操作。ADVMP(Virtual Machine Protection)是一种常见的虚拟机保护技术,用于对Android应用进行加固,防止逆向分析。本文旨在通过对ADVMP源码的分析以及VMP壳的实际操作,帮助读者理解ADVMP的工作原理及其逆向方法。 ####二、ADVMP源码分析##### 1. VMPCodeItem源码分析在ADVMP源码中,`vmpCodeitem`是一个核心结构体,它包含了经过加固处理的代码项。在逆向过程中,我们重点关注的是如何从加固后的代码恢复原始的指令集。 - **指令长度问题**: -在`vmpCodeitem`源码中,复制过来的JNI函数指令有4个字节。 -当分析结束时,需要根据指令长度对指针进行偏移,这里需要加4。 -这种做法有助于确保能够正确地遍历整个代码段。 - **前16字节处理**: -通常情况下,加固程序不会修改`vmpCodeitem`中的前16字节,这部分保留了原生指令的关键信息。 -但是,某些加固方案可能会对这16字节内的某些指令进行修改,特别是第4个字节(debuggofsize)。 -如果这16字节被修改,则会导致后续指令的解析出现问题。 - **映射关系问题**: -加固程序通常会改变原有的操作码(opcode),并建立一个新的映射表来记录这些变化。 -逆向过程中,如果没有正确的映射关系,将无法准确解析出变化后的操作码。 -例如,当操作码由6个字节变为4个字节时,如果映射关系正确,即使变化了也能正确解析。 - **动态映射表**: -在某些情况下,映射表不是静态存在的,而是由APP在运行时动态生成。 -这种动态映射增加了逆向的难度,因为它要求逆向者不仅要知道映射表的存在,还要能捕捉到其生成过程。 ##### 2. VMP壳基本操作- **获取codeitem**: -为了对抗VMP,首先需要定位到被保护的`codeitem`。 -通常可以通过反汇编或动态调试的方式找到`codeitem`的位置。 - **映射关系的获取**: -获取映射关系是逆向VMP的关键步骤之一。 -逆向者需要通过各种手段,如静态分析、动态调试等,来获取加固程序建立的操作码映射表。 - **还原opcode**: -根据获取到的映射关系,逆向者可以逐步还原变化后的操作码。 -这一步骤对于理解和修改加固后的代码至关重要。 ####三、实例分析以操作码6F为例: - **操作码**: 6F - **寄存器**: 20 - **操作数**: method index 0D62假设操作码6F原本代表某种特定的指令,但在加固后变成了其他形式。逆向者需要通过映射关系确定6F对应的原始指令是什么,同时还需要了解该指令所使用的寄存器以及指向的方法索引。 ####四、总结ADVMP作为一种虚拟机保护技术,其逆向过程涉及到对加固代码的深入分析以及映射关系的获取。通过对`vmpCodeitem`源码的理解和实际操作,我们可以逐步揭开加固代码背后的秘密,从而实现对加固程序的有效逆向。逆向工程师需要具备扎实的基础知识,同时也要不断学习新的加固技术和逆向技巧,才能在这一领域取得突破。
3.68MB
文件大小:
评论区