首页
社区
课程
招聘
[旧帖] [求助]关于windbg调试错误的问题 0.00雪花
发表于: 2013-10-22 21:34 2365

[旧帖] [求助]关于windbg调试错误的问题 0.00雪花

2013-10-22 21:34
2365
前天电脑中了次病毒,然后电脑再用windbg调试 就出错了 虚拟机和windbg可以连接上 输入g命令可以运行,但是输入后  windbg就会一直处于Debuggee is running...这个状态 我用InstDrv来安装驱动 再启动下  如果按照以前正确的调试 源码会跳出来 并且windbg窗口可以输入命令 并且虚拟机的东西就不能点击了 不过如今调试起来  从安装-->启动-->停止-->卸载,windbg的命令窗口就一直是Debuggee is running...这个状态 而且虚拟机的任何东西都可以点击 移动 ,  如果输入.reload命令 好像显示的是符号错误 可是我用的pdb是WDK编译的时候生成的 而且我以前编译也是用的WDK自己生成的 从来没出现过这种错误啊     看雪大牛最多了 所以这种问题可能对你们就是小菜一碟 ,不过我没上过大学 英语基本为0 一些信息根本看不懂  而且又是一路自学的 所以 现在就跟个无头苍蝇似的  弄了整整两天一夜,昨晚三点多才睡,今天又重装了系统 还是不成功, 实在是真的没办法了  就慕名远扬来到看雪了  请各位大牛看到我的问题 一定要跟我说下哈 希望你们理解我的心情 我在百度也发帖了 但是没人回复  所以我把我最后的希望放看看雪了   拜托各位了!!  今晚通宵等待......
  可能我描述的信息还是不太清楚 所以我发两个图片 给各位看下  另外 祝回答问题的人 全家健康,幸福!  !   

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 302
活跃值: (246)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
2
对了 我想补充一下  我的虚拟机是XP SP3的 物理机是win7的 windbg  用了网上直接下载的和WDK自带的 都不行 都是Debuggee is running...这个状态   我虚拟机的boot.ini是这么设置的:multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect /debug /debugport=com2 /baudrate=115200

我的windbg是创建的快捷方式 然后在属性中这么设置的:F:\驱动程序\WinDbg\windbg.exe -b -k com:port=\\.\pipe\com_1,baud=115200,pipe

在虚拟机中可以成功加载 启动也会正确显示输出信息 仅仅是调试出的问题  

下面是我虚拟机设置的图片  ,尽可能多的说明 供大家判断吧   
2013-10-22 21:45
0
雪    币: 238
活跃值: (55)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
3
你的符号地址不正确,改正之后按一下windbg中的暂停按钮看看有什么反应
2013-10-22 22:31
0
雪    币: 238
活跃值: (55)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
4
lz学学英语吧,基础很重要
2013-10-22 22:34
0
雪    币: 302
活跃值: (246)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
5
谢谢您啊 兄台 问题已经弄好了  是蓝屏的问题   我是看的堕落天才的SSDT HOOK 用命令查看了下  蓝屏信息如下:

kd> !analyze -v
*******************************************************************************
*                                                                             *
*                        Bugcheck Analysis                                    *
*                                                                             *
*******************************************************************************

SYSTEM_THREAD_EXCEPTION_NOT_HANDLED (7e)
This is a very common bugcheck.  Usually the exception address pinpoints
the driver/function that caused the problem.  Always note this address
as well as the link date of the driver/image that contains this address.
Arguments:
Arg1: c0000005, The exception code that was not handled
Arg2: f8cb84cb, The address that the exception occurred at
Arg3: f8af1ba8, Exception Record Address
Arg4: f8af18a4, Context Record Address

Debugging Details:
------------------

EXCEPTION_CODE: (NTSTATUS) 0xc0000005 - 0x%08lx

FAULTING_IP:
FirstHook+4cb
f8cb84cb 8b08            mov     ecx,dword ptr [eax]

EXCEPTION_RECORD:  f8af1ba8 -- (.exr 0xfffffffff8af1ba8)
ExceptionAddress: f8cb84cb (FirstHook+0x000004cb)
   ExceptionCode: c0000005 (Access violation)
  ExceptionFlags: 00000000
NumberParameters: 2
   Parameter[0]: 00000000
   Parameter[1]: 00000000
Attempt to read from address 00000000

