自分自身を バージョン偽装する 変な Windows 8.1

Windows 8.1を導入したけどバージョンチェック(GetVersionEx)がうまくいかなくて…

どうやら、マニフェストファイル(~.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);

ソースはこんな感じ

81test
実行結果

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系 だけ! というお話でした ・ω・

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です