首页
社区
课程
招聘
[求助]简单的虚拟机伪代码解析--问题
发表于: 2007-9-18 11:21 5950

[求助]简单的虚拟机伪代码解析--问题

2007-9-18 11:21
5950
看了Bughoho  的简单的虚拟机伪代码解析 有个问题:

void VMExecuteMachine( DWORD VM_code )
  {
          //初始化标志
          vmmachine.AF = 0;
          vmmachine.ZF = 0;
          vmmachine.SF = 0;
          vmmachine.OF = 0;
          vmmachine.DF = 0;
          //初始化寄存器
          vmmachine.eax = 0;
          vmmachine.ecx = 0;
          vmmachine.edx = 0;
          vmmachine.ebx = 0;
          vmmachine.esp = vmmachine.lpVMStack;
          vmmachine.esi = 0;
          vmmachine.edi = 0;
          vmmachine.eip = VM_code;
          vmmachine.p_code = 0;
          memset( vmmachine.lpVMStack,0,sizeof(vmmachine.lpVMStack) );//初始化堆栈
  
          while(TRUE)
          {
                  vmmachine.p_code = *(BYTE*)vmmachine.eip;//取出伪代码
                  DWORD func = VMJumpCode[vmmachine.p_code];//执行当前语句
                  if( func == (DWORD)VReturn )//不用说了,我知道这里写得很烂
                          return;
                  _asm
                  {
                          call func
                  }
          }
          return;
  }

//push 2000; 02 00 20 00 00
  void VPUSHImm()//PUSH操作数
  {
          vmmachine.eip++;
          DWORD imm32 = *(DWORD*)vmmachine.eip;
         
          Addcode(4);//跳过这个操作数
         
          vmmachine.esp++;
          *vmmachine.esp = imm32;
  }

问题:如果执行VMExecuteMachine( DWORD VM_code ),假如执行的是
VPUSHImm()函数,但是该函数的操作都是针对VMmachine自定义的结构中数据,
那么是怎么执行真正的CPU的指令的呢?就是说这个虚拟的CPU VMmachine结构和真正
的CPU是在那里挂钩的?

第一次看VM的东西,很多不懂,向大牛们请教~~

[注意]APP应用上架合规检测服务,协助应用顺利上架!

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 1946
活跃值: (263)
能力值: (RANK:330 )
在线值:
发帖
回帖
粉丝
3
这只是一个模型,真正进入的时候要把真实寄存器相关数据放到虚拟环境中再执行,退出后再还给真实寄存器。
2007-9-18 12:10
0
雪    币: 210
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
如果开始执行vm,相关的VM寄存器环境已经设置完成了,具体在虚拟环境中是怎么执行的呢?
还是我上面的问题,虚拟环境中是怎么和真正的环境挂钩的。谢谢了~
2007-9-18 12:24
0
雪    币: 226
活跃值: (15)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
5
mov [V_EAX],eax
...
2007-9-18 12:31
0
雪    币: 210
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
oH....
2007-9-18 17:13
0
雪    币: 1746
活跃值: (287)
能力值: (RANK:450 )
在线值:
发帖
回帖
粉丝
7
这个要看你的虚拟CPU怎么设计的了,你虚拟了什么东西,虚拟了多少这些东西,真实CPU在执行指令的时候,不外乎就是把具体指令的行为表现在内存和寄存器上,虚拟CPU也必须完成这种功能,效果要跟在真实CPU上一致

具体怎么衔接,比较难说,看个人爱好了,在进入虚拟CPU的时候,把真实CPU上的一些信息状态传给虚拟CPU,让它能正确解析被虚拟的指令,虚拟CPU退出的时候,把虚拟CPU上的一些信息状态,在告诉真实CPU,让它能正确的按程序逻辑运行下去就可以了,这种跟接力赛似的,只要把接力棒传好就可以了......(这里的接力棒就是 要逻辑等同,在内存和寄存器上的表现一致)

Bughoho的那篇文章,虚拟CPU的环境跟真实x86的环境差不多,这种衔接应该是很自然很简单的了,如果虚拟的CPU的环境跟真实x86的环境相差**,这种衔接看起来会更不"好"
2007-9-18 17:32
0
雪    币: 210
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
谢谢你,了解了大概的意思,想去实践一下代码。
2007-9-18 17:41
0
游客
登录 | 注册 方可回帖
返回
//