本人接触VMP也有很长时间了,各位大佬的东西也研究的不少,比如xxvm、小曾、hanbingle、我是小三、krash、金罡等等,我就不一一列举了。其中论详细程度的话莫过于金罡大佬的https://bbs.kanxue.com/thread-282300.htm,本文有一些注释、命名借鉴于金罡大佬的这篇文章。
最近闲着无聊在家准备探一探大厂的APP中VMP的防护强度,于是下载了一个最新版本的。事先声明,本文目的在于学习研究,不要用于非法用途,否则后果自负。
本人文笔不太好,再加上分析过程中可能会有些错误,希望大佬批评指正。
1、首先在VMP解释器入口分析出vm_info,即vm_reg_PC(虚拟指令指针)、VM_REG(虚拟寄存器)等关键信息是通过哪些真实寄存器去保存:
vm_info:
X27--pVMMemoryEnd
X6--pVMMemoryEnd-0x140 P_vm_reg_PC(Pcontext-8)
pVMMemoryEnd-0x138--VM_REG
[SP,#0x38]--P_vm_reg_PC
X0--vm_reg_PC
2、根据vm_reg_PC分析出虚拟操作码、虚拟操作数:


并对其进行解析——
虚拟操作码:
W15--Opcode[5-0:6]
虚拟操作数:
[SP,#0x34]--Opcode>>0x1B Opcode[31-27:5]
[SP,#0x40]--Opcode>>0x1C Opcode[31-28:4]
[SP,#0x44]--Opcode>>0x19 Opcode[31-25:7]
[SP,#0x48]--Opcode>>0xF Opcode[31-15:17]
[SP,#0x4C]--Opcode>>0x16 Opcode[31-22:10]
[SP,#0x50]--Opcode>>0x8 Opcode[31-8:24]
[SP,#0x54]--Opcode>>0x1A Opcode[31-26:6]
[SP,#0x58]--Opcode>>0xB Opcode[31-11:21]
[SP,#0x5C]--Opcode>>0x11 Opcode[31-17:15]
[SP,#0x60]--Opcode>>0x15 Opcode[31-21:11]
[SP,#0x64]--Opcode>>0x18 Opcode[31-24:8]
[SP,#0x68]--Opcode>>0x14 Opcode[31-20:12]
[SP,#0x6C]--Opcode>>0xE Opcode[31-14:18]
[SP,#0x70]--Opcode>>0x10 Opcode[31-16:16]
[SP,#0x74]--Opcode>>0x12 Opcode[31-18:14]
[SP,#0x78]--Opcode>>0x9 Opcode[31-9:23]
[SP,#0x7C]--Opcode>>0xD Opcode[31-13:19]
W3--Opcode>>0x1E Opcode[31-30:2]
W7--Opcode>>0x1D Opcode[31-29:3]
W13--Opcode>>0xC Opcode[31-12:20]
W19--Opcode>>0x2 Opcode[31-2:30]
W20--Opcode>>0x3 Opcode[31-3:29]
W21--Opcode>>0x4 Opcode[31-4:28]
W22--Opcode>>0x17 Opcode[31-23:9]
W23--Opcode>>0x1 Opcode[31-1:30]
W24--Opcode>>0x6 Opcode[31-6:26]
W25--Opcode>>0x5 Opcode[31-5:27]
W26--Opcode>>0xA Opcode[31-10:22]
W28--Opcode>>0x7 Opcode[31-7:25]
W30--Opcode>>0x13 Opcode[31-19:13]
W0--Opcode<<0x7
W1--Opcode<<0x3
W4--Opcode<<0x9
W9--Opcode<<0x2
W10--Opcode<<0x1
W11--Opcode<<0x6
W14--Opcode<<0x4
W16--Opcode<<0x5
W17--Opcode<<0x8
3、根据虚拟操作码,找到对应的vm_Handler;在此版本中对vm_Handler进行了地址混淆,并抛弃之前版本的跳转表结构(容易被发现),改用二叉树结构。
多次进行二叉树形式的递归判断:
多次用到地址混淆:
通过对上述二叉树结构的分析,直到分析到每个根节点,梳理出每个vm_Handler对应的地址(部分地址):
W15==0x0--0x4F37C
W15==0x1--0x
W15==0x2--0x506D0
W15==0x3--0x
W15==0x4--0x4FDD8
W15==0x5--0x50EE8
W15==0x6--0x51C74
W15==0x7--0x
W15==0x8--0x4F968
W15==0x9--0x50ADC
W15==0xA--0x51800
W15==0xB--0x502AC
W15==0xC--0x
W15==0xD--0x51260
W15==0xE--0x51F48
W15==0xF--0x4F720
W15==0x10--0x508D0
W15==0x11--0x4FFEC
W15==0x12--0x
W15==0x13--0x
W15==0x14-0x52460
W15==0x15-0x510DC
W15==0x16--0x
W15==0x17--0x4FBE4
W15==0x18--0x50C9C
W15==0x19--0x51A38
W15==0x1A--0x50454
W15==0x1B--0x
W15==0x1C--0x
W15==0x1D--0x514D8
W15==0x1E--0x5210C
W15==0x1F--0x4F570
W15==0x20--0x507DC
W15==0x21--0x
W15==0x22--0x50FDC
W15==0x23--0x51D64
W15==0x24--0x4FABC
W15==0x25--0x
W15==0x26--0x
W15==0x27--0x50BB8
W15==0x28--0x
W15==0x29--0x
W15==0x2A--0x
W15==0x2B--0x5191C
W15==0x2C--0x50348
W15==0x2D--0x51394
W15==0x2E--0x5200C
W15==0x2F--0x4F858
W15==0x30--0x52368
W15==0x31--0x509D4
W15==0x32--0x
W15==0x33-0x5012C
W15==0x34--0x
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课