Windows7下驱动开发与调试体系构建——5.实战反调试标记位(NtGlobalFlag)
《加密与解密》P670中,介绍了检查程序是否被调试的第二种方法:查看进程PEB的NtGlobalFlag标记。

首先打开我们的win7x64虚拟机和windbg,第四节中制作了一个主动产生Int3的驱动程序,这次恰好可以用到(也可以使用windbg的Ctrl-Break快捷键,不过这个快捷键在笔记本键盘上不一定能用)
写一个检查IsDebuggerPresent()的程序,代码如下
DebugSeeker.cpp
#include<cstdio>
#include<iostream>
#include <Windows.h> using namespace std; extern "C" BOOL _stdcall isGlobal(); /*
* 查看BeingDebugged标志位
*/
bool isDebug_1() {
return IsDebuggerPresent();
} /*
* 查看NtGlobalFlag标志位
*/
BOOL isDebug_2() {
return isGlobal();
} bool isDebug = 0;
void outputInfomation() {
if (isDebug) {
cout << "Debuging" << endl;
}
else {
cout << "no Debugger" << endl;
}
} int main() {
cout << "使用帮助:" << endl;
cout << "1:查看BeingDebugged标志位" << endl;
cout << "2:查看NtGlobalFlag标志位" << endl;
cout << "0:退出程序" << endl;
cout << "" << endl;
int testID; while (1) {
isDebug = 0;
cin >> testID;
switch (testID) {
case 1:
isDebug = isDebug_1();
outputInfomation();
continue;
case 2:
isDebug = isDebug_2();
outputInfomation();
continue;
case 0:
return 0;
default:continue;
}
}
return 0;
}
x64.asm
.CODE
isGlobal PROC
mov rax, gs:[60h]
mov rax, [rax+0bch]
cmp rax, 70h
je Yes
mov rax,0
ret
Yes:
mov rax,1
ret isGlobal ENDP
END
如果到这一步有问题,请查看前几节的教程。
在虚拟机中运行,并使用CE附加,发现无论是否有调试器,都显示无调试器。

这真是让人无法理解!为了强行理解,我们可以使用windbg强大的"结构体查看"功能。
先用上一节的驱动制造Int3。
查看进程:!process 0 0
找到我们自己做的程序,查看peb。

不难发现,BeingDebugged标记位的确正常。

查看进程PEB:dt _PEB 7fffffd3000

