VMP学习笔记之Handle块优化与壳模板初始化(四)

爱必应

参考资料:
本文大量内容抄袭看雪作者:waiWH的VMP系列
1、名称:谈谈vmp的还原(2)                       
网址:https://bbs.pediy.com/thread-225278.htm
2、名称:汇编指令之OpCode快速入门        
网址:https://bbs.pediy.com/thread-113402.htm
3、名称:X86指令编码内幕 — 指令 Opcode 码
网址:https://blog.csdn.net/xfcyhuang/article/details/6230542

说明:
1、流程 == 加密函数个数(一般demo版本只允许加密一个流程)

VMP学习笔记之Handle块优化与壳模板初始化(四)-图1

2、用户代码跟壳自身代码(模板)都会用Vmp_AllDisassembly函数解析

VMP学习笔记之Handle块优化与壳模板初始化(四)-图2

2、1 保存用户代码结构体
它们0x8跟0x10都是指向相同的结构体

VMP学习笔记之Handle块优化与壳模板初始化(四)-图3

2、2 保存壳自身模板结构体
它们0x8跟0x10都是指向相同的结构体

VMP学习笔记之Handle块优化与壳模板初始化(四)-图4

3、我比较了下1.10跟1.21,发现1.21自带Encoding of a p-code保护
1.10

VMP学习笔记之Handle块优化与壳模板初始化(四)-图5

1.21

VMP学习笔记之Handle块优化与壳模板初始化(四)-图6

未加密前的一般长这样子(1.10未启用加密的):

VMP学习笔记之Handle块优化与壳模板初始化(四)-图7

加密后(1.21自带加密):

VMP学习笔记之Handle块优化与壳模板初始化(四)-图8

主要干了什么?
1、初始化壳模板:指令变形、等价替换
例如:
jmp = push + retn  或则  lea + jmp
lods byte ptr ds:[esi] = mov al,[esi] + inc esi 或则 mov al,[esi] + add esi,1
等等
2、优化Handle块代码,将不使用的直接删除
ESIResults[X] == 0表示不使用,这种就会优化
ESIResults[X] == 1表示使用
3、找出填充虚拟机上下文的两个Handle块

正文:
1、找出壳模板push 0xFACE0002与mov edi,0xFACE0003

VMP学习笔记之Handle块优化与壳模板初始化(四)-图9

VMP学习笔记之Handle块优化与壳模板初始化(四)-图10

总结:
1、循环遍历作者设计的Handle块找到符合条件的例如:
规律if(v227 & 0xFFFFFF00) == 0xFACE0000
执行前转换执行后push 0xFACE0002——->Push 重定位值mov edi,0xFACE0003——->Mov edi,VMContext
2、所使用的结构体如下:

VMP学习笔记之Handle块优化与壳模板初始化(四)-图11

2、根据pNtHeader_OptionalHeader.Magic筛选ESI_Matching_Array数组

VMP学习笔记之Handle块优化与壳模板初始化(四)-图12

首先我们得到的信息有:
1、ESI_Matching_Array每一组是8个字节,一共有0Xcc组,也就是总长度是0x660=8*0xCC
目前已知:
ESI_Matching_Array[0]  == 与Magic有关
ESI_Matching_Array[1]  == ??
ESI_Matching_Array[2]  == VMOpcode
ESI_Matching_Array[3]  == VMOpcode
ESI_Matching_Array[4]  == 模式
ESI_Matching_Array[5]  == Size
ESI_Matching_Array[6]  == ??
ESI_Matching_Array[7]  == 未使用,都是0
2、v184数组保存所有结果0或则1
3、第一个判断:v16 = _bittest(v15, Type & 0x7F)成立条件
我们查询汇编指令得知BT是位测试
目前只讨论win32PE结构,Type都是=1
我们发现*(byte*)(ESI_Matching_Array+0)的值只有6(‭0110‬)或则4(‭0100‬)

VMP学习笔记之Handle块优化与壳模板初始化(四)-图13

6=0110     bt 1      第一位的值给CF,就是1,不成立继续执行第二个判断

VMP学习笔记之Handle块优化与壳模板初始化(四)-图14

4=0100     bt 1      第一位的值给CF,就是0,成立v17=0,不继续执行第二个判断

VMP学习笔记之Handle块优化与壳模板初始化(四)-图15

4、总结:
1、v184保存结果的什么时候使用、区别这个有什么意义?1跟0有什么区别?
答:
1表示使用
0表示未使用(后期优化掉)

VMP学习笔记之Handle块优化与壳模板初始化(四)-图16

2、ESI_Matching_Array与VmHandle块对应(我整理了一份,未必全对的只作为参考)

VMP学习笔记之Handle块优化与壳模板初始化(四)-图17

3、判断用户解析Opcode有没有需要特殊处理的指令
这些都是一些不常用的指令,如果存在就在ESIResults[X]=1,表示使用

声明:本站所有资源均由网友分享,如有侵权内容,请在文章下方留言,本站会立即处理。

原文链接:,转发请注明来源!

发表评论