您现在的位置:首页 >> API >> API >> 内容

Delphi反调试技术(以OD为例附核心原代码)

时间:2011/9/3 14:52:23 点击:

  核心提示:1.程序窗口句柄检测原理:用FindWindow函数查找具有相同窗口类名和标题的窗口,如果找到就说明有OD在运行//******************************************...
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;

上一页12下一页

作者:网络 来源:转载
共有评论 0相关评论
发表我的评论
  • 大名:
  • 内容:
本类推荐
  • 没有
本类固顶
  • 没有
  • 盒子文章(www.2ccc.com) © 2024 版权所有 All Rights Reserved.
  • 沪ICP备05001939号