Вопрос должен быть понятен. И, если существуют, то что тогда находится в начальный момент в стеке. Ведь, обычно там находится некий адрес из kernel32. А если его не будет, то что там. Или все файлы импортируют kernel32?
Codegrammer насколько мне известно кернел загрузиться в любом случае в ап, не зависимот от того есть ли импортируемые функции или нет.
The smss.exe application cannot be run in Win32 mode. По данным клика мышью по файлу (ОС Windows7). Может как раз, то что не импортирует - то не вин32 приложение? (Это лишь мое предположение)
Codegrammer kernel32.dll/(kernelbase.dll в старших версиях) грузит нэйтив при инициализации, точнее системный лодер в LdrpInitializeProcess(). Описывайте задачу нормально, а не эти жалкие попытки её решения.
я на С++ писал файл не импортирующий kenrel32 убираешь из списка линкера kernel32.lib, пишеш свои реализации для функций kernel32 - и оно работает) можно на фасме написать в пару строчек кода Код (Text): format PE ret
Я вопрос изначально неправильно задал. Имелось ввиду загрузка kernel32.dll. Clerk дал исчерпывающий ответ. Спасибо Тему можно считать закрытой.
Это деталь реализации. Сие может измениться в следующей версии Windows, например. >kernelbase.dll Автоматом грузится при нормальных условиях исключительно за счёт того, что kernel32.dll из неё импортирует. >Может как раз то, что не импортирует - то не вин32 приложение? Тип определяется в заголовке: OptionalHeader.Subsystem. 1 – Native, 2 – GUI, 3 – Console, 7 – Posix, etc. Smss – это как раз Native. Вот кусок этого кода из ntdll (nt6): Код (Text): NTSTATUS LdrpInitializeProcess(CONTEXT* Context, HMODULE SystemDllBase) { ... IMAGE_NT_HEADERS* NtHeader = RtlImageNtHeader(Peb->ImageBaseAddress); ... if (NtHeader->OptionalHeader.Subsystem == IMAGE_SUBSYSTEM_WINDOWS_GUI || NtHeader->OptionalHeader.Subsystem == IMAGE_SUBSYSTEM_WINDOWS_CUI) { status = LdrLoadDll(Kernel32DllName, &KernelHandle); if (SUCCEEDED(status)) { LdrGetProcedureAddress(Kernel32Handle, Kernel32ThreadInitThunkName, &Kernel32ThreadInitThunk); // "BaseThreadInitThunk" LdrGetProcedureAddress(Kernel32Handle, Kernel32BaseQueryModuleDataName, &Kernel32BaseQueryModuleData); // "BaseQueryModuleData" } #if NTDDI >= NTDDI_WIN7 if (status == STATUS_DLL_NOT_FOUND) status = LdrLoadDll(KernelBaseDllName, &KernelHandle); #endif if (FAILED(status)) ... } ...
Sol_Ksacap Если LdrLoadDll("kernel32.dll") возвратит STATUS_DLL_NOT_FOUND, то бует заюзана LdrLoadDll("kernelbase.dll").
Clerk Условия, когда LdrLoadDll("kernel32.dll") возвратит STATUS_DLL_NOT_FOUND считаются ненормальными (в w7 kernel32.dll ещё присутствует).
Рад буду услышать ваши предложения. Нужно без модификации экзешника перехватить функцию CreateFileW. Мой алгоритм: 1) Копирую в папку с экзешником kernel32.dll 2) в реестре меняю ExcludeFromKnownDlls 3) в таблице импорта kernel32.dll добавляю свою дллку hooker.dll. .... n) profit Знаю, что модификация данного ключа в реестре - вещь убогая, но как сделать по другому - не знаю. Рад услышать предложения.
Codegrammer Чтобы исключить модуль из директории записью в реестр нужен ребут. Можно удалить налету, но это грязный хак. Я бы зарегал верификатор(Avrf) для целевого приложения, он загружается и запускается есчо до загрузки kernel32, но после инициализации загрузчика.
Codegrammer Ну как вариант, запускаешь процесс, но в состоянии ожидания запуска (читай suspend главного потока), Далее перед запуском, ищешь в списке модулей kernel32.dll, там в импорте заменяешь адрес CreateFileW на свой (то есть тут даже на длл менять не надо - выделил память к процессу и туда направляешь вызов, предварительно записав свой обработчик). Довольно простое решение. С учетом того, что не нужно трогать реестер, и не нужно писать свою длл. Но опять же - вы не написали своих целей, так что, подойдет оно или нет - решать вам.
Наличие файла «имя экзешника».local уже не срабатывает? Я попробовал, XP SP2 чудненько грузит патченый kernel32.dll из папки программы.
В виндоус7 если патченный кернел лежит в папке с программой, то он все равно сначала ищет в KnownDlls. Спасибо большое. Так и сделаю. У меня собственно вся проблема то и была, чтоб до основного потока выполнился мой код. А о suspended я не слышал . Получается действительно простое решение.