C или C ++: как работают загрузчики / упаковщики? - PullRequest
8 голосов
/ 09 июня 2010

Вот пример того, что я имею в виду ...

  • Пользователь запускает программу LOADER.EXE
  • LOADER.EXE загружает другой EXE-файл, но сохраняет все это в памяти, не сохраняя его вdisk
  • Запускает загруженный EXE так же, как если бы он выполнялся с диска, но делает это прямо из памяти

Я видел несколько таких приложений, и я 'Мы никогда не видели пример или объяснение того, как это работает.

Кто-нибудь знает?

Другой пример - зашифрованный EXE-файл, встроенный в другой.Он извлекается и дешифруется в памяти, даже не сохраняясь на диск до его запуска.

Я видел, что он использовался в некоторых приложениях для предотвращения пиратства.

Редактировать: Как примечание, работают ли такие программы, как UPX, следующим образом?Я посмотрел на код, но мне трудно его расшифровать, и я спрашиваю, в основном, из любопытства, он мне не нужен.

Ответы [ 2 ]

4 голосов
/ 09 июня 2010

Множество программ, которые делают это, просто распаковывают в% TEMP% (я знаю, что знаю), но большие парни, по сути, повторно внедряют загрузчик исполняемой ОС, который должен:

  • Mapисполняемый файл в память.Это не так просто, как кажется, поскольку .exe содержит несколько «разделов», которые должны быть загружены с выравниванием страницы (они должны начинаться с адресов, кратных 4 КБ), и у каждого из них есть определенные запросы - только чтение, копирование назапись, инициализация с нулями и т. д.
  • Удовлетворить статический импорт, обновив раздел таблицы импорта, обычно используя LoadLibrary () и GetProcAddress ().
  • В случае DLL (которыйна самом деле почти идентичны, важное отличие состоит в том, что они имеют как экспорт, так и импорт), загрузчик может также перебазировать dll, если адрес памяти, по которому он был скомпилирован для загрузки, уже использовался (что довольно часто встречается).Это обычно невозможно для exe, хотя, потому что они не включают раздел перемещения, который перечисляет места в загруженном коде, которые должны быть обновлены, потому что обычно они являются первыми, которые загружаются в процесс, и, следовательно, не могут быть заблокированычем-тоЭто означает, что у загрузчика должен быть необычный адрес загрузки для его собственного exe-файла, который не будет блокировать загруженный exe-файл.

В итоге: это много работы.Если вам интересно, взгляните на спецификацию формата PE, которая описывает файлы .exe и .dll, а также функцию VirtualAlloc().

1 голос
/ 09 июня 2010

Хорошо, если вы знаете, где находится смещение точки входа исполняемого файла, и знаете, какие параметры он принимает, тогда все, что вам нужно сделать, - это вызвать функцию по адресу exeBase + entryPointOffset, используя указатель на функцию.

Стоит отметить, что операционные системы, по крайней мере на системах x86, как правило, не позволяют выполнять память, помеченную как данные.Например, в Windows это можно изменить с помощью функции « Virtual ProtectEx », чтобы пометить память как исполняемую.

Фактически, в старые добрые времена это было обычным явлением.Система для экономии памяти.У вас будет « overlays », чтобы вы могли сэкономить память, заменяя код по мере необходимости.

...