Опитах се да напиша peloader. Първо зареждам изпълнимото изображение и всички зависими от него 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 и програмата се срина
Възможно ли е да накарате a.exe да работи правилно?
Това е първият ми въпрос относно препълването на стека, съжалявам за лошия ми английски. Благодаря.