阅读:3436回复:24
ndis.sys导出表里的函数的地址已经得到了,如何做hook?大家讨论或者大侠指点...
在以前贴子的基础上,我已经将ndis.sys里的
NdisRegisterProtocol NdisDeregisterProtocol NdisOpenAdapter NdisCloseAdapter 四个函数已经找到,但是如果做hook呢? 是要将四个函数的地址改变吗?那不是改ndis.sys吗? 是用我的函数的地址来写我所得到的四个函数的地址吗? 请指点或讨论... |
|
沙发#
发布于:2002-05-27 18:57
既然找到了,你就修改一下ndis.sys的内存印象阿,在节表里面把那几个函数的地址指向你的自编函数阿。
|
|
板凳#
发布于:2002-05-27 20:58
高,实在是高。。。。。。。。。 :) |
|
|
地板#
发布于:2002-05-27 21:07
1、修改导出表
2、若你怕别的程序一开始获取实际地址之后直接call,绕过导出表,可以将函数开头6字节改为 push ********(********为你的函数地址) ret 原来的6字节自己保存以便恢复或自己使用原函数。 |
|
地下室#
发布于:2002-05-27 21:36
那我怎么得到我自己的函数的地址呢?用函数名就行吗?
要用到汇编吗?谢谢各位的回答! |
|
5楼#
发布于:2002-05-27 23:27
不就是一个强制转换吗?
|
|
6楼#
发布于:2002-05-28 09:01
能否说的清楚一些,3x
|
|
7楼#
发布于:2002-05-28 09:31
比如:
ULONG funcAddr = ( ULONG )(你的函数名字); 然后你拿着这个ULONG想做什么就做什么阿,比如赋值给寄存器: __asm { mov eax, funcAddr; } 赋给内存: char * ptr = .... *(( ULONG * )ptr) = funcAddr; 编译器都不出错的。 |
|
8楼#
发布于:2002-05-28 09:35
在pe表里的export table里的地址都是rva呀,如果我想改变ndis.sys在内存中image的值,是不是也要算出我的函数地址与ndis.sys基址的rva呢?还是直接把我的函数的地址写到export table里面?
|
|
9楼#
发布于:2002-05-28 12:15
在pe表里的export table里的地址都是rva呀,如果我想改变ndis.sys在内存中image的值,是不是也要算出我的函数地址与ndis.sys基址的rva呢?还是直接把我的函数的地址写到export table里面?
-------------------------------------------------------------------- 你不是已经找到export table里的函数了吗?自己看看是不是rva,显然加载器会帮你搞定一切的。 |
|
10楼#
发布于:2002-05-28 12:35
你不是已经找到export table里的函数了吗?自己看看是不是rva,显然加载器会帮你搞定一切的。
-------------------------------------------------------------------- 就是说加载器载别的程序调用导出函数时会自动在该程序映像中加上你的base(相对ndis头),你用下面与句得到地址: func =PCHAR(Base)+functions[ord]; 自然写进去时减掉base。(your address - Base) |
|
11楼#
发布于:2002-05-28 12:43
第一种方法没什么好说的,第二种方法举个例子:
你的函数: __declspec(naked) PVOID MyGetThread() { _asm{ mov eax,DWORD[0ffdff124h] ret } } 截获: ........ UCHAR push[6]={0x68}; func=(PULONG)FindFunc(FindNtoskrnl(),\"KeGetCurrentThread\"); if(func!=NULL){ _asm cli addr=(ULONG)MyGetThread; memcpy((PUCHAR)func,push,1); memcpy((PUCHAR)func+1,(PUCHAR)&addr,4); _asm sti } //由于2000中KeGetCurrentThread函数第六字节就是C3(ret),我这儿没加,你得copy过去。我没用到原函数,你要用到的话得保存原来的值。 |
|
12楼#
发布于:2002-05-28 15:19
3x,pjf
用sofeice已经看到地址已经更改了,可是我又遇到了安装问题, 现在我是用osrloader来加载,但象这样的.sys一定要在系统启动的时候,在ndis之后,tcpip之前加载,用osrloader可以实现吗? 怎样才能把.sys安装上,让它在系统启动的时候启动? |
|
13楼#
发布于:2002-05-28 15:43
设置它的启动顺序与启动组等,各本书都有介绍,DDK文档更加详细,你还是自己翻翻吧。
|
|
14楼#
发布于:2002-05-28 15:52
你用的第一种方法吗?这样比你的驱动先加载的驱动由于加载器已处理过了导出函数(将地址写入该驱动映像),不再受你的影响。而后面的办法改动了ndis,不管它何时加载,只要调用函数就会进入你的程序。不过看你似乎想在tcpip调用函数前就钩挂好,还是得改启动顺序。
|
|
15楼#
发布于:2002-05-28 15:53
好的,我找找,3x
|
|
16楼#
发布于:2002-05-28 15:58
我使用的是第一种方法,我修改了ndis.sys的export table,但我想在系统启动时,在ndis.sys和tcpip之间加载我的.sys
|
|
17楼#
发布于:2002-05-28 18:51
如果成功了,再发个贴子哈.
|
|
|
18楼#
发布于:2002-05-29 09:17
为什么用softice看到的我写的函数的地址是0x68XXXXXX,而ndis.sys的基址是0xbfecXXXX,为什么我写的函数地址要小于ndis.sys的地址?
而且,pjf我用你写的方法: ULONG funcAddr = ( ULONG )(你的函数名字); 然后你拿着这个ULONG想做什么就做什么阿,比如赋值给寄存器: __asm { mov eax, funcAddr; } 赋给内存: char * ptr = .... *(( ULONG * )ptr) = funcAddr; 这样得到的funcAddr,用softice看是一个地址值,它指向的内存存放着我的函数的地址,我是这样写的: ULONG funcAddr=(ULONG)((char *)MyFunctionName - (char *)NdisBaseAddress) 然后*((ULONG *)ptr) = funcAddr,我用softice看了,ptr内存是改变了, 可是这样做好象不对,我再加载protocol的时候,会死机或者系统变的很慢,而且用softice没有拦截到中断,也就是说好象没有进到我自己的函数来。why? |
|
19楼#
发布于:2002-05-29 09:54
可能地址还有一个变换关系,看看PE文件的结构吧。
|
|
上一页
下一页