反调试—1

IsDebuggerPresent()
CheckRemoteDebuggerPresent()

其内部实际调用NtQueryInformationProcess()

bool _stdcall ThreadCall()
{
	
	while (true)
	{
		BOOL  pbDebuggerPresent = FALSE;
		CheckRemoteDebuggerPresent(GetCurrentProcess(), &pbDebuggerPresent);
		if (pbDebuggerPresent !=0)
		{
			printf("debug\n");
			system("pause");
			exit(-1);
		}
		if (IsDebuggerPresent()!=0)
		{
			printf("debug\n");
			system("pause");
			exit(-1);
		}
	}
}

int main()
{
	CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)ThreadCall, NULL, 0, NULL);
	system("pause");
	return 0;
}

FS/GS寄存器

debug标志:

X86:FS:0x30

FS指向TEB,FS:30指向PEB,PEB+2指向debug标志。

X64:  GS:0x60

GS指向TEB,GS:60指向PEB,PEB+2指向debug标志。


NtGlobalFlag标志:

在PEB里面


—raedfsdword():
bool _stdcall ThreadCall()
{
	
	while (true)
	{
		//	DWORD dwPeb = __readfsdword(0x30);
		//	UCHAR BeingDebugged = *(UCHAR *)(dwPeb + 2);
		
		//	ULONGLONG ullPeb = __readgsqword(0x60);
		//	UCHAR BeingDebugged = *(UCHAR *)(ullPeb + 2);

		//	DWORD dwPeb = __readfsdword(0x30);
		//	DWORD NtGlobalFlag = *(DWORD *)(dwPeb + 0x68);
		//  if (NtGlobalFlag == 0x70) printf("debug");

		//	ULONGLONG dwPeb = __readgsqword(0x60);
		//	DWORD NtGlobalFlag = *(DWORD *)(dwPeb + 0xbc);
		//  if (NtGlobalFlag == 0x70) printf("debug");
	}
}

int main()
{
	CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)ThreadCall, NULL, 0, NULL);
	system("pause");
	return 0;
}

Heap标志:

bool _stdcall ThreadCall()
{
	
	while (true)
	{
		/*DWORD dwPeb = __readfsdword(0x30);
		DWORD ProcessHeap = *(DWORD*)(dwPeb + 0x18);
		DWORD dwFlags = *(DWORD*)(ProcessHeap + 0x40);
		DWORD dwForceFlags = *(DWORD*)(ProcessHeap + 0x44);
		if (dwFlags != 0x2 || dwForceFlags != 0)
		{
			printf("debug\n");
			system("pause");
			exit(0);
		}*/
		UINT64 dwPeb = __readgsqword(0x60);
		UINT64 ProcessHeap = *(PUINT64)(dwPeb + 0x30);
		DWORD dwFlags = *(DWORD*)(ProcessHeap + 0x70);
		DWORD dwForceFlags = *(DWORD*)(ProcessHeap + 0x74);
		if (dwFlags != 0x2 || dwForceFlags != 0)
		{
			printf("debug\n");
			system("pause");
			exit(0);
		}
	}
}

int main()
{
	CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)ThreadCall, NULL, 0, NULL);
	system("pause");
	return 0;
}

上面有些都是依靠api,如果对方挂钩了,api就失效,只有手动实现标志位检查

ZwQueryInformationProcess手动实现

拿PEB:
bool _stdcall ThreadCall()
{
	MyZwQueryInformationProcess Func = (MyZwQueryInformationProcess)GetProcAddress(GetModuleHandleA("ntdll.dll"), "ZwQueryInformationProcess");
	PROCESS_BASIC_INFORMATION pbi = { 0 };
	while (true)
	{
		Func(GetCurrentProcess(), ProcessBasicInformation, &pbi, sizeof(pbi), NULL);
		CHAR flag = *((PCHAR)(pbi.PebBaseAddress) + 2);
		if (flag == TRUE)
		{
			printf("debug\n");
			system("pause");
			exit(0);
		}
	}
}

