阅读:2014回复:14
ZwCreateProcess的问题
在UndocumentNT一书中讲到API hook,我测试书中所给出的ZwCreateFile hook成功了。而后我测试ZwCreateProcess hook时编译总是报该函数未定义。这是为何?如何解决呢?
|
|
沙发#
发布于:2004-09-02 12:00
自己声明一下就OK了
|
|
|
板凳#
发布于:2004-09-02 16:17
声明没有用啊。报:error LNK2001: unresolved external symbol
我是试验UndocumentNT一书中hook API的例子。Hook ZwCreateFile编译通过,执行正常,将下面代码中ZwCreateFile该成ZwCreateProcess编译报“未定义的函数”,增加声明后就报上面类似的错误。为何会这样呢? NTSTATUS HookServices() { OldNtCreateProcess=(NTCREATEPROCESS)(SYSTEMSERVICE(ZwCreateProcess)); _asm cli (NTCREATEPROCESS)(SYSTEMSERVICE(ZwCreateProcess))=NewNtCreateProcess; _asm sti return STATUS_SUCCESS; } void UnHookServices() { _asm cli (NTCREATEPROCESS)(SYSTEMSERVICE(ZwCreateProcess))=OldNtCreateProcess; _asm sti return; } |
|
地板#
发布于:2004-09-03 19:27
做过hook ZwCreateProcess的朋友帮帮我吧。
|
|
地下室#
发布于:2004-09-10 14:47
Parsing the NTDLLdll, you will get the function's address
calculate the RVA then just hook . by this way , you can ignore others boring problem like function define. |
|
5楼#
发布于:2004-09-10 14:56
Parsing the NTDLLdll, you will get the function's address sorry , it's from user mode hook , in the kernel mode , the function's address in the system service dispatch table, to find it then hook. good luck. |
|
6楼#
发布于:2004-09-10 16:15
可能需要应用程序的配合,在RING3中获得NTDLL中该服务的ID,传到RING0 hook
|
|
|
7楼#
发布于:2004-10-11 09:33
一代新人换旧人,WOWOCOCK还在
应该可以算驱网常青树啊 |
|
|
8楼#
发布于:2004-10-11 13:13
可能需要应用程序的配合,在RING3中获得NTDLL中该服务的ID,传到RING0 hook 怎么得到该服务的ID呢? |
|
|
9楼#
发布于:2004-10-12 08:35
在RING3中获得NTDLL中该服务的ID,对ntdll.dll文件进行分析来得到相应服务的ID。
|
|
10楼#
发布于:2004-10-12 09:34
在RING3中获得NTDLL中该服务的ID,对ntdll.dll文件进行分析来得到相应服务的ID。 很多文章都提到内核用下面这种方式得到,但是不知道是怎么回事, 哪位能指点点么? (KeServiceDescriptorTable.ServiceTableBase[ *(PULONG)((PUCHAR)ZwXXX+1)]); |
|
|
11楼#
发布于:2004-10-12 19:12
这是内核中定义好了的数据结构,直接用就可以了。没有原因啊!
|
|
12楼#
发布于:2004-10-13 09:17
这是内核中定义好了的数据结构,直接用就可以了。没有原因啊! 那么这个 “ *(PULONG)((PUCHAR)ZwXXX+1)”是为什么啊? :) |
|
|
13楼#
发布于:2004-10-13 16:47
KeServiceDescriptorTable.ServiceTableBase[]);需要的是一个ID号。*(PULONG)((PUCHAR)ZwXXX+1)中的ZwXXX是作为地址参数传入,(PUCHAR)ZwXXX+1指的是地址加1。反汇编ntdll.dll文件后你可以看到函数的调用基本上都是mov eax, 000000XX这种形式,(PUCHAR)ZwXXX+1就是000000XX的地址,那么*(PULONG)((PUCHAR)ZwXXX+1)就得出了ID号。
|
|
14楼#
发布于:2004-10-14 10:30
KeServiceDescriptorTable.ServiceTableBase[]);需要的是一个ID号。*(PULONG)((PUCHAR)ZwXXX+1)中的ZwXXX是作为地址参数传入,(PUCHAR)ZwXXX+1指的是地址加1。反汇编ntdll.dll文件后你可以看到函数的调用基本上都是mov eax, 000000XX这种形式,(PUCHAR)ZwXXX+1就是000000XX的地址,那么*(PULONG)((PUCHAR)ZwXXX+1)就得出了ID号。 3x |
|
|