-
-
[旧帖]
[邀请码已发][原创]关于VC下的inline 汇编, 由《非API检测操作系统版本信息》想到的,为邀请码而开新贴
0.00雪花
-
发表于:
2009-7-14 19:37
1836
-
[旧帖] [邀请码已发][原创]关于VC下的inline 汇编, 由《非API检测操作系统版本信息》想到的,为邀请码而开新贴
0.00雪花
在《非API检测操作系统版本信息》中使用了如下inline 汇编
_asm
{
pushad
mov ebx,fs:[0x18] ; get self pointer from TEB
mov eax,fs:[0x30] ; get pointer to PEB / database
mov ebx,[eax+0A8h] ; get OSMinorVersion
mov eax,[eax+0A4h] ; get OSMajorVersion
mov j,ebx
mov i,eax
popad
}
其实如此复杂是没有必要的,上述代码的关键是取得PEB,而且PEB也是经常使用的,取PEB可以定义如下函数:
#pragma warning (push)
#pragma warning (disable:4035) // 关闭报警 4035 (函数没有返回值)
_inline char* GetPEB() { __asm mov eax, fs:[0x30]}
#pragma warning(pop)
上面的取版本则可以重写如下:
char* pPEB=GetPEB();
DWORD dwMajor=*(DWORD*)(pPEB+0xa4);
DWORD dwMinor=*(DWORD*)(pPEB+0xa8);
......
由于是inline函数,汇编代码中不会因GetPEB而产生call,无论从C源代码或是汇编代码都会更清爽些
。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!