zoukankan      html  css  js  c++  java
  • 通过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. 测试效果

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

      

  • 相关阅读:
    函数之返回值
    函数之初识函数
    三元运算符
    枚举enumerate
    模块
    迭代器
    斐波那契
    leetcode155 最小栈
    leetcode94 二叉树的中序遍历
    leetcode20 有效的括号
  • 原文地址:https://www.cnblogs.com/onetrainee/p/12664330.html
Copyright © 2011-2022 走看看