这是因为int 3 异常处理程序里面修改了fs段寄存器,把fs保存了就没事了。
#include "stdafx.h"
#include <windows.h>
#include "stdio.h"
int a=0;
void _declspec(naked) test()
{
_asm
{
push 0x30
pop fs
pushad
pushfd
popfd
popad
retf
}
}
int main(int argc, char* argv[])
{
char buffer[6]={0};
*(DWORD*)&buffer[0]=0;
*(WORD*)&buffer[4]=0x4b;
_asm
{
call fword ptr [buffer]
push 0x3b
pop fs;
}
printf("a=%x\n",a);
getchar();
return 0;
}