2013年10月19日
自分自身を バージョン偽装する 変な Windows 8.1
Windows 8.1を導入したけどバージョンチェック(GetVersionEx)がうまくいかなくて…
という記事を見かけて追試をしてみた・ω・
ソースはこんな感じ

実行結果
GetVersion → 6.02 Build 9200
GetVersionEx → 6.2
RtlGetVersion → 6.3
レジストリ SOFTWARE\Microsoft\Windows NT\CurrentVersion の CurrentVersion 文字列 → 6.3
ファイル ntdll.dll のバージョンを参照する → 6.3.9600.16384
偽装してるの、GetVersion系 だけ! というお話でした ・ω・
どうやら、マニフェストファイル(〜.exe.manifest)に、Windows 8.1に対応することの宣言をしないと、GetVersionEx() API が古いバージョン番号を返すような仕様に変わってしまった |
という記事を見かけて追試をしてみた・ω・
ax=GetVersion(); printf("GetVersion:[%x]\n",ax); os.dwOSVersionInfoSize=sizeof(OSVERSIONINFOA); ax=GetVersionExA(&os); memset(&os,0,sizeof(os)); printf("GetVersionEx:[%d.%d]\n",os.dwMajorVersion,os.dwMinorVersion); memset(&os,0,sizeof(os)); os.dwOSVersionInfoSize=sizeof(OSVERSIONINFOA); hDll=GetModuleHandle("ntdll.dll"); xfs=GetProcAddress(hDll,"RtlGetVersion"); _asm{ lea eax,os push eax call xfs } printf("RtlGetVersion:[%d.%d]\n",os.dwMajorVersion,os.dwMinorVersion); if(RegOpenKeyExA(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion",0,KEY_READ,&hKey)==ERROR_SUCCESS){ sz=sizeof(path); RegQueryValueExA(hKey,"CurrentVersion",0,0,(LPBYTE)str,(DWORD*)&sz); RegCloseKey(hKey); printf("Reg: %s\n",str); } ExpandEnvironmentStringsW(L"%systemroot%\\system32\\ntdll.dll",path,sizeof(path)); FileInfos(path,7,str); // ファイルからバージョン所得 printf("%s\n",str); |

実行結果
GetVersion → 6.02 Build 9200
GetVersionEx → 6.2
RtlGetVersion → 6.3
レジストリ SOFTWARE\Microsoft\Windows NT\CurrentVersion の CurrentVersion 文字列 → 6.3
ファイル ntdll.dll のバージョンを参照する → 6.3.9600.16384
偽装してるの、GetVersion系 だけ! というお話でした ・ω・