Songzh
驱动牛犊
驱动牛犊
  • 注册日期2001-12-29
  • 最后登录2011-03-29
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1208回复:2

挂接system call出现的问题

楼主#
更多 发布于:2002-06-28 10:08
在我的驱动程序中挂接system call中的NtQuerySystemInformation,通过以下代码实现:
......
typedef struct _ServiceDescriptorEntry {
        unsigned int *ServiceTableBase;
        unsigned int *ServiceCounterTableBase;
        unsigned int NumberOfServices;
        unsigned char *ParamTableBase;
    }ServiceDescriptorTableEntry, *PServiceDescriptorTableEntry;

ULONG KeServiceDescriptorTable = 0x8046AB80;
......
NTSTATUS DriverEntry(...){
...
RealZwQuerySystemInformation = (REALZWQUERYSYSTEMINFORMATION)(*(((PServiceDescriptorTableEntry)KeServiceDescriptorTable)->ServiceTableBase + 0x97));
*(((PServiceDescriptorTableEntry)KeServiceDescriptorTable)->ServiceTableBase + 0x97) = HookZwQuerySystemInformation;
...
}
在我现用的机器上(win2000 2195)上能成功挂接,可是在别的机器上(同样的win2000版本)运行时,却‘咔嚓’一声,机器自己关掉了,经检查是在“(REALZWQUERYSYSTEMINFORMATION)(*(((PServiceDescriptorTableEntry)KeServiceDescriptorTable)->ServiceTableBase + 0x97));”这样的语句造成的,是何原因?望各位赐教!!

最新喜欢:

flyfoxflyfox
Songzh
驱动牛犊
驱动牛犊
  • 注册日期2001-12-29
  • 最后登录2011-03-29
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-06-28 13:00
向pjf致以120000分的敬意!!
我只是把原来的:
ULONG KeServiceDescriptorTable = 0x8046AB80;
改为:
extern PServiceDescriptorTableEntry KeServiceDescriptorTable;
就OK了。

给分,给分

pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-06-28 12:09
ULONG KeServiceDescriptorTable = 0x8046AB80;
------------------------------------------------------------------------------
KeServiceDescriptorTable是由ntoskrnl.exe导出的,你大可不必写绝对地址,虽然同一版2000不应该将其易位,但也暂不排除可能。
你先将其改为:
extern PServiceDescriptorTableEntry KeServiceDescriptorTable;

另外我把Prasad Dabak的例子给出,你只需照猫画虎,它钩的是NtCreateFile:

typedef NTSTATUS (*NTCREATEFILE)(
            PHANDLE FileHandle,
            ACCESS_MASK DesiredAccess,
            POBJECT_ATTRIBUTES ObjectAttributes,
            PIO_STATUS_BLOCK IoStatusBlock,
            PLARGE_INTEGER AllocationSize OPTIONAL,
            ULONG FileAttributes,
            ULONG ShareAccess,
            ULONG CreateDisposition,
            ULONG CreateOptions,
            PVOID EaBuffer OPTIONAL,
            ULONG EaLength
);

#define SYSTEMSERVICE(_function)  KeServiceDescriptorTable.ServiceTableBase[ *(PULONG)((PUCHAR)_function+1)]
NTCREATEFILE OldNtCreateFile;

NTSTATUS NewNtCreateFile(
                    PHANDLE FileHandle,
                    ACCESS_MASK DesiredAccess,
                    POBJECT_ATTRIBUTES ObjectAttributes,
                    PIO_STATUS_BLOCK IoStatusBlock,
                    PLARGE_INTEGER AllocationSize OPTIONAL,
                    ULONG FileAttributes,
                    ULONG ShareAccess,
                    ULONG CreateDisposition,
                    ULONG CreateOptions,
                    PVOID EaBuffer OPTIONAL,
                    ULONG EaLength)
{
......
}

NTSTATUS HookServices()
{
        OldNtCreateFile=(NTCREATEFILE)(SYSTEMSERVICE(ZwCreateFile));
        _asm cli
        (NTCREATEFILE)(SYSTEMSERVICE(ZwCreateFile))=NewNtCreateFile;
        _asm sti
        return STATUS_SUCCESS;
}

值得说明的是这一句:*(PULONG)((PUCHAR)_function+1)
对于NT/2000而言,Zw*函数第一句总是mov eax,********。此句就是把服务号********取出。
另外,你可以把CR0的WP位清除,钩挂完毕再恢复(虽然Table所在内存应为可写,以防万一).
游客

返回顶部