Fre*_*abe 10 c++ dll winapi tstcon32
我正在尝试在我正在启动的某个过程中检测对CoCreateInstance的所有调用(理想情况下,我也能够检测子进程中的调用).
为了实现这一点,在Windows 7上使用Microsoft Visual Studio 2008,我创建了一个代理DLL,它在标准ole32.dll库中转发除一个调用之外的所有调用,如各种文章中所述,例如
Intercepted:Windows Hacking via DLL Redirection.生成的DLL看起来很好,但我只是不能使现有的程序(我使用标准的ActiveX控件测试容器(tstcon32.exe)作为测试应用程序)拿起我的代理DLL.无论我做什么,程序似乎总是C:\Windows\SysWow64\ole32.dll根据Process Explorer获取.到目前为止,我尝试了一些方法:
PATH然后调用该程序; 似乎没有任何影响..local如动态链接库重定向文章中所述,在与调用的程序相同的目录中创建一个文件,并将我的代理DLL放入同一目录中 - 也不起作用.但后来,我读到这停止了更新的Windows版本.另外,ole32.dll根据HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs注册表设置是一个"已知的DLL" ,所以.local基于重定向可能无论如何都不会起作用.有没有人有重定向标准DLL调用的经验,比如ole32.dll使用存根DLL?你是如何强制应用程序获取存根DLL的?
小智 5
我意识到这有点晚了大约6个月,但我正在尝试同样的事情,并有一些额外的说明:
ole32.dll从HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs.这使您可以解决Windows锁定这些键的问题.SafeDllSearch与价值0的HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager是应该改变的搜索路径.应用这两种技术并重新启动后,挂钩仍然无法正常工作.我进一步,用我们的一张救援CD(一个基于Windows PE的环境)启动了一个虚拟机,并覆盖了一个system32.Windows无法启动 - 没有符号错误,但我从来没有达到过LogonUI.exe.我的钩子函数可能会被破坏,所以这可能是原因.
无论如何,这产生了一种实际的,有形的钩子效果 - 尽管有人尖叫"破碎"!不幸的是,它似乎很难调试,我可能会采用另一种挂钩方法 - 即IAT补丁.
编辑我执行的另一个实验是将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);
Run Code Online (Sandbox Code Playgroud)
为简洁起见,删除了错误处理.
基本上,目标是ole32.dll在有机会ole32.dll从system32 加载之前强制加载到目标的地址空间.在我的情况下,ole32.dll稍后在应用程序的加载例程中加载,所以这在理论上应该有效.在实践中,它没有.我不知道为什么.
更新我的原始代码失败,因为DLL在运行时具有未解析的符号警告.这种技术确实有效.显然,它加载了我ole32.dll和来自system32的那个.为了确保库成功加载,我添加了LoadLibrary(DllPath)对上面代码的调用.
也许winapioverride可以帮助你。它可以记录所有 win api 调用,无需进行任何编程。因此,它会将 dll 注入到执行日志记录的进程中。如果我没记错的话,甚至在进程实际执行任何代码之前,也可以注入自己的自定义 dll。该文档包含一些有关监视 com 对象的信息。
| 归档时间: |
|
| 查看次数: |
3297 次 |
| 最近记录: |