当前位置: 首页 > news >正文

软件反调试(3)- 基于父进程的检测

反调原理

如果进程是正常运行起来的,那么其父进程应该是 explorer.exe,否则可能处于被调试状态

该检查方式只能进行有限检查,如果进程是通过附加的方式来进行调试的话,那么父进程的检查方式就会失效

如下通过 procexp64 可以查看进程的父进程是哪一个,procexp64 是微软出品的 SysinternalsSuite 工具包中的一款工具

20250702193216

实现代码

#include <iostream>
#include <thread>
#include <string>
#include <vector>
#include <windows.h>
#include <TlHelp32.h>DWORD GetParentProcessId(DWORD nProcessId)
{HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);if (hSnapshot == INVALID_HANDLE_VALUE){return 0;}PROCESSENTRY32 pe32 = { 0 };pe32.dwSize = sizeof(PROCESSENTRY32);BOOL bRet = Process32First(hSnapshot, &pe32);while (bRet){if (pe32.th32ProcessID == nProcessId){CloseHandle(hSnapshot);return pe32.th32ParentProcessID;}bRet = Process32Next(hSnapshot, &pe32);}CloseHandle(hSnapshot);return 0;
}std::string GetProcessNameByProcessId(DWORD nProcessId)
{HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);if (hSnapshot == INVALID_HANDLE_VALUE){return std::string("");}PROCESSENTRY32 pe32 = { 0 };pe32.dwSize = sizeof(PROCESSENTRY32);BOOL bRet = Process32First(hSnapshot, &pe32);while (bRet){if (pe32.th32ProcessID == nProcessId){std::string processName = pe32.szExeFile;CloseHandle(hSnapshot);return processName;}bRet = Process32Next(hSnapshot, &pe32);}CloseHandle(hSnapshot);return std::string("");
}bool CheckParentProcess(const char* szProcessName)
{DWORD nProcessId = GetCurrentProcessId();DWORD nParentProcessId = GetParentProcessId(nProcessId);std::string processName = GetProcessNameByProcessId(nParentProcessId);std::cout << "parent:" << processName << std::endl;return (strstr(processName.c_str(), szProcessName) == NULL);
}void ThreadProc()
{while (true){if (CheckParentProcess("explorer")){std::cout << "Debugging..." << std::endl;}else{std::cout << "Running..." << std::endl;}std::this_thread::sleep_for(std::chrono::milliseconds(1000));}
}int main()
{std::thread thrd(ThreadProc);thrd.join();return 0;
}

逆向处理

基于该方式的逆向,只需要在程序运行起来后,再使用调试工具对其附加调试即可

http://www.dtcms.com/a/265284.html

相关文章:

  • Python 高光谱分析工具(PyHAT)
  • 【数字后端】- 什么是AOI、OAI cell?它们后面数字的含义
  • seaborn又一个扩展heatmapz
  • 利用tcp转发搭建私有云笔记
  • Java--多态--向上转型--动态绑定机制--断点调试--向下转型
  • IO进程线程 (进程)
  • 旋转不变子空间( ESPRIT) 算法
  • 算法笔记上机训练实战指南刷题
  • pytorch学习-9.多分类问题
  • WSL2 + Docker Desktop 环境中查看本地镜像
  • 基于SpringBoot的场地预定管理系统
  • Springboot开发常见注解一览
  • 记一次finallshell.exe打开无法应的处理
  • 【卡尔曼滤波第二期】一维无过程噪声的卡尔曼滤波
  • 红黑树:高效平衡的秘密
  • 声网支持弱网对抗保障直播不卡不花屏
  • Android Native 之 init初始化selinux机制
  • Beamer-LaTeX学习(教程批注版)【4】
  • (LangChain)RAG系统链路向量检索器之Retrievers(五)
  • 设计模式精讲 Day 23:访问者模式(Visitor Pattern)
  • Python 的内置函数 print
  • RT Thread Studio修改堆区大小的方法
  • Python 中 http.client 与 requests 的对比及适用场景
  • 数据结构20250620_数据结构考试
  • android核心技术摘要
  • 冲突检测美国服务器:原理剖析与实战解决方案
  • Zig 安装使用教程
  • HCIA-以太网链路聚合
  • Flask 安装使用教程
  • C#上位机串口接口