Windows API вызывает из сборки при минимальном размере программы - PullRequest
1 голос
/ 03 июня 2009

Я пытаюсь написать программу на ассемблере и сделать результирующий исполняемый файл как как можно меньшим . Часть того, что я делаю, требует вызовов Windows API для таких функций, как WriteProcessMemory. Я имел некоторый успех с вызовом этих функций, но после компиляции и компоновки моя программа выходит в диапазоне 14-15 КБ. (Из источника менее 1 КБ) Я надеялся на многое, намного меньше, чем это.

Я очень новичок в подобных вещах низкого уровня, поэтому я не знаю, что нужно сделать, чтобы программа стала меньше. Я понимаю, что сам формат exe занимает совсем немного места. Можно ли что-нибудь сделать, чтобы минимизировать это?

Я должен упомянуть, что я использую NASM и GCC, но я могу легко изменить, если это поможет.

Ответы [ 5 ]

3 голосов
/ 03 июня 2009

См. Tiny PE , где вы найдете несколько советов и приемов, которые можно использовать для уменьшения окончательного размера исполняемого файла. Имейте в виду, что некоторые из более поздних методов в этой статье чрезвычайно хрупки.

2 голосов
/ 03 июня 2009

По умолчанию выравнивание разделов для большинства файлов PE составляет 4 КБ, чтобы выровнять с естественным расположением системной памяти. Если у вас есть разделы .data, .text и .resource - это уже 12 КБ. Большая часть будет 0 и пустая трата места.

Есть несколько вещей, которые вы можете сделать, чтобы минимизировать эти потери. Во-первых, уменьшите выравнивание раздела до 512 байт (не знаю параметров, необходимых для nasm / gcc). Во-вторых, объедините разделы, чтобы у вас был только один раздел .text. Это может быть проблемой для современных машин с включенным битом NX. Эта функция безопасности предотвращает изменение исполняемых разделов кода от таких вещей, как вирусы.

Существует также множество инструментов сжатия PE, которые сжимают ваш PE и распаковывают его при выполнении.

0 голосов
/ 08 июня 2009

Дайте мне небольшую программу на C (не на C ++), и я покажу вам, как сделать с ней 1-ку .exe. Наименьший размер исполняемого файла, который я рекомендую, составляет 1 КБ, потому что он не сможет работать в некоторых Windows, если он не меньше этого размера.

Вам просто нужно поиграть с переключателями компоновщика, чтобы это произошло! Хороший линкер для этого - polink.

И если вы делаете все в сборке, это еще проще. Просто зайдите на форум MASM32, и вы увидите множество подобных программ.

0 голосов
/ 03 июня 2009

FWIW, самые маленькие программы, которые я могу собрать с помощью ML или ML64, имеют порядок 3 КБ. (Это просто говорит привет мир и выход.)

0 голосов
/ 03 июня 2009

Я предлагаю использовать утилиту DumpBin (или GNU objdump), чтобы определить, что занимает больше места. Это могут быть файлы ресурсов, огромные глобальные переменные или что-то в этом роде.

...