vmp虚拟机测信道分析学习笔记;
在虚拟机入口或出口处,代码的界面状态是真实的,会暴露函数调用接口,及返回值。
1.获得虚拟机进入函数(界面);
- 虚拟机在调用一些系统函数或未加密的函数时会退出虚拟机,直到函数返回后,再重新进入虚拟机。
- 在被加密的函数代码内会出现push call,push jump等跨节跳转指令进入到vmp节。
-(获得虚拟机退出时界面)在调用未加密函数返回进入到虚拟机时,ebp在当前代码中始终不变,所以当ebp再次恢复时监测ret,call等跳转指令可能就是虚拟机退出代码;
所以找到虚拟机入口特征后,再模拟执行或追踪,去遍历所有要分析代码块的虚拟机入口。
2.局部变量在栈中的位置不变;
进入虚拟机后直到函数执行结束退出虚拟机。栈中相应位置的变量的变化顺序与原始程序相同,
可以根据传入值,与变量变化顺序猜测函数功能,
有时虚拟机在call另一个虚拟化过的函数2时会不退出虚拟机直接调用,这时可以在函数2的退出时,再进入虚拟机前获得真实栈信息,通过设置条件断点,可以获得虚拟机内的函数2的“起始地址“,再进行局部变量的监测。
3.eflag黑箱测试
//jz等价指令
__asm
{
pushfd
pop eax
and eax,0x40; //提取z标志位
shr eax,6
mov ecx,1
sub ecx,eax;
neg eax;
neg ecx;
}
模拟执行——截获所有eflag的获取操作,如pushfd,修改eflag标志位,判断是否影响 真实代码的jcc标志位,
如果指令数量多,增加and 指令,shr指令辅助查找。
*干预标志位后会影响代码执行路径,需要继续监测-干预;
(通过干预标志位可以实现功能的破解。)
4.指令执行数量
- 通过输入,监测指令执行数量,(在密码对比等代码中)如果指令执行数量增加可能就代表密码命中,继续测试可能会分析出密码;
- 判断代码或真正关键跳转的代码相对无用指令可能执行次数极少,通过监测各个指令执行次数,排除无用指令,再测试分析关键跳转。