Как запустить образ PE, не связывая kernel32.dll и ntdll.dll - PullRequest
7 голосов
/ 20 сентября 2011

Я пытался написать пелоадер. Сначала я загружаю исполняемый образ и все его зависимые библиотеки (включая kernel32.dll и ntdll.dll) в память, обрабатываю всю таблицу адресов импорта, перезаписываю все данные, которые необходимо переместить.

Затем я вызываю все изображения EntryPoint по порядку. Я получаю код возврата 0 из EntryPoint ntdll.dll, но kernel32.dll возвращает 0xC0000000. Когда я попытался вызвать EntryPoint исполняемого образа, программа упала.

Я знаю, что система Windows уже загружает ntdll.dll и kernel32.dll в память процесса при создании процесса. У меня вопрос, как я могу загрузить еще одну копию ntdll.dll и kernel32.dll в память и связать мой модуль с копиями.

Я провожу эксперимент: 1. скопируйте ntdll.dll -> a.dll

  1. copy kernel32.dll -> b.dll
  2. Измените PE файл образа b.dll, чтобы он не зависел от ntdll.dll, а a.dll
  3. написать простую программу a.exe и изменить файл образа PE a.exe, чтобы он зависел не от kernel32.dll, а от b.dll
  4. запустите a.exe, и программа упала

Можно ли правильно запустить a.exe?

Это мой первый вопрос о переполнении стека, извините за мой плохой английский. Спасибо.

Ответы [ 3 ]

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

Я не думаю, что вы можете сделать это.Ядро3232.dll и ntdll.dll, AFAIK не перемещаются.Таким образом, MS удалила информацию о перемещении из них, потому что, поскольку они уже загружены в каждом процессе, их назначенные адреса всегда доступны в соответствии с дизайном.

Итак, если вы попытаетесь загрузить их в другой адресНу, они потерпят крах.Теоретически вы могли бы попытаться восстановить для них информацию о перемещении ... но я бы не стал на это ставить.

Мой вопрос, в свою очередь, таков: почему вы не можете использовать предварительно загруженное kernel32 / ntdll?Почему вы чувствуете, что вам нужны частные копии?На мой взгляд, вы должны считать их системным API и оставить их в покое.

0 голосов
/ 03 марта 2012

Если вы хотите использовать свою собственную версию ntdll.dll (a.dll) в своем коде, то вы можете прочитать dll с помощью Readfile () и проанализировать структуры PE для использования в вашем коде.например: вы можете проанализировать таблицу имен экспорта, таблицу порядковых номеров экспорта и таблицу адресов экспорта, чтобы найти указатели на экспортируемые функции и использовать их в исполняемом файле.

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

В visual studio укажите в свойствах проекта linker->input->Ignore All default libraries до yes.Затем в c++->Code Generation->Basic Runtime Check по умолчанию (чтобы избежать связывания в __RTC_*. Затем в linker->Advanced->Entry Point вы указываете функцию в своем проекте, которую хотите вызывать при запуске программы.

Создайте все, и вы должныиметь программу, не связанную ни с одной библиотекой, включая c-runtime.

...