Каковы методы определения запуска ОС на языке ассемблера во время выполнения? - PullRequest
1 голос
/ 20 октября 2011

Каковы методы определения запуска ОС на языке ассемблера во время выполнения?

Если есть прямые способы определить это, это было бы замечательно.

Я также думал о том, как в Javascript есть хитрости, чтобы определить, в каком браузере вы работаете ... Существуют ли похожие методы определения ОС или даже дуги процессора на низкоуровневом языке, таком как сборка Intel?

Спасибо, Chenz

Ответы [ 3 ]

3 голосов
/ 20 октября 2011

Архитектура процессора будет практически невозможно определить. Машинный код сильно отличается в разных архитектурах ЦП, поэтому очень сложно написать код обнаружения, который не будет просто приводить к сбою на всех архитектурах, кроме одной. В самом деле, вы можете считать, что ассемблер (и машинный код) - это совершенно другой язык на разных архитектурах ЦП - все, что может обнаружить, что должно в основном быть полиглотом машинного кода .

Тем не менее, если вы знаете, что у вас какой-то вариант x86, вы можете использовать инструкцию CPUID для получения информации о возможностях процессора. Вы также можете прочитать управляющие регистры, чтобы выяснить, находитесь ли вы в 64-битном режиме.

Что касается определения ОС, это тоже довольно сложно. Разные ОС имеют разные точки входа в системный вызов, и попытка использовать неверную точку входа в ОС приведет к сбою (в действительности, Windows даже меняет адрес точек входа системного вызова от одной загрузки к другой). Вы могли бы быть в состоянии обнаружить Windows TIB , но любая попытка доступа к FS:[0x0] может привести к краху в других ОС.

Вообще говоря, когда вы пишете ассемблер, вы должны знать, какая у вас система. Если вам нужна мобильность, пишите на C или другом языке высокого уровня.

1 голос
/ 20 октября 2011

Нет, нет машинного кода, который позволил бы вам сделать это. Вы могли бы дать своему вирусу несколько разных шелл-кодов для разных архитектур, выбирая по одному случайному при каждом распространении. Если он работает успешно, он заражает машину, но если это мусор, ваш процесс, вероятно, погибает за выдачу недопустимой инструкции, и пользователь проживает еще один день со здоровой машиной.

0 голосов
/ 20 октября 2011

Как правило, вы не можете надежно определить ОС в C (++) или программе на языке ассемблера.

Вы можете различать разные «совместимые» версии одной и той же ОС, используя некоторые из ее функций, которые доступны в таких разных версиях ОС, как GetSystemInfo() / GetNativeSystemInfo() в Windows, но недоступны в DOS, Linux и другие ОС.

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

Вывод ОС из содержимого регистров ЦП общего назначения также ненадежен, поскольку их значения не гарантируют, что они каким-то образом отражают ОС, и даже если в некоторых случаях это случится, это может измениться в будущем, в том числе в ближайшем будущем. при обновлении ОС (например, установка исправлений безопасности).

Возможно, вы сможете выполнить команду оболочки, такую ​​как ver для Windows и uname -a для Linux, используя функцию C system(), но нет переносимого способа извлечь выходные данные из этой команды в окне консоли и скопировать это обратно в программу для анализа.

...