首页
社区
课程
招聘
还有什么API函数可以检测OD进行反调试吗?
发表于: 2009-7-2 17:16 15012

还有什么API函数可以检测OD进行反调试吗?

2009-7-2 17:16
15012
收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 60
活跃值: (670)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
枚举自身进程控件名和类名, 和OD控件 相配就干掉
2009-7-2 19:34
0
雪    币: 177
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tbc
3
IsDebuggerPresent
CheckRemoteDebuggerPresent
NtQueryInformationProcess
CsrGetProcessId+OpenProcess
CloseHandle
OutputDebugString
UnhandledExceptionFilter
OutputDebugStringA
ZwSetInformationThread
GetTickCount
timeGetTime
2009-7-5 13:21
0
雪    币: 53
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
楼上继续...
2009-7-29 17:40
0
雪    币: 0
活跃值: (954)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
NtQueryInformationProcess 这个貌似看雪加密解密 用户态的梦魔 那个里面涉及到的函数!
2009-7-30 15:44
0
雪    币: 143
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
用这个DbgUiRemoteBreakin
非常实用,我用过的OD都过不了这个检测。
2009-7-30 22:47
0
雪    币: 342
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我在一本书上看到过,有很多方法可以检查到OD,叫什么来的忘记了,
我还记了笔记,比如说1.IsDebuggerPresent()
2.PEB.NtGlobalFlag可,这个PEB标志也行
3.NtQueryInformationProcess
4.DebugBreak()
5.时间检查
太多了,我都没试过
2009-7-31 16:48
0
雪    币: 178
活跃值: (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
8
建议看看壳狼的那个比赛提交作品,里面收集了很多anti debug。有源码。
2009-8-1 20:10
0
雪    币: 218
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
壳狼?搜索没搜索到这个用户名啊。
2009-8-2 05:03
0
雪    币: 163
活跃值: (12)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
10
1.程序窗口句柄检测
原理:用FindWindow函数查找具有相同窗口类名和标题的窗口,如果找到就说明有OD在运行
//********************************************
//通过查找窗口类名来实现检测OllyDBG
//********************************************
function AntiLoader():Boolean;
const
   OllyName='OLLYDBG';
var
   Hwnd:Thandle;
begin
   Hwnd:=FindWindow(OllyName,nil);
   if Hwnd<>0 then
Result:=True
   else
Result:=False;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
   if AntiLoader then
MessageBox(Handle,'找到调试器!','提示',MB_OK+MB_ICONINFORMATION)
   else
MessageBox(Handle,'未找到调试器!','提示',MB_OK+MB_ICONINFORMATION)
end;

2.用线程环境块检测
原理:用ring3级下的调试器对可执行程序进行调试时,调试器会把被调试的可执行程序作为一个子线程进行跟踪.这时被调试的可执行程序的PEB结构偏移 0x02处的BeingDebugged的值为1,如果可执行程序未被调试,则值为0,所以可以利用这个值来检测程序是否被ring3级下的调试器调试
//***************************************
//使用PEB结构检测OllyDBG
//***************************************
function AntiLoader():Boolean; //检测调试器;
var
   YInt,NInt:Integer;
begin
   asm
mov eax,fs:[$30]
//获取PEB偏移2h处BeingDebugged的值
movzx eax,byte ptr[eax+$2]
or al,al
jz @No
jnz @Yes
@No:
   mov NInt,1
@Yes:
   Mov YInt,1
   end;
   if YInt=1 then
Result:=True;
   if NInt=1 then
Result:=False;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
   if AntiLoader then
MessageBox(Handle,'发现调试器!','提示',MB_OK+MB_ICONINFORMATION)
   else
MessageBox(Handle,'未发现调试器!','提示',MB_OK+MB_ICONINFORMATION);
end;
3.用API函数IsDebuggerPresent检测
原理:操作系统将调试对象设置为在特殊环境中运行,而kernel32.dll中的API函数IsDebuggerPresent的功能是用于判断进程是否处于调试环境中,这样就可以利用这个API函数来查看进程是否在调试器中执行
//****************************************
//利用IsDebuggerPresent函数检测OllyDBG
//****************************************
function AntiLoader():Boolean;
var
   isDebuggerPresent: function:Boolean;
   Addr: THandle;
begin
   Addr := LoadLibrary('kernel32.dll');
   isDebuggerPresent := GetProcAddress(Addr, 'IsDebuggerPresent');
   if isDebuggerPresent then
Result:=True
   else
Result:=False;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
   if AntiLoader then
MessageBox(Handle,'发现调试器!','提示',MB_OK+MB_ICONINFORMATION)
   else
MessageBox(Handle,'未发现提示器!','提示',MB_OK+MB_ICONINFORMATION);
end;
4.检查程序的父进程
原理:Windows操作系统下的GUI可执行程序的父进程都是explorer.exe(CUI可执行程序的父进程是CMD.exe,系统服务的父进程是Service.exe,在实际使用的时候需要根据自己的程序类型来选择父进程实现反跟踪),而正被调试器OD调试的程序的父进程是调试器的执行程序 ollydbg.exe而不是别的.所以可以利用检查父进程是否为explorer.exe的方法来检测OD.
//***************************************************
//检查父进程来检测OllyDBG
//***************************************************
function AntiLoader():Boolean;
const
   ParentName='\EXPLORER.EXE';
var
   hSnap,hProcess:THandle;
   szBuffer:array[0..MAX_PATH] of char;
   FileName:array[0..MAX_PATH] of char;
   Process32:PROCESSENTRY32;
   LoopFlag:BOOL;
begin
   ////得到所有进程的列表快照
   hSnap:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
   if hSnap=INVALID_HANDLE_VALUE then
   begin
Result:=False;
Exit;
   end;
   Process32.dwSize:=sizeof(PROCESSENTRY32);
   //查找进程
   LoopFlag:=Process32First(hSnap,Process32);
   if LoopFlag=False then
   begin
CloseHandle(hSnap);
Result:=False;
Exit;
   end;
   while Integer(LoopFlag)<>0 do
begin
   if Process32.th32ProcessID=GetCurrentProcessId() then
       begin
      hProcess:=OpenProcess(PROCESS_ALL_ACCESS,FALSE,Process32.th32ParentProcessID);
      if hProcess<>0 then
         begin
             if GetModuleFileNameEx(hProcess,0,FileName,MAX_PATH)<>0 then
            begin
               //取得系统目录
               GetWindowsDirectory(szBuffer,MAX_PATH);
               //合并系统目录和\EXPLORER.EXE
               StrCat(szBuffer,ParentName);
               //转换成大写以后比较当前调试程序的进程是否为父进程
               if UpperCase(String(FileName))<>UpperCase(String(szBuffer)) then
                   Result:=True
               else
                   Result:=False;
            end;
         end
      else
         Result:=False;
       end;
   LoopFlag:=Process32Next(hSnap,Process32);
end;
   CloseHandle(hSnap);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
   if AntiLoader then
MessageBox(Handle,'发现调试器!','提示',MB_OK+MB_ICONINFORMATION)
   else
MessageBox(Handle,'未发现调试器!','提示',MB_OK+MB_ICONINFORMATION)
end;
5.检查STARTUPINFO结构
原理:Windows操作系统中的explorer.exe创建进程的时候会把STARTUPINFO结构中的值设为0,而非explorer.exe创建进程的时候会忽略这个结构中的值,也就是结构中的值不为0,所以可以利用这个来判断OD是否在调试程序.
/************************************************
//通过检测STARTUPINFO结构来检测OllyDbg
//************************************************
function AntiLoader():Boolean;
var
   Info:STARTUPINFO;
begin
   GetStartupInfo(Info);
   if (Info.dwX<>0) or (Info.dwY<>0) or (Info.dwXCountChars<>0) or (Info.dwYCountChars<>0) or
    (Info.dwFillAttribute<>0) or (Info.dwXSize<>0) or (Info.dwYSize<>0) then
Result:=True
   else
Result:=False;
end;
procedure TMainFrm.FormCreate(Sender: TObject);
begin
   if AntiLoader then
MessageBox(Handle,'发现调试器!','提示',MB_OK)
   else
MessageBox(Handle,'未发现调试器!','提示',MB_OK);
end;
2009-8-2 10:57
0
雪    币: 391
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
有些小复杂~~~晕 晕 的
2010-5-15 21:54
0
雪    币: 1602
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
搜索19种饭 调试检测方法,使用OD最强的那个饭检测插件都能被 检测到啊
2010-5-16 08:12
0
游客
登录 | 注册 方可回帖
返回
//