定制调试诊断工具和实用程序(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,这似乎就是调用失败的原因。
- ››调试SQL server 2008功能设置
- ››调试JavaScript错误
- ››定制个性化的对话框窗口类
- ››定制 SWT/RCP 界面:如何编写一个漂亮的 SWT/RCP ...
- ››调试和测试 Swing 代码
- ››定制基于 Visual studio 2005 平台 Windows CE(AR...
- ››定制版黑雨 blackra1n 越狱3.1.2 全系 iPhone
- ››调试集成 Java 和 C/C++ 的代码
- ››定制 Eclipse RCP 应用程序,第 1 部分: 可与 SWT...
- ››调试JavaScript脚本程序(Firefox篇)
- ››调试JavaScript/VB Script脚本程序(ASP.NET篇)
- ››调试JavaScript/VB Script脚本程序(Wscript篇)
更多精彩
赞助商链接