int main()
{
	CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)ThreadCall, NULL, 0, NULL);
	system("pause");
	return 0;
}
调试端口:
bool _stdcall ThreadCall()
{
	MyZwQueryInformationProcess Func = (MyZwQueryInformationProcess)GetProcAddress(GetModuleHandleA("ntdll.dll"), "ZwQueryInformationProcess");
	DWORD isDebugPort = 0;
	while (true)
	{
		Func(GetCurrentProcess(), ProcessDebugPort, &isDebugPort, sizeof(isDebugPort), NULL);
		if (isDebugPort == TRUE)
		{
			printf("debug\n");
			system("pause");
			exit(0);
		}
	}
}

int main()
{
	CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)ThreadCall, NULL, 0, NULL);
	system("pause");
	return 0;
}
隐藏端口:
    DWORD isProcessDebugFlags = 0;
	func(GetCurrentProcess(), (PROCESSINFOCLASS)0x1F, &isProcessDebugFlags,             sizeof(isProcessDebugFlags), NULL);
	if (isProcessDebugFlags == 0)
	{
		printf("debug\n");
		system("pause");
		exit(0);
	}



DWORD isProcessDebugObjectHandle = 0;
	func(GetCurrentProcess(), (PROCESSINFOCLASS)0x1E, &isProcessDebugObjectHandle, sizeof(isProcessDebugObjectHandle), NULL);
	if (isProcessDebugObjectHandle != 0)
	{
		printf("debug\n");
		system("pause");
		exit(0);
	}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/887111.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode: 0011-0020题速览

Leetcode: 0011-0020题速览 本文材料来自于LeetCode solutions in any programming language | 多种编程语言实现 LeetCode、《剑指 Offer(第 2 版)》、《程序员面试金典(第 6 版)》题解 遵从开源协议为知识共享 版权归属-相同方式…

【持续更新中】MMDetection3训练自己的数据集常见报错解决

博主近来跑自己数据集需要对比试验,故选择了MMDetection3这一算法整合详细的框架,遇到了较多问题在此处留作记录,若你也有相应的问题可以在评论区提出与解决方法。会持续更新,同时欢迎批评指正。 0.ModuleNotFoundError: No modu…

微信小程序hbuilderx+uniapp+Android 新农村综合风貌旅游展示平台

目录 项目介绍支持以下技术栈:具体实现截图HBuilderXuniappmysql数据库与主流编程语言java类核心代码部分展示登录的业务流程的顺序是:数据库设计性能分析操作可行性技术可行性系统安全性数据完整性软件测试详细视频演示源码获取方式 项目介绍 小程序端…

索尼MDR-M1:超宽频的音频盛宴,打造沉浸式音乐体验

在音乐的世界里,每一次技术的突破都意味着全新的听觉体验。 索尼,作为音频技术的先锋,再次以其最新力作——MDR-M1封闭式监听耳机,引领了音乐界的新潮流。 这款耳机以其超宽频播放和卓越的隔音性能,为音乐爱好者和专…

多模态—图文匹配

可能最近大家已经发现了chatgpt可以根据自己的描述生成图片,其实这就是一个图文匹配的问题,可以理解为这是一个多模态的问题。 在模型训练时我们需要N个图片和N个文本对进行训练,文本通过text encoder形成文本语义向量,text enco…

【Python】Streamlit:为数据科学与机器学习打造的简易应用框架

Streamlit 是一个开源的 Python 库,专为数据科学家和机器学习开发者设计,旨在快速构建数据应用。通过简单的 Python 脚本,开发者无需掌握前端技术,即可将数据分析和模型结果转化为直观、交互式的 Web 应用。其简洁的 API 设计使得…

NVIDIA NVLink-C2C

NVIDIA NVLink-C2C 文章目录 前言一、介绍1. 用于定制芯片集成的超快芯片互连技术2. 构建半定制芯片设计3. 使用 NVLink-C2C 技术的产品 二、NVLink-C2C 技术优势1. 高带宽2. 低延迟3. 低功率和高密度4. 行业标准协议 前言 将 NVLink 扩展至芯片级集成 一、介绍 1. 用于定制芯…

软件设计师——数据结构

本博文所有内容来自于B站up主zst_2001 目录 时间复杂度 常规数据结构 链表 栈与队列 ​编辑 串 数组 树 卡特兰数: 平衡二叉树 哈夫曼 图 AOV 排序 顺序 折半 哈希 时间复杂度 常规数据结构 链表 栈与队列 串 找i位置前面的字符串&#xff0c…

