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