Ассемблирование без секретов

             

Определение целевой платформы


Проще всего определить разрядность— если в листинге преобладают 16-разрядные регистры типа AX/BX/CX, то скорее всего она предназначается для MS-DOS. Если встречаются прямые вызовы прерываний INT 21h, INT 13h, INT 16h, INT 10h — это точно MS-DOS от попыток трансляции программы под NT лучше сразу воздержаться. Тоже самое относится и портам ввода/вывода (инструкции IN/OUT). И хотя NT позволяет открывать к ним доступ и с прикладного уровня, это не выход и такую программу проще взять переписать.

32-режим характеризуется регистрами EAX/EBX/ECX. Это может быть как программа для Windows, так и для DOS/DPMI. Windows распознается по своим API-функциям, DOS/DPMI – по прерыванию INT 31h. Прерывание INT 2Fh – свидетельствует о принадлежности к 9x, INT 2Fh/SYSENETR — NT/XP. Через эти прерывания осуществляется доступ к низкоуровневому API операционной системы, что делает такие программы непереносимыми. Привилегированные инструкции защищенного режима или вызовы функций, экспортируемых ядром (например, IoGetCurrentIrpStackLocation) указывают на драйвер (или его фрагмент), совершенно не приспособленный к работе на прикладном режиме. Если листинг не вызывает никаких API-функций, не дергает прерываниями, не содержит привилегированных инструкций и не обращается к памяти по абсолютным адресам (типа mov eax,fs:[20h]), то он может работать в любой 32-разрядной операционной системе.

64-режим x86-64 распознается по регистрам RAX/RDX/RCX и с 32-разрядными трансляторами, естественно, не совместим.

UNIX распознается своим характерным AT&T синтаксисом. Программы, опирающиеся на библиотеку libc (а таких — большинство) легко переносятся в Windows, поскольку libc – это стандартная Си-библиотека, однако, некоторые UNIX-функции в ее Windows-версии не реализованы. В частности, отсутствует вызов fork, расщепляющий процесс на два и в комбинации fork/exec делающий тоже самое, что и CreateProcess. То есть, в ряде случаев перенос все-таки возможен! Особенно это относится к математическим функциями, абстрагированным от системного мира. Программы, работающие в обход libc через интерфейс INT 80h/call 0007h:00000000h (ими обычно являются вирусы и черви) практически непереносимы.

Определить транслятор несколько сложнее. Признаком TASM'а являются директивы "jumps", "locals" в начале файла. FASM обычно определяется по директиве "format", например, "format PE GUI 4.0", (что, впрочем, не совсем надежно) и хроническому отсутствую ключевого слова offset. На долю MASM'а приходится все остальное.



Содержание раздела