首页
社区
课程
招聘
SSDT Hook为什么还要在自己的函数中调用原函数?
发表于: 2011-1-19 17:21 7370

SSDT Hook为什么还要在自己的函数中调用原函数?

2011-1-19 17:21
7370
小弟刚学驱动没多久,最近在看别人的SSDT HooK的时候看到别人在自己实现的Hook函数中还要调用原函数,这是为什么啊?

比如下面的一段代码:

NTSTATUS MyZwQuerySystemInformation(
    IN ULONG SystemInformationClass,
    IN PVOID SystemInformation,
    IN ULONG SystemInformationLength,
    OUT PULONG ReturnLength)  //定义自己的Hook函数
{
  NTSTATUS rc;

  UNICODE_STRING process_name;
  RtlInitUnicodeString(&process_name, L"taskmgr.exe");//改成自己要隐藏的进程名

rc = (OldZwQuerySystemInformation) (
    SystemInformationClass,
    SystemInformation,
    SystemInformationLength,
    ReturnLength);

  
  if(NT_SUCCESS(rc))
  {
    if(5 == SystemInformationClass)
    {
      struct _SYSTEM_PROCESSES *curr = (struct _SYSTEM_PROCESSES *)SystemInformation;
      struct _SYSTEM_PROCESSES *prev = NULL;
      if(curr->NextEntryDelta)((char *)curr += curr->NextEntryDelta);
.........
.........

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 267
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
挂钩函数是为了过滤调用,对于关注的调用就做处理,对于那些不关心的调用不作处理直接调用原来的函数.
或者是要隐藏什么信息,就需得通过调用原来的函数获得真实信息,然后把要把结果做处理之后再返回.
2011-1-19 17:32
0
雪    币: 596
活跃值: (449)
能力值: ( LV12,RANK:320 )
在线值:
发帖
回帖
粉丝
3
NB的话把原函数自己实现了,就不用调用原函数了
2011-1-19 19:01
0
雪    币: 2373
活跃值: (2285)
能力值: (RANK:400 )
在线值:
发帖
回帖
粉丝
4
晕,有没有看上面的代码啊?
上面的代码是没有在完成自己功能的时候刚开始就调用了原函数
2011-1-21 12:56
0
雪    币: 267
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
就是要对真实的信息进行处理(隐藏,修改等),所以才会先调用原函数获取真实的信息,然后做处理之后再返回.
2011-1-21 13:51
0
雪    币: 267
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
有那么一点点怀疑楼主的理解能力,及对过滤这个概念的认识...
2011-1-21 13:56
0
雪    币: 6082
活跃值: (794)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
7
看到我自己发的代码部分。。

RtlInitUnicodeString(&process_name, L"taskmgr.exe");//改成自己要隐藏的进程名------------呵呵 我那进程保护的驱动。。

调用原函数是为了
1 拦截函数改变了原来的地址 所以要事先保存地址。
2 拦截函数需要接受原先传递的参数和返回应该返回的参数。这个需要自己去实现,所以必须要写一个函数跟原先的函数结构一样但是增加了自己规则体系的函数,这个就是所谓的过滤。
主要是2的缘故。。
比如原先是 a函数
要接受 3个参数  a1 a2 a3
返回两个参数 b1 b2
这个函数被你拦截了就意味着调到你的函数空间了 汇编里面就是 jmp xxxxx
这个时候 如果你不接受 3个参数 输出两个参数(当然参数要跟系统原先定义的一样)
那么系统就会出错 崩溃,或者死机。
这个时候你必须写一个一模一样的函数
a'函数
要接受 3个参数  a1 a2 a3
返回两个参数 b1 b2
a'函数里面主要是 进行条件判断等
这样返回的参数本来比如说是 b1 b2的就被修改为 b1' b2'(这里的返回参数是根据a'函数过程来的)
也就是实现了 hook的目的。
至于原先的a函数呢在a'里面也是返回过去的

例如下面这个 函数  这个函数 可以在msdn里面找到 输入和输出的 参数 。我们写的函数是 a'

NTSTATUS ZwOpenProcessHook(PHANDLE ProcessHandle,ACCESS_MASK DesiredAccess,POBJECT_ATTRIBUTES ObjectAttributes,PCLIENT_ID ClientId)//我们自己的//NtZwOpenProcess   ---------------------a'函数 带所有参数
{   
  PEPROCESS process;  //接受通过ProcessHandle返回的进程   
  NTSTATUS status;   
   CHAR *pName;        //接受进程的进程名
   HANDLE  hID;
   ULONG dwProcessId = NULL;
  PEPROCESS EProcessToOpen;------------定义参数
      

       status = PsLookupProcessByProcessId(
          ClientId->UniqueProcess,
          &process
           );
      
  if(!NT_SUCCESS(status))   
     return(ZwOpenProcessReal(ProcessHandle,DesiredAccess,ObjectAttributes,ClientId));
  

     pName = (CHAR*)PsGetProcessImageFileName(process); //获取进程名  
   

   if(IsProtect(pName)) //判断是否是我们要保护的进程,是则返回权限不足,否则调用原函数结束进程   
    {   
        if(process != PsGetCurrentProcess())   
        {   
            
      hID = PsGetProcessId(process);//获得进程id
      KdPrint(("Protection Pid: %d\n"), hID);
    return STATUS_ACCESS_DENIED; --------------------当符合条件时  返回参数被改变了 本来是返回数据的   结果符合条件时 返回STATUS_ACCESS_DENIED  
        }   
   }  ---------------------------------判断部分
  
      
   return(ZwOpenProcessReal(ProcessHandle,DesiredAccess,ObjectAttributes,ClientId));  -------------------------返回到原先的a  函数  
}
2011-1-23 18:08
0
雪    币: 6082
活跃值: (794)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
8
发出问题也不回复。。诶
2011-1-24 21:45
0
雪    币: 6082
活跃值: (794)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
9
再也不发这些东西了。发了也没人看。
2011-1-27 13:50
0
雪    币: 2373
活跃值: (2285)
能力值: (RANK:400 )
在线值:
发帖
回帖
粉丝
10
兄弟您辛苦了,呵呵.前段时间发了问题,后来问题解决了就忘记了.
谢谢兄弟您的热心回复.
2011-3-16 17:00
0
雪    币: 2373
活跃值: (2285)
能力值: (RANK:400 )
在线值:
发帖
回帖
粉丝
11
现在理解了,谢了,兄弟.嘿嘿.
2011-3-16 17:02
0
游客
登录 | 注册 方可回帖
返回
//