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

Discussion in 'LANGS.C' started by float, Oct 19, 2010.

  1. KeSqueer

    KeSqueer Сергей

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

    float New Member

    Blog Posts:
    0
    Joined:
    Jan 7, 2010
    Messages:
    113
    да, мне еще понравилось такое решение:

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

    float New Member

    Blog Posts:
    0
    Joined:
    Jan 7, 2010
    Messages:
    113
    что нужно добавить в загрузчик чтобы он работал корректно?

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

    sysexit New Member

    Blog Posts:
    0
    Joined:
    Aug 27, 2010
    Messages:
    176
    Правка AdressOfEntryPoint, SizeOfImage, ImageBase?
     
  5. deLight

    deLight New Member

    Blog Posts:
    0
    Joined:
    May 26, 2008
    Messages:
    879
    float
    разберитесь лучше как это работает, не надо этих патчей
     
  6. float

    float New Member

    Blog Posts:
    0
    Joined:
    Jan 7, 2010
    Messages:
    113
    ну в пе хедере, да? по моему первые 2 нет необходимости править
     
  7. sysexit

    sysexit New Member

    Blog Posts:
    0
    Joined:
    Aug 27, 2010
    Messages:
    176
  8. float

    float New Member

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

    Clerk Забанен

    Blog Posts:
    0
    Joined:
    Jan 4, 2008
    Messages:
    6,689
    Location:
    РБ, Могилёв
    float
    PEB.ImageBase
     
  10. float

    float New Member

    Blog Posts:
    0
    Joined:
    Jan 7, 2010
    Messages:
    113
    p.s. спасибо, понял. В teb->peb->ldr, там двусвязные списки модулей, там и надо фиксить.
     
  11. Clerk

    Clerk Забанен

    Blog Posts:
    0
    Joined:
    Jan 4, 2008
    Messages:
    6,689
    Location:
    РБ, Могилёв
    float
    PEB.ImageBase

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

    float New Member

    Blog Posts:
    0
    Joined:
    Jan 7, 2010
    Messages:
    113
    вообще-то я еще в самом начале написал, что восстановил его. И что проблема не в GetModuleHandle, а в GetModuleFileName

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

    Code (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

    Blog Posts:
    0
    Joined:
    Jun 5, 2004
    Messages:
    4,336
    Location:
    Russia
    BaseDllName
     
  14. float

    float New Member

    Blog Posts:
    0
    Joined:
    Jan 7, 2010
    Messages:
    113
    С этим проблема. Возможно структура отличается в windows 7.

    следующий код
    Code (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.     }
    выводит это:

    Code (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

    Blog Posts:
    0
    Joined:
    Jun 5, 2004
    Messages:
    4,336
    Location:
    Russia
    > т.е. на месте FullDllName идет BaseDllName
    просто BaseDllName это тоже UNICODE_STRING, вот и портачится стек.
     
  16. float

    float New Member

    Blog Posts:
    0
    Joined:
    Jan 7, 2010
    Messages:
    113
    В общем все таки поленился я сразу разобраться в реализации GetModuleFileNameW. Короче оказывается она смотрит в InLoadOrderModuleList, а я искал в InMemoryModuleList, проблема решена. А проблемы с unicode_string там вообще нет, все как и должно в структуре