gpt4 book ai didi

c++ - 如何将对 ole32.dll 的调用重定向到我自己的代理 DLL?

转载 作者:可可西里 更新时间:2023-11-01 16:10:51 26 4
gpt4 key购买 nike

我正在尝试检测对 CoCreateInstance 的所有调用在我开始的某些进程中(理想情况下,我也能够检测到子进程中的调用)。

为了实现这一点,我使用 Windows 7 上的 Microsoft Visual Studio 2008 创建了一个代理 DLL,它转发标准 ole32.dll 库中除一个调用之外的所有调用,如多篇文章中所述,例如Intercepted: Windows Hacking via DLL Redirection .生成的 DLL 看起来不错,但我无法让现有程序(我使用标准 ActiveX Control Test Container (tstcon32.exe) 作为测试应用程序)获取我的代理 DLL。根据 Process Explorer,无论我做什么,程序似乎总是选择 C:\Windows\SysWow64\ole32.dll .到目前为止,我尝试了一些事情:

  1. 将包含我的代理 DLL 的目录添加到 PATH 中,然后调用该程序;似乎没有任何效果。
  2. 将我的代理 DLL 复制到与调用程序相同的目录中;运气不好。
  3. Dynamic-Link Library Redirection 中所述,在与调用程序相同的目录中创建一个.local 文件。文章并将我的代理 DLL 放入同一目录中 - 也没有用。但是后来,我读到这在更新的 Windows 版本上停止工作。此外,根据 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs 注册表设置,ole32.dll 是一个“已知 DLL”,因此 .local 基于重定向可能无论如何都不会起作用。
  4. 使用基于 list 的重定向,例如在DLL redirection using manifests问题,但这似乎也没有任何效果。但是,这种方法似乎很重要,所以很可能我做错了什么。

有没有人有使用 stub DLL 将调用重定向到标准 DLL(例如 ole32.dll)的经验?您是如何强制应用程序获取您的 stub DLL 的?

最佳答案

我意识到这有点晚了大约 6 个月,但我正在尝试同样的事情并有一些额外的注意事项:

  1. 您可以从 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs 中获取并删除 ole32.dll。这使您可以绕过 Windows 已锁定这些键的事实。
  2. HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager 中创建值为 0 的键 SafeDllSearchsupposed to alter the search path .

应用了这两种技术并重新启动后, Hook 仍然不起作用。我更进一步,用我们的一张救援 CD(一个基于 Windows PE 的环境)启动了一个虚拟机,并覆盖了 system32 中的那个。结果 Windows 无法启动 - 没有符号错误,但我从来没有达到 LogonUI.exe。可能是我的钩子(Hook)函数被破坏了,所以这可能是原因。

无论如何,这产生了一种实际的、有形的钩子(Hook)效果——尽管它尖叫着“坏了”!不幸的是,它似乎很难调试,我可能会求助于另一种 Hook 方法 - 即 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);

为简洁起见删除了错误处理。

基本上,目标是在它有机会从 system32 加载 ole32.dll 之前,强制将我的 ole32.dll 加载到目标的地址空间。在我的例子中,ole32.dll 是稍后在应用程序的加载例程中加载的,所以这在理论上应该可行。实际上,事实并非如此。我不确定为什么。

更新 我的原始代码失败了,因为 DLL 在运行时有未解析的符号警告。 这项技术确实有效 显然,它加载了我的 ole32.dll 和 system32 中的那个。为确保库加载成功,我在上面的代码中添加了一个 LoadLibrary(DllPath) 调用。

关于c++ - 如何将对 ole32.dll 的调用重定向到我自己的代理 DLL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5866322/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com