Эмуляция статической загрузки dll

Тема в разделе "WASM.WIN32", создана пользователем oleg_nefedov, 14 дек 2011.

  1. ASMatic

    ASMatic New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2010
    Сообщения:
    233
    kejcerfcrv
    я к тому что вы говорите не о том, да и воопще о чем вы?
     
  2. kejcerfcrv

    kejcerfcrv New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2011
    Сообщения:
    320
    ASMatic
    Контекст понимаете, состояние процессора сохраняется в стеке при доставке стартап апк. Как есчо проще обьяснить. А апк эта и есть загрузчик - LdrInitializeThunk(). Она получает контекст на стеке, а далее он передаётся вроде в LdrpRuntInitRoutines() точна не помню название. Вот она и дёргает LdrpCallInitRoutine() с передачей контекста. При динамической загрузке совершенно иное происходит, вы не в апк процедуре и не на этапе инициализации.
     
  3. ASMatic

    ASMatic New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2010
    Сообщения:
    233
    kejcerfcrv
    сразу бы сказали что при инициализации процесса не вызывается LdrLoadDll. А малость по иному,
    (пересмотрел топ и понял о каком вы контексте, наконецто)
    а чо контекст сформировать трудно и передать его в длмаин после того как промапил файл.
     
  4. kejcerfcrv

    kejcerfcrv New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2011
    Сообщения:
    320
    ASMatic
    Просто, если знать каким образом он считывается и как используется.
     
  5. ASMatic

    ASMatic New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2010
    Сообщения:
    233
    В данной задаче нужно посмотреть зачем ему там проверка на контекст (таргетдлл), если это всеголишь проверка не в импорте ли она - то ничего считывать не нужно, а просто передать !0
     
  6. scf

    scf Member

    Публикаций:
    0
    Регистрация:
    12 сен 2005
    Сообщения:
    386
    Цигвин вообще-то опнсорс - прежде чем городить огороды, имеет смысл вкурить исходники, почему и как они так сделали. Если повезет, механизм загрузки длл может даже быть документирован (что логично, т.к. cygwin - это все-таки фреймворк для сборки *nix приложений под винь).

    edit: случаем не пытаешься использовать MSVS вместо гцц для сборки, а?)
     
  7. oleg_nefedov

    oleg_nefedov New Member

    Публикаций:
    0
    Регистрация:
    10 май 2011
    Сообщения:
    18
    Нет.. такого даже не хотел..

    В cygwin1.dll очень простая проверка - если lpReserved == NULL, больше lpReserved нигде не используется. Если проверку занопить, длл работает без проблем.

    Ну а в итоге, что же надо сделать, чтобы загрузить эту библиоткеку "статически"? Кроме ее маппинга вручную? Есть ли вообще такие стандартные средства винды?
     
  8. kejcerfcrv

    kejcerfcrv New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2011
    Сообщения:
    320
    oleg_nefedov
    Есть конечно. Вы наверно и не представляете на сколько гибкий нт лодер. Чего тока стоит отладочная его часть(ShowSnaps). Я например могу решить вообще всё, любую задачу, связанную с загрузчиком просто и кошерно. И это не пиар, просто знание матчасти.
     
  9. ASMatic

    ASMatic New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2010
    Сообщения:
    233
    kejcerfcrv
    подозреваю что oleg_nefedov хотел апишки подергать,а не ловить принты и т.п.)
     
  10. kejcerfcrv

    kejcerfcrv New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2011
    Сообщения:
    320
    ASMatic
    Дбгпринты позволяют отследить и изменить поведению кода нтлдр как угодно. Включив данную опцию мы будем получать полноценные сообщения обо всех событиях в лодере. Далее выполнив одну из маршрутизаций, например потоковую(W) мы можем к примеру эмулировать файловые потоки и вообще обращение к фс простейшим образом. Да и не только отладочный вывод, загрузчик большой и мощный, при приличном его знании не остаётся не решаемых задач.
     
  11. oleg_nefedov

    oleg_nefedov New Member

    Публикаций:
    0
    Регистрация:
    10 май 2011
    Сообщения:
    18
    Я так понимаю что этот путь может быть сделан только с помощью драйвера?

    В идеале конечно да, хотелось бы дернуть несколько АПИ чтобы сэмулировать статический вызов и все...
     
  12. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    Пацаны, какой драйвер? Вы чего? :)

    oleg_nefedov
    1. Грузишь образ c флагом DONT_RESOLVE_DLL_REFERENCES
    2. Находишь РЕ-заголовок
    3. Находишь точку входа в ДЛЛ
    4. Вызываешь с нужными аргументами
    ...
    Код (Text):
    1. typedef BOOL (_stdcall *DLLMAIN)(HMODULE hinstDLL, DWORD dwReason, LPVOID lpvReserved);
    2. DLLMAIN _DllMain;
    3.  
    4.     HMODULE hmod = LoadLibraryExA(pLibName,0,DONT_RESOLVE_DLL_REFERENCES);
    5.     PIMAGE_OPTIONAL_HEADER popt = (PIMAGE_OPTIONAL_HEADER)((*(DWORD*)((PBYTE)hmod + 0x3C)) + (PBYTE)hmod + 4 + sizeof(IMAGE_FILE_HEADER));
    6.     _DllMain    = (DLLMAIN)((PBYTE)hmod + popt->AddressOfEntryPoint);
    7.     _DllMain(hmod, DLL_PROCESS_ATTACH, (PVOID)pContext); // выполняем DllMain. В качестве pContext - передаем то, что требуется. Либо любую константу.
    8.  
    9. /* ... дальше идет твой код ... */
     
  13. oleg_nefedov

    oleg_nefedov New Member

    Публикаций:
    0
    Регистрация:
    10 май 2011
    Сообщения:
    18
    мда.. че то крутился я вокруг DONT_RESOLVE_DLL_REFERENCES, но так и не тестировал..

    а в PEB система положит таким образом загруженный образ?

    Но и соответственно тут надо будет импорт еще восстановить..
     
  14. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    oleg_nefedov
    Ничего восстанавливать не нужно
    Образ грузится полностью с настройкой релоков, импортов, добавлением модуля в ПЕБ и т.д.
    Единственное, что не выполняется - это процедура на точке входа. Ее, вместо системы, выполняете вы.
    После того, как вы ее выполнили, образ настроен полностью.
    Мой код эквивалентен обычной LoadLibraryA, только на точку входа аргументы передаете вы, а не система.
     
  15. oleg_nefedov

    oleg_nefedov New Member

    Публикаций:
    0
    Регистрация:
    10 май 2011
    Сообщения:
    18
    Ясно, вообщем спасибо большое! Спасибо также всем откликнувшимся, за идеи и наставления!
     
  16. sn0w

    sn0w Active Member

    Публикаций:
    0
    Регистрация:
    27 фев 2010
    Сообщения:
    958
    а не проще занопить код который исполняется если lpReserved !=0 ?