、
安装与配置 windbg 的 symbol (符号)
本篇是新手自己写的一点心得.建议新手看看.同时希望前辈多多指教.
写这篇的动机:在网上找了一上午的 windbg 配置符号教程.楞是没找到详细的,都讲的太模糊而且互相抄袭.不适合新手看.终于靠自己的努力弄懂了一点,呵呵写出来新手们分享.
安装与配置 windbg 的 symbol (符号)
第一步 是从 http://www.microsoft.com/ddk/debugging 下载最新版本的 WinDBG,因为符号服务器二进制文件是由 WinDBG 小组开发的。
您将需要检查是否有 WinDBG 更新版本,因为该小组似乎具有相当紧凑的发布日程安排,并且每隔几个月就会发布更新版本。
第二步 双击下载的文件安装 windbg .安装时注意记住安装到那里了.
第三步 windbg 访问符号需要两个文件(SYMSRV.DLL 和 SYMSTORE.EXE)所以添加主 path 环境变量中它们的路径进去,即:你的 windbg 安装目录.
操作方法:在桌面我的电脑点右键--属性--高级--环境变量,在系统变量列表框中找到 path 双击,在变量值最后面加一个分号再把你的安装目录写上.点确定.
这一步是告诉 windbg 那两个文件放在什么地方.
第四步 新建一个环境变量_NT_SYMBOL_PATH 值为: SRV*c:\mysymbol* http://msdl.microsoft.com/download/symbols
操作方法:桌面我的电脑点右键--属性--高级--环境变量 ,点击新建,把上面的变量名和变量值填上.这一步的意思是说告诉 windbg ,我的符号文件存放在c:\mysymbol 中(当然其实里面什么也没有,甚至这个文件夹也不存在,不过没关系,系统找不到的话会给你创建一个,并在上面的网址中去帮你下载符号文件放在里面)
第五步 运行 windbg 打开一个exe文件或者附加到一个进程里去, 你会看到 Symbol search path is: SRV*c:\mysymbol* http://msdl.microsoft.com/download/symbols
打开c盘看到有一个新目录 mysymbol,里面有 windbg 新下载的文件.
TP hook第一处 NtOpenProcess
nt!NtOpenProcess+0x209:
805cc65f 8d45e0 lea eax,[ebp-20h]
805cc662 50 push eax
805cc663 ff75cc push dword ptr [ebp-34h]
805cc666 ff35b8495680 push dword ptr [nt!PsProcessType (805649b8)]
805cc66c 56 push esi
805cc66d 8d8548ffffff lea eax,[ebp-0B8h]
805cc673 50 push eax
805cc674 ff75c8 push dword ptr [ebp-38h]
805cc677 ff75dc push dword ptr [ebp-24h]
805cc67a e83906ffff call nt!ObOpenObjectByPointer (805bccb8) <----------- HOOK ObOpenObjectByPointer 使用inline hook绕过
TP HOOK 第二处
nt!NtOpenThread+0x1ff:
805cc8e1 8d45dc lea eax,[ebp-24h]
805cc8e4 50 push eax
805cc8e5 ff75d0 push dword ptr [ebp-30h]
805cc8e8 ff35bc495680 push dword ptr [nt!PsThreadType (805649bc)]
805cc8ee 56 push esi
805cc8ef 8d854cffffff lea eax,[ebp-0B4h]
805cc8f5 50 push eax
805cc8f6 ff75cc push dword ptr [ebp-34h]
805cc8f9 ff75e0 push dword ptr [ebp-20h]
805cc8fc e8b703ffff call nt!ObOpenObjectByPointer (805bccb8)
805cc901 8bf8 mov edi,eax
805cc903 8d854cffffff lea eax,[ebp-0B4h]
805cc909 50 push eax
805cc90a e86f5a0200 call nt!SeDeleteAccessState (805f237e)
805cc90f 8b4de0 mov ecx,dword ptr [ebp-20h]
805cc912 e8abadf5ff call nt!ObfDereferenceObject (805276c2) <----------- inline hook 绕过
805cc917 3bfe cmp edi,esi
805cc919 0f8c6affffff jl nt!NtOpenThread+0x1a7 (805cc889)
读写进程 NtReadVirtualMemory NtWriteVirtualMemory 都是inline hook 头7字节。
HOOK后
805b53d4 b8c21b659e mov eax,9E651BC2h
805b53d9 ffe0 jmp eax
附加进程 的内核API KiAttachProcess
备注:KiAttachProcess是个为未导出API 所以不能用MmGetSystemRoutineAddress 获取地址 (PS:ki是未导出 ke是导出的API) KeAttachProcess 其实也是调用KiAttachProcess实现的。而且在第一个call 就是 调用KiAttachProcess。所以直接搜索 第一个E8 就可以了。
得到了KiAttachProcess地址后。
操作方法: 在TP启动之前,保存KiAttachProcess头7字节 然后在TP启动后,直接用保存好的7字节恢复 KiAttachProcess。这样就可以了。