阅读:1206回复:2
挂接system call出现的问题
在我的驱动程序中挂接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));”这样的语句造成的,是何原因?望各位赐教!! |
|
最新喜欢:![]() |
沙发#
发布于: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所在内存应为可写,以防万一). |
|
板凳#
发布于:2002-06-28 13:00
向pjf致以120000分的敬意!!
我只是把原来的: ULONG KeServiceDescriptorTable = 0x8046AB80; 改为: extern PServiceDescriptorTableEntry KeServiceDescriptorTable; 就OK了。 给分,给分 |
|