Я понимаю, что это немного поздно примерно на 6 месяцев, но я пытался сделать то же самое, и у меня есть некоторые дополнительные примечания:
- Вы можете вступить во владение и удалить
ole32.dll
из HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs
. Это позволяет обойти тот факт, что Windows заблокировала эти ключи.
- Создание ключа
SafeDllSearch
со значением 0
в HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager
равно , которое должно изменить путь поиска .
Применив оба эти метода и перезагрузившись, перехват по-прежнему не работал. Я пошел еще дальше, загрузил виртуальную машину с одним из наших аварийных компакт-дисков (среда на основе Windows PE) и переписал один в system32
. Windows не загружается в результате - никаких ошибок символов, но я никогда не получаю до LogonUI.exe
. Возможно, мои подключенные функции нарушены, поэтому это может быть причиной.
В любом случае, это произвело реальный, ощутимый эффект крючка - хотя тот, который кричит «сломан» !. К сожалению, его очень сложно отладить, и я могу прибегнуть к другому методу перехвата, а именно: IAT patching .
Редактировать Другой эксперимент, который я провел, состоял в том, чтобы явно загрузить саму Dll в адресное пространство целевого процесса. Фрагмент кода, который делает это, выглядит следующим образом:
wchar_t* TargetPath = argv[1];
wchar_t DllPath[] = L"N:\\experiments\\ole32.dll";
STARTUPINFOW si;
PROCESS_INFORMATION pi;
memset(&si, 0, sizeof(STARTUPINFOW));
memset(&pi, 0, sizeof(PROCESS_INFORMATION));
// create process suspended
BOOL bResult = CreateProcess(NULL, TargetPath, NULL, NULL, FALSE,
CREATE_SUSPENDED, NULL, NULL, &si, &pi);
// write DLL name to remote process
void* RemoteAddr = VirtualAllocEx(pi.hProcess, NULL, sizeof(DllPath)+1,
MEM_RESERVE | MEM_COMMIT, PAGE_READONLY);
WriteProcessMemory(pi.hProcess, RemoteAddr, DllPath, sizeof(DllPath), &BytesWritten);
// get handle to LoadLibraryW
PTHREAD_START_ROUTINE pfLoadLibrary = (PTHREAD_START_ROUTINE)
GetProcAddress(GetModuleHandle(L"kernel32.dll"), "LoadLibraryW");
// create remote thread calling LoadLibraryW
HANDLE hThread = CreateRemoteThread(pi.hProcess, NULL,
0, pfLoadLibrary, RemoteAddr, 0, NULL);
// start remote process
ResumeThread(pi.hThread);
Для краткости устранена обработка ошибок.
По сути, цель состояла в том, чтобы принудительно загрузить мой ole32.dll
в адресное пространство цели, прежде чем он успел загрузить ole32.dll
из system32. В моем случае ole32.dll
загружался позже в подпрограмме загрузки приложения, так что теоретически это должно было сработать. На практике это не так. Я не уверен почему.
Обновление Мой исходный код не удался, потому что DLL имела неразрешенные предупреждения о символах во время выполнения. Этот метод работает Так что, очевидно, он загружает и мой ole32.dll
, и тот, что из system32. Чтобы библиотека загружалась успешно, я добавил вызов LoadLibrary(DllPath)
к приведенному выше коду.