看流星社区

 找回密码
 注册账号
查看: 2244|回复: 0

开源窗口相关AntiDebug及Od反AntiDebug

[复制链接]

该用户从未签到

发表于 2018-3-1 09:50:25 | 显示全部楼层 |阅读模式

窗口
Findwindow 根据窗口标题找到对应程序句柄
代码:
  1.   HWND hwnd;
  2.   if (hwnd=FindWindow(L"OllyDbg",NULL))
  3.   {
  4.     MessageBox(0,L"发现OD",0,0);
  5.   }
  6.   else
  7.   {
  8.     MessageBox(0,L"无OD",0,0);
  9.   }
复制代码


EnumWindow 枚举所有窗口标题找到对应程序句柄
代码:
  1. BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam)
  2. {
  3.   TCHAR ch[100];
  4.   TCHAR str[]=L"Ollydbg";
  5.   if (IsWindowVisible(hwnd))
  6.   {
  7.     GetWindowText(hwnd,ch,100);
  8.     if (StrStrI(ch,str))
  9.     {
  10.       MessageBox(0,L"发现OD",0,0);
  11.       return FALSE;
  12.     }
  13.   }
  14.   return TRUE;
  15. }
复制代码


枚举所有进程列表 看是否有调试器进程(ollydbg.exe、windbg.exe等)
代码:
  1. void OnEnumProcess()
  2. {
  3.   HANDLE handle;
  4.   PROCESSENTRY32 tp32={0};
  5.   TCHAR str[]=L"ollydbg.exe";
  6.   bool bFindOD=false;
  7.   tp32.dwSize=sizeof(PROCESSENTRY32);//必须设置 我费了半天功夫 然后去MSDN一查 才清楚
  8.   handle=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
  9.   if (INVALID_HANDLE_VALUE!=handle)
  10.   {
  11.     if(!Process32FirstW(handle,&tp32))
  12.     {
  13.       CloseHandle(handle);   
  14.       return ;
  15.     }
  16.   //  Process32FirstW(handle,&tp32);
  17.     do
  18.     {
  19.       if (0==lstrcmp(str,tp32.szExeFile))
  20.       {
  21.         MessageBox(0,L"发现OD",0,0);
  22.         bFindOD=true;
  23.         break;
  24.       }
  25.     } while (Process32Next(handle,&tp32));
  26.   }
  27.   if (!bFindOD)
  28.   {
  29.     MessageBox(0,L"没有发现OD",0,0);
  30.   }
  31.   CloseHandle(handle);
  32. }
复制代码


通常进程的父进程是exeplorer.exe(双击执行的情况下) 否则可能被调试
代码:
  1. void OnExplorer()
  2. {
  3.   HANDLE handle;
  4.   PROCESSENTRY32 tp32;
  5.   TCHAR str[]=L"Explorer.exe";
  6.   DWORD ExplorerID;
  7.   DWORD OwnID;
  8.   DWORD OwnParentID;
  9.   OwnID=GetCurrentProcessId();
  10.   GetWindowThreadProcessId(FindWindow(L"Progman",NULL),&ExplorerID);
  11.   tp32.dwSize=sizeof(PROCESSENTRY32);
  12.   handle=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,NULL);
  13.   if (INVALID_HANDLE_VALUE!=handle)
  14.   {
  15.     Process32First(handle,&tp32);
  16.     do
  17.     {
  18.       if (OwnID==tp32.th32ProcessID)
  19.       {
  20.         OwnParentID=tp32.th32ParentProcessID;
  21.       }
  22.       
  23.     } while (Process32Next(handle,&tp32));
  24.   }
  25.   if (ExplorerID==OwnParentID)
  26.   {
  27.     MessageBox(0,L"正常运行",0,0);
  28.   }
  29.   else
  30.   {
  31.     MessageBox(0,L"发现调试器",0,0);
  32.   }
  33.   CloseHandle(handle);
  34. }
复制代码


其它

当进程被调试时 调试器时间处理代码、步过指令将占用CPU循环  可根据此判断是否被调试
代码:
  1. void OnGetTickCount()
  2. {
  3.   DWORD dTime1;
  4.   DWORD dTime2;
  5.   dTime1=GetTickCount();
  6.   GetCurrentProcessId();
  7.   GetCurrentProcessId();
  8.   GetCurrentProcessId();
  9.   GetCurrentProcessId();
  10.   dTime2=GetTickCount();
  11.   if (dTime2-dTime1>100)
  12.   {
  13.     MessageBox(0,L"发现调试器",0,0);
  14.   }
  15.   else
  16.   {
  17.     MessageBox(0,L"正常运行",0,0);
  18.   }
  19. }
  20. ZW_SET_INFORMATION_THREAD  我们可以根据此函数主动脱离调试器 是自己与调试器的调试关系分离  进而达到反调试的目的
  21. 代码:
  22. void ZSIT_DetachDebug()
  23. {
  24.   ZW_SET_INFORMATION_THREAD Func;
  25.   Func=(ZW_SET_INFORMATION_THREAD) GetProcAddress(LoadLibrary(L"ntdll.dll"),"ZwSetInformationThread");
  26.   Func(GetCurrentThread(),ThreadHideFromDebugger,NULL,NULL);
  27. }
复制代码


破解函数反调试的方法的最有效的的方法就是找到具体函数的调用地点 并分析其跳转 然后暴力破解
亦或者通过HOOK的方式过滤其返回信息
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-4-16 16:17

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

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