CONTEXT:  f8af18a4 -- (.cxr 0xfffffffff8af18a4)
eax=00000000 ebx=00000000 ecx=80528d04 edx=0000000d esi=e17e0a84 edi=820da2e0
eip=f8cb84cb esp=f8af1c70 ebp=f8af1c74 iopl=0         nv up ei ng nz na po nc
cs=0008  ss=0010  ds=0023  es=0023  fs=0030  gs=0000             efl=00010282
FirstHook+0x4cb:
f8cb84cb 8b08            mov     ecx,dword ptr [eax]  ds:0023:00000000=????????
Resetting default scope

PROCESS_NAME:  System

ERROR_CODE: (NTSTATUS) 0xc0000005 - 0x%08lx

READ_ADDRESS:  00000000

BUGCHECK_STR:  0x7E

DEFAULT_BUCKET_ID:  NULL_DEREFERENCE

LAST_CONTROL_TRANSFER:  from f8cb8601 to f8cb84cb

STACK_TEXT:  
WARNING: Stack unwind information not available. Following frames may be wrong.
f8af1c74 f8cb8601 f8af1d4c 8057777f 820da2e0 FirstHook+0x4cb
f8af1c7c 8057777f 820da2e0 82501000 00000000 FirstHook+0x601
f8af1d4c 8057788f 8000090c 00000001 00000000 nt!IopLoadDriver+0x66d
f8af1d74 80535c02 8000090c 00000000 825b78b8 nt!IopLoadUnloadDriver+0x45
f8af1dac 805c7160 b2b0ecf4 00000000 00000000 nt!ExpWorkerThread+0x100
f8af1ddc 80542dd2 80535b02 00000001 00000000 nt!PspSystemThreadStartup+0x34
00000000 00000000 00000000 00000000 00000000 nt!KiThreadStartup+0x16

FOLLOWUP_IP:
FirstHook+4cb
f8cb84cb 8b08            mov     ecx,dword ptr [eax]

SYMBOL_STACK_INDEX:  0

SYMBOL_NAME:  FirstHook+4cb

FOLLOWUP_NAME:  MachineOwner

MODULE_NAME: FirstHook

IMAGE_NAME:  FirstHook.sys

DEBUG_FLR_IMAGE_TIMESTAMP:  52656cdd

STACK_COMMAND:  .cxr 0xfffffffff8af18a4 ; kb

FAILURE_BUCKET_ID:  0x7E_FirstHook+4cb

BUCKET_ID:  0x7E_FirstHook+4cb

Followup: MachineOwner
---------

您能说下哪个信息比较重要么  您稍微指点一下就行
2013-10-23 12:31
0
雪    币: 302
活跃值: (246)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
6
我刚刚u命令查看了下异常地址,汇编代码如下:
kd> u f8cb84cb
FirstHook+0x4cb:
f8cb84cb 8b08            mov     ecx,dword ptr [eax]
f8cb84cd 81c1e8010000    add     ecx,1E8h
f8cb84d3 894dfc          mov     dword ptr [ebp-4],ecx
f8cb84d6 8b55fc          mov     edx,dword ptr [ebp-4]
f8cb84d9 52              push    edx
f8cb84da 68a086cbf8      push    offset FirstHook+0x6a0 (f8cb86a0)
f8cb84df e828010000      call    FirstHook+0x60c (f8cb860c)
f8cb84e4 83c408          add     esp,8

看到add  我就想到了源码那里  然后查看了下 好像是这里错了:
VOID Hook()
{
        _asm
        {
                int 3
        }                                                                                                                                        //这里也断下来
        ULONG Address;
        Address=(ULONG)KeServiceDescriptorTable->ServiceTableBase+0x7a * 4;//得到OpenProcess函数所在的地址
        DbgPrint("Address:0x%08X",Address);                                                                        //打印出他的地址
       
        //解引用,保存原来的地址
        OldServiceAddress=*(ULONG*)Address;                                                                        //返回地址处的内容 也就是真正的地址
        DbgPrint("OldServiceAddress:0x%08X",OldServiceAddress);
       
        DbgPrint("MyNtOpenProcess:0x%08X",MyNtOpenProcess);                                        //打印出函数的地址
       
        JmpAddress=(ULONG)NtOpenProcess+10;                                                                        //这样函数前面的jmp都失效了 返回的函数地址+10处的地址
        DbgPrint("JmpAddress:0x%08X",JmpAddress);                                                        //打印出此时的地址

可是我就是看着堕落天才的源码写的啊 怎么会错呢
2013-10-23 12:36
0
雪    币: 302
活跃值: (246)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
7
这是我的完整代码:
#include "ntddk.h"

typedef struct _SERVICE_DESCRIPTOR_TABLE
{
        PVOID        ServiceTableBase;                        //SSDT表的基址
        PULONG  ServiceCounterTableBase;
        ULONG        NumberOfService;                        //服务个数
        ULONG        ParamTableBase;                                       
}SERVICE_DESCRIPTOR_TABLE,*PSERVICE_DESCRIPTOR_TABLE;

PSERVICE_DESCRIPTOR_TABLE KeServiceDescriptorTable;        //这个是导出函数

VOID OnUnload(IN PDRIVER_OBJECT DriverObject);
VOID Hook();
VOID Unhook();

ULONG        JmpAddress;                                                //跳到NtOpenProcess里的地址
ULONG   OldServiceAddress        ;                        //原来NtOpenProcess的服务地址

VOID MyNtOpenProcess()
{
        DbgPrint("you are success\n");
}

extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriObj,IN PUNICODE_STRING pReg)
{

        pDriObj->DriverUnload=OnUnload;                                                                //卸载函数
                _asm
        {
                int 3
        }                                                                                                                        //此处断点
       
        DbgPrint("Unhooker load");                                                                        //打印信息
        Hook();                                                                                                                //进入函数
        return STATUS_SUCCESS;                                                                                //返回状态
}

