能力值:
( LV6,RANK:90 )
|
-
-
2 楼
我也是新手,个人的一些理解。 虚拟机内部 虚拟堆栈操作使用的是 ebp寄存器。理由,可以看下虚拟指令push的解释源码:
//解释push
BOOL CInterpretHandler::InterpretPush(VMTable* table,char* asmtext,int len)
{
char scalestr[6] = {0};
int sizeidx = 0;
if( table->bitnum[0] == 8 )
{
sizeidx = 0;
strcpy_s(scalestr,6,"byte");
}
else if( table->bitnum[0] == 16 )
{
sizeidx = 1;
strcpy_s(scalestr,6,"word");
}
else if( table->bitnum[0] == 32 )
{
sizeidx = 2;
strcpy_s(scalestr,6,"dword");
}
sprintf_s(asmtext,len,"%ssub ebp,%d\n",asmtext,table->bitnum[0] / 8);//从堆栈中腾出空间
if( table->optype[0] == MEMTYPE )
{
sprintf_s(asmtext,len,"%smov %s,%s ptr %s[eax]\n",asmtext,vregname[sizeidx][RT_Eax],scalestr,GetSegStr(table->Segment));//得到内存数的值
}
sprintf_s(asmtext,len,"%smov %s ptr [ebp],%s\n",asmtext,scalestr,vregname[sizeidx][RT_Eax]);
return TRUE;
}
还有其他的虚拟指令翻译,都是用的ebp操作的。 17.2 图中画的其实是虚拟环境的esp,真实操作的是ebp。 那么为什么书中的handler使用esp,而不是ebp。我的理解是这些handler是辅助用的,并不绝对需要在虚拟的堆栈中运行,可以在真实的堆栈中运行。 所以它分为 辅助handler和普通handler,辅助handler就是用来操作真实堆栈。
分配的0x200用处
____________
| | 高地址
| |
| vm stack | 解释虚拟指令所需堆栈 大小0x100
| |
| |
|————————————|
| |
| | vm context 大小0x100
| vm context |
|____________| 低地址
| |
| |
| real stack | 虚拟机本身堆栈 大小0x40
|____________|
个人理解,有错误欢迎指正。
|
能力值:
( LV3,RANK:20 )
|
-
-
3 楼
glider菜鸟
我也是新手,个人的一些理解。
虚拟机内部 虚拟堆栈操作使用的是 ebp寄存器。理由,可以看下虚拟指令push的解释源码:
```
//解释push
BOOL CInterpretHandler ...
太感谢你了,大佬,看了你得说明豁然开朗了,小弟跪谢!
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
我看了下也感觉有问题 P475开头的代码 mov edx,edi mov ecx,esp sub ecx,edx 其实就是ecx(待拷贝的字节数) = esp-edi,但esp比edi低啊,且不说别的,这个减法一减,减出来一个超大的数,然后拷贝,确定不会出事?
|
|
|