Существуют ли PE-файлы, не импортирующие kernel32.dll?

Тема в разделе "WASM.BEGINNERS", создана пользователем Codegrammer, 27 апр 2010.

  1. Codegrammer

    Codegrammer New Member

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    37
    Вопрос должен быть понятен. И, если существуют, то что тогда находится в начальный момент в стеке. Ведь, обычно там находится некий адрес из kernel32. А если его не будет, то что там. Или все файлы импортируют kernel32?
     
  2. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    Codegrammer
    насколько мне известно кернел загрузиться в любом случае в ап, не зависимот от того есть ли импортируемые функции или нет.
     
  3. Codegrammer

    Codegrammer New Member

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    37
    А есть по этому поводу ссылки на какие-нибудь официальные источники?
     
  4. Ursus

    Ursus Member

    Публикаций:
    0
    Регистрация:
    15 мар 2006
    Сообщения:
    238
    Адрес:
    Russia
    Process: smss.exe
    Loaded modules: smss.exe, ntdll.dll

    По данным process explorer :)
     
  5. Codegrammer

    Codegrammer New Member

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    37
    The smss.exe application cannot be run in Win32 mode.

    По данным клика мышью по файлу (ОС Windows7). Может как раз, то что не импортирует - то не вин32 приложение? (Это лишь мое предположение)
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Codegrammer
    kernel32.dll/(kernelbase.dll в старших версиях) грузит нэйтив при инициализации, точнее системный лодер в LdrpInitializeProcess(). Описывайте задачу нормально, а не эти жалкие попытки её решения.
     
  7. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    я на С++ писал файл не импортирующий kenrel32 :)
    убираешь из списка линкера kernel32.lib, пишеш свои реализации для функций kernel32 - и оно работает)

    можно на фасме написать в пару строчек кода
    Код (Text):
    1. format PE
    2. ret
     
  8. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    разумеется при этом kernel32 будет грузиться)
     
  9. Codegrammer

    Codegrammer New Member

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    37
    Я вопрос изначально неправильно задал. Имелось ввиду загрузка kernel32.dll. Clerk дал исчерпывающий ответ. Спасибо :) Тему можно считать закрытой.
     
  10. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Это деталь реализации. Сие может измениться в следующей версии Windows, например.

    >kernelbase.dll
    Автоматом грузится при нормальных условиях исключительно за счёт того, что kernel32.dll из неё импортирует.

    >Может как раз то, что не импортирует - то не вин32 приложение?
    Тип определяется в заголовке: OptionalHeader.Subsystem. 1 – Native, 2 – GUI, 3 – Console, 7 – Posix, etc.
    Smss – это как раз Native.

    Вот кусок этого кода из ntdll (nt6):
    Код (Text):
    1. NTSTATUS LdrpInitializeProcess(CONTEXT* Context, HMODULE SystemDllBase)
    2. {
    3.     ...
    4.     IMAGE_NT_HEADERS* NtHeader = RtlImageNtHeader(Peb->ImageBaseAddress);
    5.     ...
    6.     if (NtHeader->OptionalHeader.Subsystem == IMAGE_SUBSYSTEM_WINDOWS_GUI  ||
    7.         NtHeader->OptionalHeader.Subsystem == IMAGE_SUBSYSTEM_WINDOWS_CUI)
    8.     {
    9.         status = LdrLoadDll(Kernel32DllName, &KernelHandle);
    10.         if (SUCCEEDED(status))
    11.         {
    12.             LdrGetProcedureAddress(Kernel32Handle,  Kernel32ThreadInitThunkName, &Kernel32ThreadInitThunk);         // "BaseThreadInitThunk"
    13.             LdrGetProcedureAddress(Kernel32Handle,  Kernel32BaseQueryModuleDataName, &Kernel32BaseQueryModuleData); // "BaseQueryModuleData"
    14.         }
    15. #if NTDDI >= NTDDI_WIN7
    16.         if (status == STATUS_DLL_NOT_FOUND)
    17.             status = LdrLoadDll(KernelBaseDllName, &KernelHandle);
    18. #endif
    19.         if (FAILED(status))
    20.             ...
    21.     }
    22.     ...
     
  11. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Sol_Ksacap
    Если LdrLoadDll("kernel32.dll") возвратит STATUS_DLL_NOT_FOUND, то бует заюзана LdrLoadDll("kernelbase.dll").
     
  12. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Clerk
    Условия, когда LdrLoadDll("kernel32.dll") возвратит STATUS_DLL_NOT_FOUND считаются ненормальными (в w7 kernel32.dll ещё присутствует).
     
  13. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Sol_Ksacap
    Задача сама по себе не нормальная ;)
     
  14. Codegrammer

    Codegrammer New Member

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    37
    Рад буду услышать ваши предложения. Нужно без модификации экзешника перехватить функцию CreateFileW. Мой алгоритм:
    1) Копирую в папку с экзешником kernel32.dll
    2) в реестре меняю ExcludeFromKnownDlls
    3) в таблице импорта kernel32.dll добавляю свою дллку hooker.dll.
    ....
    n) profit

    Знаю, что модификация данного ключа в реестре - вещь убогая, но как сделать по другому - не знаю. Рад услышать предложения.
     
  15. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Codegrammer
    Чтобы исключить модуль из директории записью в реестр нужен ребут. Можно удалить налету, но это грязный хак. Я бы зарегал верификатор(Avrf) для целевого приложения, он загружается и запускается есчо до загрузки kernel32, но после инициализации загрузчика.
     
  16. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    Codegrammer
    Ну как вариант, запускаешь процесс, но в состоянии ожидания запуска (читай suspend главного потока), Далее перед запуском, ищешь в списке модулей kernel32.dll, там в импорте заменяешь адрес CreateFileW на свой (то есть тут даже на длл менять не надо - выделил память к процессу и туда направляешь вызов, предварительно записав свой обработчик).
    Довольно простое решение. С учетом того, что не нужно трогать реестер, и не нужно писать свою длл.
    Но опять же - вы не написали своих целей, так что, подойдет оно или нет - решать вам.
     
  17. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    TermoSINteZ
    А кто запускать будет ?
    Должно автоматически, хотя можно зарегать как отладчик.
     
  18. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    Наличие файла «имя экзешника».local уже не срабатывает? Я попробовал, XP SP2 чудненько грузит патченый kernel32.dll из папки программы.
     
  19. Codegrammer

    Codegrammer New Member

    Публикаций:
    0
    Регистрация:
    16 мар 2010
    Сообщения:
    37
    В виндоус7 если патченный кернел лежит в папке с программой, то он все равно сначала ищет в KnownDlls.
    Спасибо большое. Так и сделаю. У меня собственно вся проблема то и была, чтоб до основного потока выполнился мой код. А о suspended я не слышал :). Получается действительно простое решение.
     
  20. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Codegrammer
    Откройте для себя васм.ру :lol:
    Это называется инжект.