Ответ 1
Я понимаю, что это немного поздно примерно через 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
. Возможно, мои заблокированные функции сломаны, поэтому это может быть причиной.
Во всяком случае, это создало реальный ощутимый эффект крюка - пусть и тот, который кричит "сломан"!. К сожалению, это очень сложно отладить, и я могу прибегнуть к другому методу hooking - а именно 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);
Обработка ошибок удалена для краткости.
В основном цель заключалась в том, чтобы принудительно загрузить my ole32.dll
в целевое адресное пространство, прежде чем у него появилась возможность загрузить ole32.dll
из system32. В моем случае ole32.dll
загружался позже в подпрограмме загрузки приложения, поэтому теоретически это должно было работать. На практике это не так. Я не уверен, почему.
Обновить. Мой исходный код завершился неудачно, потому что у DLL были неразрешенные предупреждения о символах во время выполнения. Этот метод работает. По-видимому, он загружает как my ole32.dll
, так и один из system32. Чтобы обеспечить успешную загрузку библиотеки, я добавил вызов LoadLibrary(DllPath)
к приведенному выше коду.