20楼#
发布于:2002-05-29 10:02
为什么用softice看到的我写的函数的地址是0x68XXXXXX,而ndis.sys的基址是0xbfecXXXX,为什么我写的函数地址要小于ndis.sys的地址? 比较简单的方法是将已得到的函数地址的前8字节改为: mov eax, [your fun address] jmp eax 8字节内容如下 0x058d + 4bytes函数地址 + 0xe0ff 在你的函数内再将原函数的8字节内容恢佛 只要你hook的函数不是被非常频繁的调用这种方法没问题 |
|
|
21楼#
发布于:2002-05-29 10:10
你说的好象与pjf说的有些出入哦!
|
|
22楼#
发布于:2002-05-29 13:05
为什么用softice看到的我写的函数的地址是0x68XXXXXX,而ndis.sys的基址是0xbfecXXXX,为什么我写的函数地址要小于ndis.sys的地址?
------------------------------------------------------------------ 你写的函数的地址是0x68XXXXXX???在用户内存区?呵呵,肯定搞错了。事实上你的驱动加载地址一般在0xF*******。 ------------------------------------------------------------------------- 而且,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? ------------------------------------------------------------------ 你修改的export table?我以前用的是我说的方法二,确保可行。至于改export table我有空确认了再说。 你把这段程序运行一下看看: __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 } 你钩挂你的程序仅需做小改动:push[6]={0x68,0,0,0,0,0xc3}、memcpy((PUCHAR)func,push,6); 之前保存一下系统函数原来的值:memcpy(backup,(PUCHAR)func,6);等等。 若你要调原来的函数,先copy回保存的6字节,再call func地址: mov eax,func call func 返回后又改过来。 ---------------------------------------------------------------------- 好象与pjf说的有些出入哦! ----------------------------------------------------------------- 一样的,6字节与8字节的区别 |
|
23楼#
发布于:2002-06-24 15:08
看的有点乱
|
|
24楼#
发布于:2002-06-25 10:34
自己动手试试,就不乱了!:)
|
|
上一页
下一页