VOID OnUnload(IN PDRIVER_OBJECT DriverObject)
{
        DbgPrint("Unhooker unload!");
        Unhook();
}

VOID Hook()
{
        _asm
        {
                int 3
        }                                                                                                                                        //这里也断下来
        ULONG Address;
        Address=(ULONG)KeServiceDescriptorTable->ServiceTableBase+0x7a * 4;//得到OpenProcess函数所在的地址
        DbgPrint("Address:0x%08X",Address);                                                                        //打印出他的地址
       
        //解引用,保存原来的地址
        OldServiceAddress=*(ULONG*)Address;                                                                        //返回地址处的内容 也就是真正的地址
        DbgPrint("OldServiceAddress:0x%08X",OldServiceAddress);
       
        DbgPrint("MyNtOpenProcess:0x%08X",MyNtOpenProcess);                                        //打印出函数的地址
       
        JmpAddress=(ULONG)NtOpenProcess+10;                                                                        //这样函数前面的jmp都失效了 返回的函数地址+10处的地址
        DbgPrint("JmpAddress:0x%08X",JmpAddress);                                                        //打印出此时的地址
       
        _asm{                                                                //去掉内存保护
                cli                                                                //关闭中断
                mov eax,cr0                                                //寄存器的值移到eax
                and eax,not 10000h                                //进行与运算和非运算
                mov cr0,eax                                                //把结果送给cr0
        }
       
        *((ULONG*)Address)=(ULONG)MyNtOpenProcess;                                                        //不是调用 是把函数的地址给他  把地址存放在函数表里面
       
        _asm{                                                                //恢复内存保护
                mov eax,cr0                                                //cr0寄存器的值给eax
                or eax,10000h                                        //
                mov cr0,eax
                sti
        }       
}

VOID Unhook()
{
        ULONG Address;
        Address=(ULONG)KeServiceDescriptorTable->ServiceTableBase+0x7a*4;
       
        _asm{
                cli
                mov eax,cr0
                or  eax,not 10000h
                mov cr0,eax
        }
        *((ULONG*)Address)=(ULONG)OldServiceAddress;        //还原SSDT
       
        _asm{
                mov eax,cr0;
                or eax,10000h
                mov cr0,eax
                sti
        }
        DbgPrint("UnHook\n");
}
2013-10-23 12:37
0
雪    币: 238
活跃值: (55)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
8
看样子问题出在这句的里面
Address=(ULONG)KeServiceDescriptorTable->ServiceTableBase+0x7a * 4
KeServiceDescriptorTable的地址有效吗。
f8cb84cb那个不是错误命令的地址,它前面的命令才是出错的地方,赶紧学学英语吧。
2013-10-23 13:15
0
雪    币: 302
活跃值: (246)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
9
额 英语是我最大的弱点 不过这个代码 我是从堕落天才发布的那个源码复制的 编译会通过  竟然会蓝屏。。。
2013-10-23 14:46
0
雪    币: 302
活跃值: (246)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
10
我看了网上的好几个帖子了  都是关于 HOOK SSDT的   大概意思 好像是要用函数获取SSDT的地址 然后把地址给指针变量 来进行HOOK 不过 他的源码 我没看到有函数会给KeServiceDescriptorTable这个指针变量一个地址  是不是这里出错了呢
2013-10-23 14:48
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
回复一下哦
2013-10-23 15:26
0
雪    币: 238
活跃值: (55)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
12
果然你的KeServiceDescriptorTable没有用extern声明
2013-11-3 17:28
0
游客
登录 | 注册 方可回帖
返回
//