ytn2001 发表于 2023-8-30 20:24:44

开源窗口相关AntiDebug及Od反AntiDebug


窗口
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;
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);
}

破解函数反调试的方法的最有效的的方法就是找到具体函数的调用地点 并分析其跳转 然后暴力破解
亦或者通过HOOK的方式过滤其返回信息
页: [1]
查看完整版本: 开源窗口相关AntiDebug及Od反AntiDebug