能力值:
( 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
在虚拟机中可以成功加载 启动也会正确显示输出信息 仅仅是调试出的问题
下面是我虚拟机设置的图片 ,尽可能多的说明 供大家判断吧
能力值:
( LV5,RANK:70 )
3 楼
你的符号地址不正确,改正之后按一下windbg中的暂停按钮看看有什么反应
能力值:
( LV5,RANK:70 )
4 楼
lz学学英语吧,基础很重要
能力值:
( 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
---------
您能说下哪个信息比较重要么 您稍微指点一下就行
能力值:
( 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); //打印出此时的地址 可是我就是看着堕落天才的源码写的啊 怎么会错呢
能力值:
( 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");
}
能力值:
( LV5,RANK:70 )
8 楼
看样子问题出在这句的里面
Address=(ULONG)KeServiceDescriptorTable->ServiceTableBase+0x7a * 4
KeServiceDescriptorTable的地址有效吗。
f8cb84cb那个不是错误命令的地址,它前面的命令才是出错的地方,赶紧学学英语吧。
能力值:
( LV4,RANK:45 )
9 楼
额 英语是我最大的弱点 不过这个代码 我是从堕落天才发布的那个源码复制的 编译会通过 竟然会蓝屏。。。
能力值:
( LV4,RANK:45 )
10 楼
我看了网上的好几个帖子了 都是关于 HOOK SSDT的 大概意思 好像是要用函数获取SSDT的地址 然后把地址给指针变量 来进行HOOK 不过 他的源码 我没看到有函数会给KeServiceDescriptorTable这个指针变量一个地址 是不是这里出错了呢
能力值:
( LV2,RANK:10 )
11 楼
回复一下哦
能力值:
( LV5,RANK:70 )
12 楼
果然你的KeServiceDescriptorTable没有用extern声明