deLight Кто-то из нас не понял вопроса ТС. По-моему он спрашивал про написание загрузчика, а не стаб распаковщика. Т.е. ТС хочет загрузить _любой_ файл в адресное пространство своего процесса и далее передать управление на его точку входа. Так как размер загружаемого файла заранее неизвестен, невозможно заранее зарезервировать под него место.
да, мне еще понравилось такое решение: Код (Text): #pragma bss_seg(".exec") __declspec(allocate(".exec")) char buffer[0x500000];
что нужно добавить в загрузчик чтобы он работал корректно? ImageBaseAddress в PEB я уже восстановил. Я думаю в сторону перехвата GetModuleFileNameW, потому как он вызывается перед всеми ошибками, и в его параметрах есть hmodule который может быть null. Что-то еще обычно делают?
тогда да, все восстановлю. Все таки как-то можно исправить действие GetModuleFileNameW чтобы она возвращала нормальный путь при hmodule=0, но желательно без перехватов?
float PEB.ImageBase Какие есчо списки. Да вы совсем обнаглели, до такой степени что не удосужились хотябы посмотреть реализацию GetModuleHandleW(). И что вам после этого можно сказать нормального.
вообще-то я еще в самом начале написал, что восстановил его. И что проблема не в GetModuleHandle, а в GetModuleFileName блин, только что заметил что действительно написал GetModuleHandle. Сори. А GetModuleFileName не заработал даже после Код (Text): ((PLDR_DATA_TABLE_ENTRY)p->Flink)->CheckSum = ioh->CheckSum; ((PLDR_DATA_TABLE_ENTRY)p->Flink)->DllBase = (PVOID)imgbase; ((PLDR_DATA_TABLE_ENTRY)p->Flink)->SizeOfImage = ioh->SizeOfImage; ((PLDR_DATA_TABLE_ENTRY)p->Flink)->EntryPoint = (PVOID)(ioh->AddressOfEntryPoint+imgbase); возвращает Error_Module_not_found
С этим проблема. Возможно структура отличается в windows 7. следующий код Код (Text): while(((PLDR_DATA_TABLE_ENTRY)p->Flink)->DllBase) { printf("%wZ %.08X\n",&((PLDR_DATA_TABLE_ENTRY)p->Flink)->FullDllName,((PLDR_DATA_TABLE_ENTRY)p->Flink)->BaseDllName); p = p->Flink; } выводит это: Код (Text): loader.exe 00004000 ntdll.dll 00004004 kernel32.dll 00084004 KERNELBASE.dll 00084004 MSVCR100D.dll 00084004 SHELL32.dll 000C4004 msvcrt.dll 00084004 SHLWAPI.dll 000C4004 GDI32.dll 000C4004 USER32.dll 000C4004 LPK.dll 000C4004 USP10.dll 000C4004 IMM32.DLL 00084004 MSCTF.dll 00084004 ADVAPI32.dll 00084004 sechost.dll 000C4004 RPCRT4.dll 00084004 COMCTL32.dll 100C4004 WINMM.dll 000C4004 VERSION.dll 00084004 т.е. на месте FullDllName идет BaseDllName. А проблема даже не в этом - GetModuleFileNameW возвращает ошибку даже если ничего вообще не трогать, кроме PEB.ImageBase.
> т.е. на месте FullDllName идет BaseDllName просто BaseDllName это тоже UNICODE_STRING, вот и портачится стек.
В общем все таки поленился я сразу разобраться в реализации GetModuleFileNameW. Короче оказывается она смотрит в InLoadOrderModuleList, а я искал в InMemoryModuleList, проблема решена. А проблемы с unicode_string там вообще нет, все как и должно в структуре