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

本文详细剖析了一种虚拟机壳的代码变形和优化过程,包括指令的等价替换、Handle块的优化、虚拟机上下文填充等。通过分析壳模板的处理,如将`jmp`指令转换为`push+retn`,`lodsbyteptrds:[esi]`的处理,以及随机数在指令变形中的应用,揭示了壳如何增强其混淆性和抗逆向工程能力。同时,文章还介绍了如何找到并处理填充虚拟机上下文的Handle块。

参考资料:

本文大量内容抄袭看雪作者:waiWH的VMP系列

1、名称:谈谈vmp的还原(2)

网址:[原创]谈谈vmp的还原(1)-软件逆向-看雪论坛-安全社区|安全招聘|bbs.pediy.com

2、名称:汇编指令之OpCode快速入门

网址:[原创]汇编指令之OpCode快速入门-软件逆向-看雪论坛-安全社区|安全招聘|bbs.pediy.com

3、名称:X86指令编码内幕 --- 指令 Opcode 码

网址:X86指令编码内幕 --- 指令 Opcode 码_晓风残月的技术天地-优快云博客

说明:

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

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

 2、1 保存用户代码结构体

它们0x8跟0x10都是指向相同的结构体

 2、2 保存壳自身模板结构体

它们0x8跟0x10都是指向相同的结构体

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

1.10

 1.21

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

 加密后(1.21自带加密):

主要干了什么?

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

总结:

1、循环遍历作者设计的Handle块找到符合条件的例如:

规律if(v227 & 0xFFFFFF00) == 0xFACE0000

执行前 转换 执行后
push 0xFACE0002 -------> Push 重定位值
mov edi,0xFACE0003 -------> Mov edi,VMContext

2、所使用的结构体如下:

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

 首先我们得到的信息有:

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‬)

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

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

4、总结:

1、v184保存结果的什么时候使用、区别这个有什么意义?1跟0有什么区别?

答:

1表示使用

0表示未使用(后期优化掉)

&nbs

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值