VM中eflags值到底是怎么回事
看了wai1216老师的贴子 https://www.chinapyg.com/forum.php?mod=viewthread&tid=118725&highlight=VMP%2B%B1%AC%C6%C6里面有这句话:
~zf = vm_p(not(0x40),eflags) = 0
这里的eflags,应该是原程序里跳转时eflags值吧?
找了个测试程序,未加壳时,填写假码1,原程序这里eflags的值是0x246, 是跳转的,如果修改Z标志位,是不跳转的话,那么eflags值是0x206
被VM后,在0045E8A0 PUSHFD处下ESI == 0x49375B,修改eax为0x40就爆破成功。
-----------------------------------------------------------------------------------------------------------------------
而如果我在这里下条件断点。
在0045E88D NOT EAX 处下条件断点:ESI == 0x49375B,走到0045E89E时,这里
EDX=0x286,EAX=0x40,
而原贴中,老师说。
~zf = vm_p(not(0x40),eflags) = 0
对应于此程序,eflags应该是EDX,即0x286, 但是在未VM时,这里跳转的eflags是0x246,
不明白的就是这里,VM的话也是不可能对原程序的流程和结果改变的吧,也不可能改变原来eflags的值的。
那么eflags的值应该还是0x246的,为什么这里EDX却等于0x286了呢?明显不相同了!!! 请问到底是怎么回事。
求助wai1216老师。@wai1216
测试程序 链接: https://pan.baidu.com/s/1dG019Bj 密码: a9my
~zf = vm_p(not(0x40),eflags) = 0
zf = and(0x40,eflags) = 1
eflags值变化了。不明白怎么回事。 本帖最后由 wai1216 于 2018-10-13 17:46 编辑
我稍微调试了下。用这个demo来加例子并不是很可取(原因在于test al,al处,为什么你可以研究下)。恩,vmp2.x 这个demo的pc(esi)是递减的,其次你找的地方并不对。你可以试试当你输入真码时,pc(esi)都达不了这个判断的地方。所以导致你有这样的疑惑。
你应该去关注这个地方,以及去调试
00453EA4/$ 83F8 7B CMP EAX,0x7B
00453EA7 74 06 JE SHORT VMP原版.00453EAF
00453EA9|. B8 00000000 MOV EAX,0x0
00453EAE|. C3 RETN
00453EAF|> B8 01000000 MOV EAX,0x1
00453EB4\. C3 RETN
----------------------
你可以多看看我的视频,虽然声音不太清晰。
并注意到esi (rva:x00458137) <==> vm_nand( rva:0045E89E)
eax == 0x00000040 && edx == eflags时eflags的数据是否一致以及之后调用
vm_add(rva:0x0045ECAC):0018F2F0F4 F2 18 00 || 29 1E BA C8 || 08 6B BA C8的情况。
这里才是重点,然后修改al。而之后test al,al会根据al再去改变eflags---------------------
btw:可以去了解下cmp(sub等)指令 以及 jcc指令分别对应那些handle组合
wai1216 发表于 2018-10-13 11:35
我稍微调试了下。用这个demo来加例子并不是很可取(原因在于test al,al处,为什么你可以研究下)。恩,vmp2.x ...
挺晦涩挺难懂。看过老师的视频了,之前看了几遍,大概的VM流程算是似懂非懂了。但是不深入,本身VM的东西就好难。
我纠结的是这里:
当输入正确的注册码123时,
在0045E89E AND EAX, EDX下断点,用脚本记录下,看日志,看样子应该是这里
这里edx==286, 那么这个edx对应的原版eflags值都没有,
(1)
00453F1F|. /74 0C JE SHORT VMP原版.00453F2D ------这里
00453F21|. |B8 743F4500 MOV EAX, VMP原版.00453F74 ;Good job!
00453F26|. |E8 458AFDFF CALL VMP原版.0042C970
00453F2B|. |EB 0A JMP SHORT VMP原版.00453F37
00453F2D|> \B8 883F4500 MOV EAX, VMP原版.00453F88 ;Try again!
(2)
00453EA4/$83F8 7B cmp eax,0x7B
00453EA7|.74 06 je short VMP原版.00453EAF ------这里
00453EA9|.B8 00000000 mov eax,0x0
00453EAE|.C3 retn
00453EAF|>B8 01000000 mov eax,0x1
00453EB4\.C3 retn
00453EB5 8D40 00 lea eax,dword ptr ds:
00453EB8 .E8 9BAEFFFF call VMP原版.0044ED58
00453EBD .C3 retn
无论未加壳时,(1)还是(2),输入真码123时,eflags里都没有出现286的情况。
那么这条记录: eax:40edx:286 esi:494223 , eflags = 286是怎么出来的呢,一直纠结于这一点,想不明白。
本帖最后由 wai1216 于 2018-10-14 13:12 编辑
hahacker 发表于 2018-10-14 09:21
挺晦涩挺难懂。看过老师的视频了,之前看了几遍,大概的VM流程算是似懂非懂了。但是不深入,本身VM的东西 ...
已经说了,这个地方不关系到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:40edx:286。修改此处能显示good jobs/try a again。说实话有点偶然性,与对vmp的使用不够成熟以及程序指令有关。
我仔细看了看,其中虽然也会改变
0045F1BD Main JPE VMP原版_.0045DCCB
此处0045DCCB handle循环的次数有关,因为pf标志位进行了更改
但不是重点,重点如下:
你可以在之后的vm_add下断:
0045ECAC 0145 04 ADD DWORD PTR SS:,EAX ; <== vm_add
如果是假码,此时的数据为(eax = 0)
Stack SS:=00453F1D (VMP原版_.00453F1D)
那么对应到程序呢,我们可以看一看rva:00453F1D的数据是多少
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时,更改了的数据(也就是返回主程序的位置) ---> 0x00453F1D + 0x4
然后你可以发现当返回主程序直接变为了eip:0x00453F21
那么这条0x286的nand的含义搞定。
btw:你可能会发现,当真码时,这里得到的也是0x00453F1D,但注意到运行此处,真码的eflags,以及al
本帖最后由 hahacker 于 2018-10-15 08:20 编辑
wai1216 发表于 2018-10-14 13:06
已经说了,这个地方不关系到cmp+jccvm_p(not(0x40),eflags) --> and eax, edx 的 时候
eax, edx的值应该 ...
好像我问的问题越来越跑题了,偏离了中心思想,因为最基本性的问题没有弄明白,所以后面出现了更多的问题。那就是:
~zf = vm_p(not(0x40),eflags) = 0
zf = and(0x40,eflags) = 1
eflags到底是不是原程序中,跳转时的值。
--------------------------------------------------------------------
假设,如果我知道未加壳某程序时,输入假码1,判断条件是cmp xxx, xxx, je xxx,OD走到je xxx时,此时eflags=0x999(只是假设)
那么我VM后,在and eax,edx与非门时,同样的我输入1(输入不同的值,原程序中eflags的值是会变的,所以为了保证一致,我这里也输入1)
如果eax是0x40,那么edx里保存的就是eflags了,那么此时判断跳转时,eflags的值(或是说edx的值)是否还是0x999 ???
hahacker 发表于 2018-10-15 08:14
好像我问的问题越来越跑题了,偏离了中心思想,因为最基本性的问题没有弄明白,所以后面出现了更多的问题 ...
不是跑题,是理解不对,请你仔细分析 以及 看回复
1.vmp中 调用 nand的地方不止只有vm cmp/sub指令。还有其他运算会用到这些handle
2.不应该走到and eax,edx的时候。eax=0x40,edx=not(0x999)
vm_p(not(0x40),eflags)
1.not eax //before not(0x40) after eax = 0x40
2.not edx //before eflags after edx =not(eflags)
3.and eax,edx // 如上
wai1216 发表于 2018-10-15 08:38
不是跑题,是理解不对,请你仔细分析 以及 看回复
1.vmp中 调用 nand的地方不止只有vm cmp/sub指令。还 ...
老师的第二句打错了吧。多打了个“不”字。2.不应该走到and eax,edx的时候。eax=0x40,edx=not(0x999)
需要把“不”去掉吧。
应该走到and eax,edx的时候。eax=0x40,edx=not(0x999)
页:
[1]