xemexzj
驱动牛犊
驱动牛犊
  • 注册日期2001-11-07
  • 最后登录2006-03-15
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
20楼#
发布于:2002-05-29 10:02
为什么用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?

 


比较简单的方法是将已得到的函数地址的前8字节改为:
mov eax, [your fun address]
jmp eax
8字节内容如下 0x058d + 4bytes函数地址 + 0xe0ff
在你的函数内再将原函数的8字节内容恢佛
只要你hook的函数不是被非常频繁的调用这种方法没问题
xeme
swift
驱动中牛
驱动中牛
  • 注册日期2001-07-26
  • 最后登录2007-05-09
  • 粉丝0
  • 关注0
  • 积分70分
  • 威望7点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
21楼#
发布于:2002-05-29 10:10
你说的好象与pjf说的有些出入哦!
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
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字节的区别
guard2002
驱动中牛
驱动中牛
  • 注册日期2002-05-21
  • 最后登录2017-03-07
  • 粉丝0
  • 关注0
  • 积分46分
  • 威望65点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
  • 社区居民
23楼#
发布于:2002-06-24 15:08
看的有点乱
ysy
ysy
驱动中牛
驱动中牛
  • 注册日期2002-02-18
  • 最后登录2008-08-25
  • 粉丝0
  • 关注0
  • 积分201分
  • 威望29点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
24楼#
发布于:2002-06-25 10:34
自己动手试试,就不乱了!:)
上一页 下一页
游客

返回顶部