我们“惊喜”地发现,NtGlobalFlag根本没有被更改!
Windows7下驱动开发与调试体系构建——5.实战反调试标记位(NtGlobalFlag)的更多相关文章
- Windows7下驱动开发与调试体系构建——0.概述
本文集内容为windows7x64下驱动开发与调试体系构建,内容目录如下: 1.驱动开发的环境准备 2.R3与R0的通信示例 3.自建调试体系概述 4.在x64下使用汇编代码 5.实战反调试标记位(N ...
- Windows7下驱动开发与调试体系构建——2.R3与R0的通信示例
目录/参考资料:https://www.cnblogs.com/railgunRG/p/14412321.html 在阅读本节前,建议先阅读<Windows内核安全与驱动开发>第五章内容, ...
- Windows7下驱动开发与调试体系构建——3.调试体系概述
目录/参考资料:https://www.cnblogs.com/railgunRG/p/14412321.html 调试体系概述 0.什么是自建调试体系? 就是复写windows的调试api,使得调试 ...
- Windows7下驱动开发与调试体系构建——1.驱动开发的环境准备
目录/参考资料:https://www.cnblogs.com/railgunRG/p/14412321.html 系统基础环境 开发环境 win7下开发驱动需要安装vs,这里使用2017. 安装vs ...
- Windows7下驱动开发与调试体系构建——4.在x64下使用汇编代码(x86下的_asm)
目录/参考资料:https://www.cnblogs.com/railgunRG/p/14412321.html asm文件设置 在vs x64中无法使用_asm关键字,需要使用.asm文件. 按第 ...
- 2013-6-2 [转载自CSDN]如何入门Windows系统下驱动开发
[序言]很多人都对驱动开发有兴趣,但往往找不到正确的学习方式.当然这跟驱动开发的本土化资料少有关系.大多学的驱动开发资料都以英文为主,这样让很多驱动初学者很头疼.本人从事驱动开发时间不长也不短,大概 ...
- 如何正确入门Windows系统下驱动开发领域?
[作者]猪头三个人网站 :http://www.x86asm.com/ [序言]很多人都对驱动开发有兴趣,但往往找不到正确的学习方式.当然这跟驱动开发的本土化资料少有关系.大多学的驱动开发资料都以英文 ...
- Windows7下QT5开发环境搭建 分类: QT开发 2015-03-09 23:44 65人阅读 评论(0) 收藏
Windows7下QT开法环境常见搭配方法有两种. 第一种是:QT Creator+QT SDK: 第二种是:VS+qt-vs-addin+QT SDK: 以上两种均可,所需文件见QT社区,QT下载地 ...
- windows7内核驱动开发试验环境配置
首先配置环境参照这个: http://blog.csdn.net/qing666888/article/details/50858272 然后在win10里可能由于没有做测试签名因此一直没有成功加载驱 ...
随机推荐
- Luogu2251 质量检测 (ST表)
我怎么开始划水了... #include <iostream> #include <cstdio> #include <cstring> #include < ...
- postgresql使用group by进行数据去重-2022新项目
一.业务场景 数据去重是web开发中经常会遇到的方式之一,数据库操作中有一个关键字distinct主要就是用来做这件事,用来进行去重. 比如进行统计查询的时候,可以这样写 select count(d ...
- OID天下第一 (双指针,LCT,线段树)
题面 或曰:"笑长天下第一!",OID 喜得合不拢嘴:"哈哈哈哈哈哈--" OneInDark 是天下第一的. OneInDark 给了你一个 n n n 个点 ...
- ARC116 A Odd vs Even (质因数分解,结论)
题面 有 T T T 组数据,每次给出一个数 N N N ,问 N N N 的所有因数(包括 1 1 1 和 N N N)中奇因数个数和偶因数个数的关系(">"," ...
- Android序列化的几种实现方式
一.Serializable序列化 Serializable是java提供的一种序列化方式,其使用方式非常简单,只需要实现Serializable接口就可以实现序列化. public interfac ...
- 如何为 SAST 工具设置误报基准?
许多 SAST 工具都无法避免误报的问题.这些工具经常报告一些实际不存在的漏洞,这种不准确性让安全团队耗费大量时间来对误报进行分类和处理,这时设置误报基准就显得十分必要. 通过设置误报基准,安全团队可 ...
- MinIO分布式集群部署方式
文章转载自:https://blog.51cto.com/u_10950710/4843738 关于分布式集群MinIo 单机Minio服务存在单点故障,如果是一个有N块硬盘的分布式Minio,只要有 ...
- 阿里云下配置keepalive,利用HAVIP实现HA
注:这篇文章参考网络,有些称呼都变了,比如阿里云上的现在是弹性ip 包括阿里云在内的很多云环境,因为不支持浮动IP广受诟病.目前阿里云在VPC网络下发布了HAVIP,能够实现arp宣告IP.这样也就让 ...
- Redis可视化工具(支持ssh链接)
1.Redis Desktop Manager RedisDesktopManager,简称RDM,这是一款很出名的Redis可视化管理工具,支持Windows,Mac,Ipad,LInux 开源地址 ...
- 第三章:模版层 - 2:Django内置模板标签
Django内置标签总览 可以查询下表来总览Django的内置标签: 标签 说明 autoescape 自动转义开关 block 块引用 comment 注释 csrf_token CSRF令牌 cy ...