首页 > 系统相关 >逆向 | 简单调试器检测&调试器进程检测、虚拟机进程检测、启动路径检测、计算机名检测

逆向 | 简单调试器检测&调试器进程检测、虚拟机进程检测、启动路径检测、计算机名检测

时间:2023-08-21 20:35:46浏览次数:46  
标签:strstr int 检测 cmdline printf 进程 调试器

逆向 | 简单调试器进程检测、虚拟机进程检测、启动路径检测、计算机名检测

写在自己书里的代码,丢一份到blog。

简单调试器检测:

#include <stdio.h>
#include <windows.h>
// 定义枚举值
const int ProcessDebugPort = 0x7;
const int ProcessDebugObjectHandle = 0x1e;
const int ProcessDebugFlags = 0x1f;
#define PROCESSINFOCLASS INT
typedef VOID (_stdcall *PFN_NTQUERYINFORMATIONPROCESS)(HANDLE,PROCESSINFOCLASS,PVOID,ULONG,PULONG);
int main(){
	// 获取动态链接库中的NtQueryInformationProcess函数
	HMODULE hModule = LoadLibrary("ntdll.dll");
	PFN_NTQUERYINFORMATIONPROCESS NtQueryInformationProcess = 
		(PFN_NTQUERYINFORMATIONPROCESS)GetProcAddress(hModule, "NtQueryInformationProcess");
	// 查询ProcessDebugPort值
	DWORD dwDebugPort = 0;
	NtQueryInformationProcess(
		GetCurrentProcess(),
		ProcessDebugPort,
		&dwDebugPort,
		sizeof(dwDebugPort),
		NULL
	);
	printf("DebugPort: %d \n", dwDebugPort);    // 如果有调试器存在则值不为0,通常为-1
	// 查询ProcessDebugObjectHandle
	HANDLE hDebugObject = NULL;
	NtQueryInformationProcess(
		GetCurrentProcess(),
		ProcessDebugObjectHandle,
		&hDebugObject,
		sizeof(hDebugObject),
		NULL
	);
	printf("hDebugObject: %d \n", hDebugObject);    // 如果有调试器存在则值不为0, 会返回一个句柄
	// 查询ProcessDebugFlags
	BOOL bDebugFlag = TRUE;
	NtQueryInformationProcess(
		GetCurrentProcess(),
		ProcessDebugObjectHandle,
		&bDebugFlag,
		sizeof(bDebugFlag),
		NULL
	);
	printf("bDebugFlag: %d \n", bDebugFlag);    // 如果没有调试器存在则为1
	return 0;
}

调试器进程检测、虚拟机进程检测、启动路径检测、计算机名检测:

#include <stdio.h>
#include <windows.h>
#include <tlhelp32.h>
DWORD GetPid(char* szName){
    HANDLE hprocessSnap = NULL;
    PROCESSENTRY32 pe32 = {0};
    hprocessSnap = CreateToolhelp32Snapshot(
        TH32CS_SNAPPROCESS,
        0);//捕捉所有进程的快照
    if (hprocessSnap == INVALID_HANDLE_VALUE){
        //快照失败
        return 0;
    }
    //初始化pe32结构体
    pe32.dwSize = sizeof(PROCESSENTRY32);
    if (Process32First(hprocessSnap, &pe32)){
        do{
            if (!strcmp(szName, pe32.szExeFile)){
                return (int)pe32.th32ProcessID;
            }
            //遍历查找进程名
        }while (Process32Next(hprocessSnap, &pe32));
    }else{
        CloseHandle(hprocessSnap);
    }
    return 0;
}
int main(){
	// 检测调试器进程、虚拟机软件进程
	char* DebuggerProcessNames[] = {
		"x32dbg.exe",
		"x64dbg.exe",
		"ollydbg.exe",
		"VMWareTray.exe",
		"VMWareUser.exe",   // ...
	};
	int len = sizeof(DebuggerProcessNames)/sizeof(char*);
	for (int i = 0; i < len; i ++){
		if (GetPid(DebuggerProcessNames[i]) != 0){   // 检测相关进程是否存在
			printf("stop debug! \n");
			exit(-1);
		}
	}
	// 检测运行路径
	char* cmdline = GetCommandLine();
	int tmp = NULL;
	tmp = (int)strstr(cmdline, "test") | 
		(int)strstr(cmdline, "TEST") | 
		(int)strstr(cmdline, "debug") | 
		(int)strstr(cmdline, "DEBUG") | 
		(int)strstr(cmdline, "analysis") |
		(int)strstr(cmdline, "ANALYSIS");
	if (tmp != 0){
		printf("stop debug! \n");
		exit(-1);
	}
	// 检测计算机名
	char name[255] = {0};
	ULONG size = sizeof(name);
	GetComputerName(name, &size);
	// printf("[%d] %s \n", size, name);
	tmp = (int)strstr(cmdline, "test") | 
		(int)strstr(cmdline, "TEST") | 
		(int)strstr(cmdline, "debug") | 
		(int)strstr(cmdline, "DEBUG") | 
		(int)strstr(cmdline, "analysis") |
		(int)strstr(cmdline, "ANALYSIS");
	if (tmp != 0){
		printf("stop debug! \n");
		exit(-1);
	}	
	printf("ok! \n");
	return 0;
}