Koa2+mongodb项目实战1(项目搭建)

前言 在正式开始之前,需要先知道用到的东西: koa:Koa 是一个基于 Node.js 的 Web 应用框架,非常适合开发API服务,可以与前端框架(如 Vue.js、React.js)结合使用,实现前后端分离的开…

【HTTP(3)】(状态码,https)

【认识状态码】 状态码最重要的目的,就是反馈给浏览器:这次请求是否成功,若失败,则出现失败原因 常见状态码: 200:OK,表示成功 404:Not Found,浏览器访问的资源在服务器上没有找到 403:Forbidden,访问被…

使用 Light Chaser 进行大屏数据可视化

引言 在当今数据驱动的世界中,数据可视化变得越来越重要。Light Chaser 是一款基于 React 技术栈的大屏数据可视化设计工具,通过简单的拖拽操作,你可以快速生成漂亮、美观的数据可视化大屏和看板。本文将介绍如何使用 Light Chaser 进行数据…

10款好用的开源 HarmonyOS 工具库

大家好,我是 V 哥,今天给大家分享10款好用的 HarmonyOS的工具库,在开发鸿蒙应用时可以用下,好用的工具可以简化代码,让你写出优雅的应用来。废话不多说,马上开整。 1. efTool efTool是一个功能丰富且易用…

【unity进阶知识6】Resources的使用,如何封装一个Resources资源管理器

文章目录 一、Unity资源加载的几种方式1、Inspector窗口拖拽2、Resources3、AssetBundle4、Addressables(可寻址资源系统)5、AssetDatabase 二、准备三、同步加载Resources资源1、Resources.Load同步加载单个资源1.1、基本加载1.2、加载指定类型的资源1.…

漆包线称重系统/自动称重/项目合作

万界星空科技漆包线行业称重系统实现自动称重的方式主要依赖于现代数字电子称重技术、计算机网络技术以及相关的软件系统的集成。以下是对该系统如何实现自动称重的详细解释: 一、硬件基础 称重设备: 系统采用高精度的电子秤作为称重设备,这…

Meta推出Movie Gen 旗下迄今最先进的视频生成AI模型

Meta 今天发布了 MovieGen 系列媒体基础AI模型,该模型可根据文本提示生成带声音的逼真视频。 MovieGen 系列包括两个主要模型: MovieGen Video 和 MovieGen Audio。 MovieGen Video 是一个具有 300 亿个参数的变换器模型,可根据单个文本提示生…

方法重载(Overload)

前言 在前面的学习中,我们学到了重写(Override),这里我们主要进行重载(Overload)的介绍,同时对重写和重载的区别进行分析。 1. 重载(Overload) #方法重载 在同一个类中定义多个同名但参数不同的方法。我们称方法与方法之间构成方法重载 在Java中&…

【linux进程】进程优先级命令行参数环境变量

目录 一,进程切换二,进程优先级1. 什么是优先级2. 权限 vs 优先级3. 为什么要有优先级4. 优先级的查看方式 三,命令行参数1. 什么是命令行参数2. 为什么要有命令行参数3. 是谁做的 四,环境变量1. 基本概念2. 常见环境变量3. 查看环…

针对线上消息积压的排查思路以及解决方案

一、背景 我们在日常工作中,经常会碰到线上告警,消息队列消息积压了,试想如果对消息的消费速率有要求的场景,消息积压一定会或多或少对自己本身的业务场景有影响,这里就针对消息积压的场景,谈谈具体的排查…

15分钟学 Python 第37天 :Python 爬虫入门(三)

Day 37 : Python爬虫入门大纲 章节1:Python爬虫概述 1.1 什么是爬虫? 网页爬虫(Web Crawler)是一种自动访问互联网上网页并提取数据的程序。爬虫的作用包括搜索引擎索引内容、市场调查、数据分析等。 1.2 爬虫的工作原理 发起…

Vue中使用ECharts实现热力图的详细教程

在数据可视化领域,热力图是一种非常直观的表现形式,它通过颜色深浅来展示数据分布情况。在Vue项目中,我们可以使用ECharts这一强大的图表库来实现热力图。下面我将详细介绍如何在Vue中使用ECharts实现热力图。效果如下图: 一、准备…