本帖最后由 wai1216 于 2018-10-14 13:12 编辑
已经说了,这个地方不关系到cmp+jccvm_p(not(0x40),eflags) --> and eax, edx 的 时候
eax, edx的值应该是什么呢
eax == 0x40, edx == not(eflags) 而不是 edx == 0x286
对应程序中
esi == 0x0045813B时,eip == 0045E89E
假码 not(0x293) == 0xFFFFFD6C 真码 not(0x) == 0xFFFFFDB9判断
------------
再回答你的问题
这条eax:40 edx:286。修改此处能显示good jobs/try a again。说实话有点偶然性,与对vmp的使用不够成熟以及程序指令有关。
我仔细看了看,其中虽然也会改变
[Asm] 纯文本查看 复制代码 0045F1BD Main JPE VMP原版_.0045DCCB
此处0045DCCB handle循环的次数有关,因为pf标志位进行了更改
但不是重点,重点如下:
你可以在之后的vm_add下断:
[Asm] 纯文本查看 复制代码 0045ECAC 0145 04 ADD DWORD PTR SS:[EBP+0x4],EAX ; <== vm_add
如果是假码,此时[ebp+0x4]的数据为(eax = 0)
[Asm] 纯文本查看 复制代码 Stack SS:[0018F2FC]=00453F1D (VMP原版_.00453F1D)
那么对应到程序呢,我们可以看一看rva:00453F1D的数据是多少
[Asm] 纯文本查看 复制代码 00453F1D 84C0 TEST AL,AL
00453F1F 74 0C JE SHORT VMP原版_.00453F2D
00453F21 B8 743F4500 MOV EAX,VMP原版_.00453F74 ; ASCII "Good job!"
00453F26 E8 458AFDFF CALL VMP原版_.0042C970
00453F2B EB 0A JMP SHORT VMP原版_.00453F37
00453F2D B8 883F4500 MOV EAX,VMP原版_.00453F88 ; ASCII "Try again!"
00453F32 E8 398AFDFF CALL VMP原版_.0042C970
而这个地方,恰好就是返回主程序的位置。
我假设你已经知道更改为0x40,其实是关系到eip:0045ECAC时,调用vm_add时,更改了[ebp+0x4]的数据(也就是返回主程序的位置) ---> 0x00453F1D + 0x4
然后你可以发现当返回主程序直接变为了eip:0x00453F21
那么这条0x286的nand的含义搞定。
btw:你可能会发现,当真码时,这里得到的也是0x00453F1D,但注意到运行此处,真码的eflags,以及al
|