Я пытался написать пелоадер.
Сначала я загружаю исполняемый образ и все его зависимые библиотеки (включая 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
- copy kernel32.dll -> b.dll
- Измените PE файл образа b.dll, чтобы он не зависел от ntdll.dll, а a.dll
- написать простую программу a.exe и изменить файл образа PE a.exe, чтобы он зависел не от kernel32.dll, а от b.dll
- запустите a.exe, и программа упала
Можно ли правильно запустить a.exe?
Это мой первый вопрос о переполнении стека, извините за мой плохой английский.
Спасибо.