吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 8233|回复: 10
收起左侧

[C&C++ 转载] Anti-Debug之父进程检测以及根据进程名检测

  [复制链接]
JoyChou 发表于 2013-4-24 10:05
1、根据进程名:
[C++] 纯文本查看 复制代码
#include <windows.h>
#include <tchar.h>
#include <TlHelp32.h>
                     
BOOL EnumProcessName();
int WINAPI WinMain( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in LPSTR lpCmdLine, __in int nShowCmd )
{
    if (EnumProcessName())
    {
        MessageBox(NULL, _T("检测到OD"), _T("结果"), MB_OK);
    }
    else
    {
        MessageBox(NULL, _T("没有检测到OD"), _T("结果"), MB_OK);
    }
    return 0;
}
                     
BOOL EnumProcessName()
{
    TCHAR szOLLYDBG[] = _T("OLLYDBG.EXE");  //要检测的OD进程名
    TCHAR sz52[] = _T("吾爱破解.EXE");
    TCHAR szICey[] = _T("ICEYOD.EXE");
    TCHAR szODICE[] = _T("OLLYICE.EXE");
    TCHAR szWINDBG[] = _T("WINGUARD.EXE");
    PROCESSENTRY32 pe;
    pe.dwSize = sizeof(PROCESSENTRY32);
                     
    HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (INVALID_HANDLE_VALUE == hSnap)
    {
        MessageBox(NULL, _T("创建进程失败"), _T("错误"), MB_ICONERROR);
        return FALSE;
    }
    if (Process32First(hSnap, &pe))
    {
        do
        {
            if (lstrcmpi(szOLLYDBG, pe.szExeFile) == 0 || 
                lstrcmpi(sz52, pe.szExeFile) == 0||
                lstrcmpi(szICey, pe.szExeFile) == 0 ||
                lstrcmpi(szODICE, pe.szExeFile) == 0||
                lstrcmpi(szWINDBG, pe.szExeFile) == 0)
            {
                return TRUE;
            }
        } while (Process32Next(hSnap, &pe));
    }
      CloseHandle(hSnap);
    return FALSE; //其余都返回FALSE
}

缺点:过检测方法简单,现在已经没有实际意义了。


2、父进程检测
原理:
当程序处于未被调试状态时,父进程一般是explorer.exe
一旦程序被调试了,父进程就是调试器的进程
很多OD对父进程检测做了处理,我们检测的时候使用原版的1.xOD就OK了
吾爱OD测试通过
[C++] 纯文本查看 复制代码
#include <windows.h>
#include <TlHelp32.h>
#include <tchar.h>
    
BOOL DetectParentProcess();
    
int WINAPI WinMain( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in LPSTR lpCmdLine, __in int nShowCmd )
{
    if (DetectParentProcess())
    {
        MessageBox(NULL, _T("检测到调试器"), _T("结果"), 0);
    }
    else
    {
        MessageBox(NULL, _T("没有检测到调试器"), _T("结果"), 0);
    }
    return 0;
}
BOOL DetectParentProcess()
{
    BOOL bResult = FALSE;
    TCHAR szCurrentAndParentIdAndExplorerId[MAX_PATH] = {0};//定义当前程序ID、它的父窗口及桌面进程ID
    
    HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    PROCESSENTRY32 pe;
    pe.dwSize = sizeof(PROCESSENTRY32);
    
    DWORD dwExplorerId; 
    //获取explorer.exe进程的ID,桌面进程的类名是"Progman"
    //注意返回的进程ID是在GetWindowThreadProcessId函数的第二个参数
    //GetWindowThreadProcessId函数返回的是创建explorer.exe线程的句柄
    GetWindowThreadProcessId(FindWindow(_T("Progman"), NULL), &dwExplorerId);
    
    Process32First(hSnap, &pe);
    do
    {
        if (GetCurrentProcessId() == pe.th32ProcessID)  //遍历到当前进程
        {
            //当前进程的父进程ID如果不是explorer.exe进程的ID号,一般表示被调试了
            if (dwExplorerId != pe.th32ParentProcessID)
            {
                bResult = TRUE;
            }
        }
    
    } while (Process32Next(hSnap, &pe));
    
    wsprintf(szCurrentAndParentIdAndExplorerId, _T("当前ID:%u,父进程ID:%u,桌面进程ID:%u"), 
        GetCurrentProcessId(), 
        pe.th32ParentProcessID,
        dwExplorerId);
    
    MessageBox(NULL, szCurrentAndParentIdAndExplorerId, _T("结果"), 0);
    
    return bResult;
    CloseHandle(hSnap);
    
    return FALSE;
}