标签:strstr,int,检测,cmdline,printf,进程,调试器
From: https://www.cnblogs.com/Mz1-rc/p/17647009.html

相关文章

  • 12.进程控制
    12.进程控制1.学习目标了解进程相关的概念掌握fork/getpid/getppid函数的使用熟练掌握ps/kill命令的使用熟练掌握execl/execlp函数的使用说出什么是孤儿进程什么是僵尸进程熟练掌握wait函数的使用熟练掌握waitpid函数的使用2.进程相关概念2.1程序和进......
  • 狗狗求职记:AI 面试、人类辅助,美研究所利用 628 只拉布拉多数据,提升嗅觉检测犬选拔效率
    内容一览:犬类嗅觉灵敏,是执行困难任务的得力助手。然而,工作犬选拔需要经过严格的筛选和训练,淘汰率极高。利用监督式机器学习和任务数据,可以用来预测人类工作表现,然而,目前尚未发现类似的犬类研究。关键词:工作犬  监督式机器学习  随机森林本文首发于HyperAI超神经微信公众平......
  • 液位检测的方法有哪些
    液位检测是在生活中常见的一项任务,多用于检测小家电设备缺液提醒,那么液位检测的方法有哪些呢,今天能点科技带大家了解一下,液位检测的方法有多种,其中常用的包括以下几种:光电液位传感器:光电液位传感器通过发射红外光并接收反射光的方式来检测液位的变化。当液位高于或低于设定的阈值时......
  • php 如何实现检测nginx配置的正确性
    在Web服务器的搭建过程中,Nginx是一款非常流行的开源软件,它能够快速、高效地处理HTTP请求。为了保证Nginx服务器的稳定性和安全性,我们需要定期检测Nginx配置文件的正确性,以便及时发现并解决问题。本文将介绍如何使用PHP实现检测nginx配置的正确性。安装php-fpm首先需要安装php-fpm,它......
  • 《操作系统》---进程管理
    操作系统概述作用特征并发性共享性虚拟性不确定性功能进程管理存储管理文件管理设备管理作业管理分类计算机启动的基本流程BIOS主引导记录操作系统进程的组成和状态组成PCB程序控制块程序描述程序要做什么数据三态运行就绪只缺CP......
  • 【pytorch】目标检测:一文搞懂如何利用kaggle训练yolov5模型
    笔者的运行环境:python3.8+pytorch2.0.1+pycharm+kaggle。yolov5对python和pytorch版本是有要求的,python>=3.8,pytorch>=1.6。yolov5共有5种类型n\s\l\m\x,参数量依次递增,对训练设备的要求也是递增。本文以yolov5_6s为切入点,探究yolov5如何在实战种运用。1.数据集的准备roboflow......
  • VMware vSphere虚拟机挂起迁移保持进程状态
    开发/测试环境:172.16.3.133,上面跑了很多个组件和43个tomcat应用。Esxi主机:172.16.12.115(上面虚拟机:172.16.3.133)Esxi主机:172.16.12.111(把172.16.3.133迁移到这台机上)测试目的:在虚拟机挂起的时候,把虚拟机迁移到其他esxi主机上,保存好服务的状态,无需重新所有的应用和组件,提高效率。 1......
  • Three.js中实现碰撞检测
    1.引言碰撞检测是三维场景中常见的需求,Three.js是常用的前端三维JavaScript库,本文就如何在Three.js中进行碰撞检测进行记述主要使用到的方法有:射线法Raycaster包围盒boundingbox物理引擎Cannon.js2.RaycasterRaycaster用于进行raycasting(光线投射),光线投射用于进行鼠......
  • python进程池的阻塞和非阻塞
    进程池概念:当需要上百上千个目标时,手动创建进程工作量大,此时就可以用到multiprocessing模块中提供的pool方法。初始化pool时,可以指定一个最大的进程数,当有新的请求提交到pool中时,如果pool还没有满,那么就会创造一个新的进程用于执行该请求。如果pool中的进程数满了,那么就需要等......
  • 进程和线程说明
     进程和线程说明1、进程是程序在操作系统中的一次执行过程,是系统进行资源分配和调度的基本单位2、线程是进程的一个执行实例,是程序执行的最小单元,他是比进程更小的能独立运行的基本单位3、一个进程可以创建和销毁多个线程,同一个进程中的多个线程可以并发执行4、一个程序至少有一......