WEB开发网
开发学院软件开发VC 定制调试诊断工具和实用程序(8) 阅读

定制调试诊断工具和实用程序(8)

 2006-07-20 11:42:17 来源:WEB开发网   
核心提示: Figure 13 远程执行一旦 DLL 被加载到其它进程的地址空间,DllMain 入口点以 DLL_PROCESS_ATTACH 为参数被调用,定制调试诊断工具和实用程序(8)(3),作为安全检查,s_dwProcessID 与运行进程的 ID 进行比较,它是线程专用的存取权限,由于传

Figure 13 远程执行

一旦 DLL 被加载到其它进程的地址空间,DllMain 入口点以 DLL_PROCESS_ATTACH 为参数被调用。作为安全检查,s_dwProcessID 与运行进程的 ID 进行比较。用 GrabHook_SharedBuffer 作为名称创建内存映像文件,对应的共享内存指针被保存在 g_lpvMem。该缓冲被用于在远程进程中运行的 DLL 代码和调用进程自身之间交换大块数据。如果你需要分配一块缓冲,其大小只为远端执行代码所知,你只要用 VirtualAlloc 分配一块内存即可,而不使用内存映像文件,其指针地址被保存在一个共享变量中。然后,你在调用进程中用 ReadProcessMemory 读取缓冲内容。最后用 VirtualFreeEx 来释放它以避免溢出。

接下来的工作就是缓冲拷贝问题以及从远程进程卸载 DLL。使用与 CreateRemoteThread 一样的技术,因为 FreeLibrary 具备与线程过程同样的署名。唯一的窍门是要找到 DLL 的加载地址。Toolhelp32 已被 PSAPI 取而代之,以便代码也能在 Windows NT 中运行。这个注入技术有一点局限。对于 某些进程来说,比如那些以其他用户身份运行的进程,CreateRemoteThread 调用会失败。在这种情况下,内核会有如下的出错记录:

SE: Warning, new thread does not have
SET_THREAD_TOKEN for itself
SE: Check that thread 468.2ec isn''t in
some weird state at the kernel level

但是该 SET_THREAD_TOKEN 看起来并不像任何 SE 特权。相反,它看起来像 THREAD_SET_THREAD_TOKEN,它是线程专用的存取权限。由于传递给 CreateRemoteThread 的参数中安全描述符为 NULL,这似乎就是调用失败的原因。

上一页  1 2 3 4 5  下一页

Tags:定制 调试 诊断

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接