龙马谷

 找回密码
 立即注册

QQ登录

只需一步,快速开始

龙马谷VIP会员办理客服QQ:82926983(如果临时会话没有收到回复,请先加QQ好友再发。)
1 [已完结] GG修改器新手入门与实战教程 31课 2 [已完结] GG修改器美化修改教程 6课 3 [已完结] GG修改器Lua脚本新手入门教程 12课
4 [已完结] 触动精灵脚本新手入门必学教程 22课 5 [已完结] 手游自动化脚本入门实战教程 9课 6 [已完结] C++射击游戏方框骨骼透视与自瞄教程 27课
7 [已完结] C++零基础UE4逆向开发FPS透视自瞄教程 29课 8 [已完结] C++零基础大漠模拟器手游自动化辅助教程 22课 9 [已完结] C++零基础开发DXF内存脚本辅助教程 32课
以下是天马阁VIP教程,本站与天马阁合作,赞助VIP可以获得天马阁对应VIP会员,名额有限! 点击进入天马阁论坛
1 [已完结] x64CE与x64dbg入门基础教程 7课 2 [已完结] x64汇编语言基础教程 16课 3 [已完结] x64辅助入门基础教程 9课
4 [已完结] C++x64内存辅助实战技术教程 149课 5 [已完结] C++x64内存检测与过检测技术教程 10课 6 [已完结] C+x64二叉树分析遍历与LUA自动登陆教程 19课
7 [已完结] C++BT功能原理与x64实战教程 29课 8 [已完结] C+FPS框透视与自瞄x64实现原理及防护思路
查看: 4072|回复: 0

开源窗口相关AntiDebug及Od反AntiDebug

[复制链接]

31

主题

3

回帖

43

积分

编程入门

Rank: 1

龙马币
93

窗口
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的方式过滤其返回信息
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

龙马谷| C/C++辅助教程| 安卓逆向安全| 论坛导航| 免责申明|Archiver|
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表龙马谷立场!
任何人不得以任何方式翻录、盗版或出售本站视频,一经发现我们将追究其相关责任!
我们一直在努力成为最好的编程论坛!
Copyright© 2018-2021 All Right Reserved.
在线客服
快速回复 返回顶部 返回列表