-
-
[原创]vmp 过代码校验
-
发表于:
2019-12-17 22:13
8837
-
简化后的代码
这个handler需要两个参数,分别是代码校验的地址和大小,通过xor 指令生成校验码,最后将堆栈的两个参数弹出,将校验码压栈,执行下一个handler
以通过OD的条件断点,在校验handler下断,分别打印出 vmcode(ESI) - 1 、传入的两个参数进行分析
日志冗长,就不贴了,经分析后一共有4处调用了校验handler,校验的部分分别是文件校验,代码校验,内存校验,随机校验
这4处校验handler调用之后的校验码比对部分有一个共同点,就是它们都是对ZF标志位进行判断
还有一个点就是hash比较后的结果会存储在一个寄存器中的BL位,也就是低字节,由堆栈弹出1字节并赋值,这里说的寄存器指的是vm context中的数据,虽然没有在每个hash handler中验证,但我猜测是一致的
在前3次处理中,会在vm context中保存循环的次数:
上图中的堆栈33F608的位置保存了循环次数为4次
这个值的位置是不固定的,需要自己手动分析
通过这个循环次数,和ZF的标志位判断就可以跳过校验部分了
校验码计算是使用刚刚计算的校验码与原校验码相减,然后判断ZF标志位
运算过程如下:
化简后是这样的:
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2019-12-17 22:15
被Hasic编辑
,原因: