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. 测试效果
我们以计算器为例,测试其效果如下,明显无法打开被调试进程。