2013-08-08 1 views
-1
int _tmain(int argc, _TCHAR* argv[]) 
{ 
    UINT *ptr = (UINT*) ((((UINT)&ptr) & 0x00FF0000) | 0xfe0c); 
    if (*ptr) printf("higher than XP\n"); // It's really amazing!!!! 
    else printf("XP\n"); 
    return 0; 
} 

Я нашел этот трюк в следующей статье:как этот код работает для обнаружения ОС XP?

http://spareclockcycles.org/2012/02/14/stack-necromancy-defeating-debuggers-by-raising-the-dead/

Но я не могу понять, какие общие знания и конвенцию за трюком. Спасибо за любые комментарии.

+0

Это официально неопределенное поведение, поэтому даже когда оно действительно работает, на самом деле этого не происходит. Если версия ОС - это то, что вам нужно, есть более безопасные и менее запутанные способы, но это, вероятно, не относится к делу. – chris

+6

Статья, которую вы связали, объясняет это очень подробно. Вы читали? –

+0

@DavidHeffernan, вы правы, спасибо. –

ответ

1

Я не понимаю фона, но он устанавливает указатель на адрес, вычисленный из указателя стека (на 0xFE0C). Затем считывает значение по этому адресу, и оно либо равно нулю (XP), либо не равно нулю (а не XP).

Я очень сомневаюсь, что это НАДЕЖНЫЙ способ определить это. Правильный способ определения версии Windows - использовать [GetVersion][1]

+1

+1 Да - не используйте его. Что делать, если он перестает корректно работать в W9? –

+0

Не используйте '' GetVersion''. Используйте '' VerifyVersionInfo''. См. [This] (http://stackoverflow.com/questions/22303824/warning-c4996-getversionexw-was-declared-deprecated) поток переполнения стека. –

Смежные вопросы