参考资料:
本文大量内容抄袭看雪作者: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版本只允许加密一个流程)
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、初始化壳模板:指令变形、等价替换
例如:
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表示未使用(后期优化掉)
2、ESI_Matching_Array与VmHandle块对应(我整理了一份,未必全对的只作为参考)
3、判断用户解析Opcode有没有需要特殊处理的指令
这些都是一些不常用的指令,如果存在就在ESIResults[X]=1,表示使用
声明:本站所有资源均由网友分享,如有侵权内容,请在文章下方留言,本站会立即处理。