Статьи по Assembler


Минимальная stub-программа - часть 5


/p>

Вероятно, уменьшить размер stub-программы до величины, меньшей 64 байт, невозможно. А вот интересный вопрос: возможно ли вообще изъять stub-программу из модуля? Не спешите отвечать "нет"! 16-битные компоновщики от Microsoft имели в синтаксисе def-файла конструкцию вида STUB NONE, которая, согласно документации, предназначалась для использования при сборке dll-библиотек. В 32-битных компоновщиках эта возможность пропала. А жаль...

 

Вот уж в самом деле, "никогда не говори "никогда"! 24 июля 2001 года, в день падения 114-летнего рекорда жары в Москве, пришло письмо:

На вашем сайте assembler.ru в статье "Минимальная stub-программа" автором упомянуто, что создать stub короче 40h байт, вероятнее всего, невозможно.

Привожу пример stub'а длиной в 20h байт:

00000000 4D 5A 00 00 01 00 00 00 01 00 00 00 FF FF 00 00 MZ..............

00000010 B4 4C CD 21 00 00 00 00 40 00 00 00 00 00 00 00 .L.!....@.......

В отличие от примера, приведенного в статье, размер заголовка уменьшен до одного параграфа. В терминах статьи это означает, что stub-код располагается по смещению 10h от начала файла.

Очевидно, после такого "сокращения" области заголовка от 10h и выше продолжают использоваться. Но в данном случае это неважно, так как на месте 4CB4h находится initial SP, а на месте 21CDh - checksum. Ни то, ни другое роли не играют. К сожалению, stub-код ограничен в 4 байта, потому что уже следующий word - initial IP.

Далее, в файле со stub'ом в 20h байт смещение 3Ch от начала файла приходится на смещение 1Ch PE-заголовка. Здесь расположен dword, который, по-видимому, ни на что не влияет, так что можно спокойно ставить туда 00000020h:

00000020 50 45 00 00 4C 01 07 00 21 B1 97 36 00 00 00 00 PE..L...!..6....

00000030 00 00 00 00 E0 00 0E 01 0B 01 04 14 20 00 00 00 ............ ...

Такую штуку вряд ли поддерживают компоновщики (мне от них этого добиться не удалось), я лично правил EXE вручную. Зато работает.

Напоследок - пример тоже рабочего stub'а длиной в 18h байт - меньше, по-моему, некуда:

00000000 4D 5A 00 00 01 00 00 00 00 00 00 00 B0 21 CD 29 MZ...........!.)

00000010 B4 4C CD 21 0C 00 00 00 50 45 00 00 4C 01 07 00 .L.!....PE..L...

00000020 21 B1 97 36 00 00 00 00 00 00 00 00 E0 00 0E 01 !..6............

00000030 0B 01 04 14 20 00 00 00 00 2E 00 00 18 00 00 00 .... ...........

Из-под DOS он выводит восклицательный знак (21h).

Ну как, размер достоин настоящего ассемблерщика?

автор - Grief (soul_inspector@chat.ru)

<


- Начало -  - Назад -  - Вперед -