Как запустить PE изображение без связывания kernel32.dll и ntdll.dll

Я попытался написать программу-загрузчик. Сначала я загружаю исполняемый образ и все его зависимые dll (включая 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. скопируйте 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 работает правильно?

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

7
задан cnzjnblxj 20 September 2011 в 07:57
поделиться