Занятые области памяти

Тема в разделе "LANGS.C", создана пользователем float, 19 окт 2010.

  1. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    deLight
    Кто-то из нас не понял вопроса ТС. По-моему он спрашивал про написание загрузчика, а не стаб распаковщика. Т.е. ТС хочет загрузить _любой_ файл в адресное пространство своего процесса и далее передать управление на его точку входа. Так как размер загружаемого файла заранее неизвестен, невозможно заранее зарезервировать под него место.
     
  2. float

    float New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2010
    Сообщения:
    113
    да, мне еще понравилось такое решение:

    Код (Text):
    1. #pragma bss_seg(".exec")
    2. __declspec(allocate(".exec")) char buffer[0x500000];
     
  3. float

    float New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2010
    Сообщения:
    113
    что нужно добавить в загрузчик чтобы он работал корректно?

    ImageBaseAddress в PEB я уже восстановил. Я думаю в сторону перехвата GetModuleFileNameW, потому как он вызывается перед всеми ошибками, и в его параметрах есть hmodule который может быть null. Что-то еще обычно делают?
     
  4. sysexit

    sysexit New Member

    Публикаций:
    0
    Регистрация:
    27 авг 2010
    Сообщения:
    176
    Правка AdressOfEntryPoint, SizeOfImage, ImageBase?
     
  5. deLight

    deLight New Member

    Публикаций:
    0
    Регистрация:
    26 май 2008
    Сообщения:
    879
    float
    разберитесь лучше как это работает, не надо этих патчей
     
  6. float

    float New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2010
    Сообщения:
    113
    ну в пе хедере, да? по моему первые 2 нет необходимости править
     
  7. sysexit

    sysexit New Member

    Публикаций:
    0
    Регистрация:
    27 авг 2010
    Сообщения:
    176
  8. float

    float New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2010
    Сообщения:
    113
    тогда да, все восстановлю. Все таки как-то можно исправить действие GetModuleFileNameW чтобы она возвращала нормальный путь при hmodule=0, но желательно без перехватов?
     
  9. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    float
    PEB.ImageBase
     
  10. float

    float New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2010
    Сообщения:
    113
    p.s. спасибо, понял. В teb->peb->ldr, там двусвязные списки модулей, там и надо фиксить.
     
  11. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    float
    PEB.ImageBase

    Какие есчо списки. Да вы совсем обнаглели, до такой степени что не удосужились хотябы посмотреть реализацию GetModuleHandleW(). И что вам после этого можно сказать нормального.
     
  12. float

    float New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2010
    Сообщения:
    113
    вообще-то я еще в самом начале написал, что восстановил его. И что проблема не в GetModuleHandle, а в GetModuleFileName

    блин, только что заметил что действительно написал GetModuleHandle. Сори. А GetModuleFileName не заработал даже после

    Код (Text):
    1.     ((PLDR_DATA_TABLE_ENTRY)p->Flink)->CheckSum = ioh->CheckSum;
    2.     ((PLDR_DATA_TABLE_ENTRY)p->Flink)->DllBase = (PVOID)imgbase;
    3.     ((PLDR_DATA_TABLE_ENTRY)p->Flink)->SizeOfImage = ioh->SizeOfImage;
    4.     ((PLDR_DATA_TABLE_ENTRY)p->Flink)->EntryPoint = (PVOID)(ioh->AddressOfEntryPoint+imgbase);
    возвращает Error_Module_not_found
     
  13. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    BaseDllName
     
  14. float

    float New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2010
    Сообщения:
    113
    С этим проблема. Возможно структура отличается в windows 7.

    следующий код
    Код (Text):
    1.     while(((PLDR_DATA_TABLE_ENTRY)p->Flink)->DllBase)
    2.     {
    3.         printf("%wZ %.08X\n",&((PLDR_DATA_TABLE_ENTRY)p->Flink)->FullDllName,((PLDR_DATA_TABLE_ENTRY)p->Flink)->BaseDllName);
    4.         p = p->Flink;
    5.     }
    выводит это:

    Код (Text):
    1. loader.exe 00004000
    2. ntdll.dll 00004004
    3. kernel32.dll 00084004
    4. KERNELBASE.dll 00084004
    5. MSVCR100D.dll 00084004
    6. SHELL32.dll 000C4004
    7. msvcrt.dll 00084004
    8. SHLWAPI.dll 000C4004
    9. GDI32.dll 000C4004
    10. USER32.dll 000C4004
    11. LPK.dll 000C4004
    12. USP10.dll 000C4004
    13. IMM32.DLL 00084004
    14. MSCTF.dll 00084004
    15. ADVAPI32.dll 00084004
    16. sechost.dll 000C4004
    17. RPCRT4.dll 00084004
    18. COMCTL32.dll 100C4004
    19. WINMM.dll 000C4004
    20. VERSION.dll 00084004
    т.е. на месте FullDllName идет BaseDllName. А проблема даже не в этом - GetModuleFileNameW возвращает ошибку даже если ничего вообще не трогать, кроме PEB.ImageBase.
     
  15. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    > т.е. на месте FullDllName идет BaseDllName
    просто BaseDllName это тоже UNICODE_STRING, вот и портачится стек.
     
  16. float

    float New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2010
    Сообщения:
    113
    В общем все таки поленился я сразу разобраться в реализации GetModuleFileNameW. Короче оказывается она смотрит в InLoadOrderModuleList, а я искал в InMemoryModuleList, проблема решена. А проблемы с unicode_string там вообще нет, все как и должно в структуре