VirtualPC单步标志问题
kongfoo/2005.2.24

同样是虚拟机系统,VirtualPC比VmWare好用很多,VmWare里面的win98慢得出奇,
按下开始按钮画了十几次才画出开始菜单,VPC里面就完全不同,几下就出来了。
相信一般情况下装VPC的比VmWare的人多些。下面转入正题。

XP、2k下面,设置T位将使执行之后的指令引发单步中断,代码如下:
  pushfd
  or [esp],100h
  popfd
  nop //这里就引发中断
但在VPC里面的win2k和win98,popfd执行后并没有把T位置1。
换言之,可以写一段代码来检测是否在VPC中。
mov OldESP,esp
push @NotInVPC
push fs:[0]
mov fs:[0],esp
pushfd
or [esp],100h
popfd
nop
jmp @InVPC
@NotInVPC:
mov esp,OldESP
pop fs:[0]
add esp,4
mov UnderVPC,0
jmp @Exit
@InVPC:
pop fs:[0]
add esp,4
mov UnderVPC,1
@Exit:

VPC的这个特点,有好也有不好,对于调试人员来说,这种利用设置T位产生
单步中断的代码不再起作用,使调试工作相对简单了一点,但同时也会失去
程序的流程。对于编程人员来说,在VPC里面就不能用直接设置T位的办法产
生单步中断了。如果真要设置,其中一个办法就是利用SEH,让操作系统来设置:
PUSH @Seh
PUSH DWORD PTR FS:[0]
MOV DWORD PTR FS:[0],ESP
INT3
@Seh:
MOV EAX,DWORD PTR SS:[ESP+C]
MOV DWORD PTR DS:[EAX+B8],@NewEIP
OR DWORD PTR DS:[EAX+C0],100
XOR EAX,EAX
RETN
@NewEIP:
POP DWORD PTR FS:[0]  //单步中断
ADD ESP,4

操作系统:winXP/win2k,VPC版本:2004
VPC操作系统:win2K/win98