欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创][开源]窗口相关AntiDebug及Od反AntiDebug

[原创][开源]窗口相关AntiDebug及Od反AntiDebug

NTQ相关AntiDebug及Od反AntiDebug
http://bbs.pediy.com/showthread.php?t=206118

  • 窗口

  • Findwindow 根据窗口标题找到对应程序句柄
    
      HWND hwnd;
    
      if (hwnd=FindWindow(L"OllyDbg",NULL))
    
      {
    
        MessageBox(0,L"发现OD",0,0);
    
      }
    
      else
    
      {
    
        MessageBox(0,L"无OD",0,0);
    
      }
    
    

    EnumWindow 枚举所有窗口标题找到对应程序句柄
    
    BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam)
    
    {
    
      TCHAR ch[100];
    
      TCHAR str[]=L"Ollydbg";
    
      if (IsWindowVisible(hwnd))
    
      {
    
        GetWindowText(hwnd,ch,100);
    
        if (StrStrI(ch,str))
    
        {
    
          MessageBox(0,L"发现OD",0,0);
    
          return FALSE;
    
        }
    
      }
    
      return TRUE;
    
    }
    
    

    枚举所有进程列表 看是否有调试器进程(ollydbg.exe、windbg.exe等)
    
    void OnEnumProcess()
    
    {
    
      HANDLE handle;
    
      PROCESSENTRY32 tp32={0};
    
      TCHAR str[]=L"ollydbg.exe";
    
      bool bFindOD=false;
    
      tp32.dwSize=sizeof(PROCESSENTRY32);//必须设置 我费了半天功夫 然后去MSDN一查 才清楚
    
      handle=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    
      if (INVALID_HANDLE_VALUE!=handle)
    
      {
    
        if(!Process32FirstW(handle,&tp32))
    
        {
    
          CloseHandle(handle);    
    
          return ;
    
        }
    
      //  Process32FirstW(handle,&tp32);
    
        do 
    
        {
    
          if (0==lstrcmp(str,tp32.szExeFile))
    
          {
    
            MessageBox(0,L"发现OD",0,0);
    
            bFindOD=true;
    
            break;
    
          }
    
        } while (Process32Next(handle,&tp32));
    
      }
    
      if (!bFindOD)
    
      {
    
        MessageBox(0,L"没有发现OD",0,0);
    
      }
    
      CloseHandle(handle);
    
    }
    
    

    通常进程的父进程是exeplorer.exe(双击执行的情况下) 否则可能被调试
    
    void OnExplorer()
    
    {
    
      HANDLE handle;
    
      PROCESSENTRY32 tp32;
    
      TCHAR str[]=L"Explorer.exe";
    
      DWORD ExplorerID;
    
      DWORD OwnID;
    
      DWORD OwnParentID;
    
      OwnID=GetCurrentProcessId();
    
      GetWindowThreadProcessId(FindWindow(L"Progman",NULL),&ExplorerID);
    
      tp32.dwSize=sizeof(PROCESSENTRY32);
    
      handle=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,NULL);
    
      if (INVALID_HANDLE_VALUE!=handle)
    
      {
    
        Process32First(handle,&tp32);
    
        do 
    
        {
    
          if (OwnID==tp32.th32ProcessID)
    
          {
    
            OwnParentID=tp32.th32ParentProcessID;
    
          }
    
          
    
        } while (Process32Next(handle,&tp32));
    
      }
    
      if (ExplorerID==OwnParentID)
    
      {
    
        MessageBox(0,L"正常运行",0,0);
    
      }
    
      else
    
      {
    
        MessageBox(0,L"发现调试器",0,0);
    
      }
    
      CloseHandle(handle);
    
    }
    
    


  • 其它

  • 当进程被调试时 调试器时间处理代码、步过指令将占用CPU循环  可根据此判断是否被调试
    
    void OnGetTickCount()
    
    {
    
      DWORD dTime1;
    
      DWORD dTime2;
    
      dTime1=GetTickCount();
    
      GetCurrentProcessId();
    
      GetCurrentProcessId();
    
      GetCurrentProcessId();
    
      GetCurrentProcessId();
    
      dTime2=GetTickCount();
    
      if (dTime2-dTime1>100)
    
      {
    
        MessageBox(0,L"发现调试器",0,0);
    
      }
    
      else
    
      {
    
        MessageBox(0,L"正常运行",0,0);
    
      }
    
    }
    
    

    ZW_SET_INFORMATION_THREAD  我们可以根据此函数主动脱离调试器 是自己与调试器的调试关系分离  进而达到反调试的目的
    
    void ZSIT_DetachDebug()
    
    {
    
      ZW_SET_INFORMATION_THREAD Func;
    
      Func=(ZW_SET_INFORMATION_THREAD) GetProcAddress(LoadLibrary(L"ntdll.dll"),"ZwSetInformationThread");
    
      Func(GetCurrentThread(),ThreadHideFromDebugger,NULL,NULL);
    
    }
    
    

    拖入OD(未F9):

    F9运行:

    破解函数反调试的方法的最有效的的方法就是找到具体函数的调用地点 并分析其跳转 然后暴力破解
    亦或者通过HOOK的方式过滤其返回信息

    AntiDebug到此结束
    -----------------------
    源码:
    源码.rar

    上传的附件 1.png
    2.png
    源码.rar

    注意:上传附件及图片大小不得大于30M。

    ⚠️ 版权声明:
    本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
    未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

    0 0 0 举报
    复制成功