通过Hook NtOpenProcess 函数实现反调试

Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html

通过Hook NtOpenProcess 函数实现反调试

1. Hook思路设计

2. Hook NtOpenProcess函数

3. 效果演示

 

 

1. Hook思路设计

  我们在Hook一个函数时,其jmp到原来的地址,具体操作如下:

  其实在后期,我们将原函数的执行代码修改为回调函数,在回调函数内部来恢复原来函数即可。

  

 

 

2. Hook NtOpenProcess函数(代码2-5)

  现在我们Hook NtOpenProcess函数,实现进程保护,比如,OD、CE打开时,必须调用该函数来获取句柄,

  1)查看Hook的内容

    我们使用 windbg u nt!NtOpenProcess ,查看要hook的字节数,push 0x0c4h,正好五个字节,不用太多修改。

    

  2)过滤函数实现思路:

    ① 计算跳转地址:原函数地址 + 偏移 = 跳转函数地址,因此,很容易计算出 偏移 = 跳转函数地址-原函数地址。

    ② 备份原函数代码,pushad

    ③ 参数压栈

      这里是需要一定技巧的,pushad是压入八个寄存器,之后栈变化,因此我们要 push [esp,0x30] 连续四次

      

    ④ 在调用有关函数之后,判断函数正常返回还是直接跳转。

              call MyOpenProcess;
              cmp eax, 0; // 我处理成功了,其直接进行修改
              popad;
              jz __end;
              // 原来被替换的代码
              push  0x000000C4;
              jmp retOpenProcessAddr;
           __end:
              mov eax, 0;
              ret 0x10;    

  3)伪造NtOpenProcess函数

    我们通过进程ID来判断是否是需要保护的进程,如果是需要保护的进程并且不是自己和系统调用,则直接返回。

    

 

3. 测试效果

   我们以计算器为例,测试其效果如下,明显无法打开被调试进程。

  

 

posted @ 2020-04-09 07:39  OneTrainee  阅读(1209)  评论(0编辑  收藏  举报