或者

[C++] 纯文本查看 复制代码
#include <windows.h>
#include <tlhelp32.h>
#include <psapi.h> 
#pragma comment(lib, "psapi") 
  
BOOL IsInDebugger();
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{    
        
    if( IsInDebugger() )
        MessageBox(NULL,TEXT ("u are debugging me !"),TEXT ("OK"),MB_ICONEXCLAMATION);
    else
        MessageBox(NULL,TEXT ("not debugged!"),TEXT ("OK"),MB_ICONEXCLAMATION);
    return 0;
}
  
//////////////////////////////////////////////////////////////////////
  
BOOL IsInDebugger()
{
  
  
char Expchar[] ="\\EXPLORER.EXE";
char szBuffer[MAX_PATH]={0};
char FileName[MAX_PATH]={0}; 
PROCESSENTRY32 pe32   = {0};
  
  
  
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); //得到所有进程的列表快照
  
if (hProcessSnap == INVALID_HANDLE_VALUE)  
    return FALSE;          
  
pe32.dwSize = sizeof(PROCESSENTRY32);
  
  
if (!Process32First(hProcessSnap, &pe32))  // 查找进程
{
    CloseHandle (hProcessSnap);
    return FALSE; 
}
  
do // 遍历所有进程
{
  
  
if(pe32.th32ProcessID==GetCurrentProcessId() )//判断是否是自己的进程?即查看是否遍历到当前程序的进程
    {
  
        HANDLE hProcess = OpenProcess (PROCESS_ALL_ACCESS, FALSE, pe32.th32ParentProcessID); //打开父进程
          
        if (hProcess) 
         { 
             if (GetModuleFileNameEx(hProcess, NULL, FileName,  MAX_PATH) ) // 得到父进程名 没被调试一般为Explorer.EXE
              { 
                GetWindowsDirectory(szBuffer,MAX_PATH); //得到系统所在目录  "C:\Windows"
                strcat(szBuffer,Expchar);            //组合成类似的字串C:\Windows\Explorer.EXE
                if(strcmpi (FileName,szBuffer))  // 比较当前是否为Explorer.EXE进程,不区分大小写(strcmpi)
                   return TRUE;   // 父进程若不是Explorer.EXE,则是调试器
             } 
             else
             { 
                return FALSE; // 无法获得进程名
                  
              } 
            CloseHandle (hProcess); 
        } 
         else
         { 
              return FALSE;//无权访问该进程 
         } 
  
    }
  
  
}
while (Process32Next(hProcessSnap, &pe32));
  
CloseHandle (hProcessSnap);
return FALSE; 
  
}
  
  
//总结:程序思路就是遍历所有进程,当遍历到当前程序的进程时,得到他的父进程,再和C:\windows\EXPLORER.exe不区分大小写比较,
//如果相等则表示没有被调试,如果不相等表示被调试
//如果用VCdebug下ctrl+f5运行,也会显示被调试,原因是debug是调试版本,在VC下运行,父进程是VC的进程

免费评分

参与人数 2威望 +1 热心值 +2 收起 理由
淡然出尘 + 1 看不懂 但是知道厉害哈..
willJ + 1 + 1 欢迎分析讨论交流,[吾爱破解论坛]有你更精.

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

willJ 发表于 2013-4-24 10:10
推荐一个资料,《脱壳的艺术》,可以下载电子版看看,里面罗列了常见的反调试技术
wgz001 发表于 2013-4-24 10:24
 楼主| JoyChou 发表于 2013-4-24 12:47
willJ 发表于 2013-4-24 10:10
推荐一个资料,《脱壳的艺术》,可以下载电子版看看,里面罗列了常见的反调试技术

谢谢J大。
 楼主| JoyChou 发表于 2013-4-24 12:48
wgz001 发表于 2013-4-24 10:24
看完了  不懂啊

大神勿调戏啊
2314902431 发表于 2013-4-24 21:35
不错,来给你点人气哈!支持
19nuclear91 发表于 2013-4-24 22:24
周神你好
我是来膜拜的
 楼主| JoyChou 发表于 2013-4-25 13:29
2314902431 发表于 2013-4-24 21:35
不错,来给你点人气哈!支持

好的。谢谢支持
没文化真可怕丶 发表于 2013-5-22 08:01
看不懂,但是回帖是个好习惯
moranyuyan 发表于 2013-5-22 08:09
看不懂
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 12:49

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表