`
wezly
  • 浏览: 484480 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

Delphi反调试技术

阅读更多

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;

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    不错的delphi反编译软件

    Delphi反编译的过程涉及到多个技术环节,如PE文件格式的理解、虚拟机指令的解码、符号表的解析等。PE(Portable Executable)是Windows操作系统中的可执行文件格式,包含了程序的代码、数据、资源等信息。DeDeDark...

    delphi 反编译工具

    Delphi反编译工具通过分析二进制代码,尝试恢复原始的Pascal语法和结构,帮助开发者了解程序的工作机制,或者用于代码逆向工程。 DelphiDecompiler作为这个工具的核心部分,很可能是执行反编译任务的程序。其可能...

    Delphi反编译工具的源码

    通过阅读这些源码,开发者可以深入理解Delphi反编译的技术细节,学习如何处理编译后的二进制文件,以及如何解析和重构Pascal代码。 源码分析对于提升编程技能、研究编译原理和逆向工程技巧都有很大帮助。它可以帮助...

    DeDe V3.50.02 (DELPHI反编译工具)

    《DeDe V3.50.02:DELPHI反编译利器解析》 DeDe,这个名字在DELPHI开发领域中具有重要的地位,它是一款功能强大的反编译工具,专为DELPHI程序员设计,帮助他们探索和理解已编译的DELPHI应用程序的内部结构。DeDe V...

    delphi反编译工具.rar

    标题"delphi反编译工具.rar"暗示了这个压缩包可能包含用于反编译Delphi编译的二进制文件的工具。 描述中的"delphi反编译工具"进一步确认了这个主题。反编译工具通常能够将已经编译过的机器码转换回源代码的形式,...

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

    反调试技术(以 OD 为例附核心原代码) 反调试技术是指在软件开发中,防止调试器对程序的跟踪和分析,以保护程序的安全和知识产权。在这篇文章中,我们将通过三个实例,展示如何使用反调试技术来检测 OllyDBG 调试...

    DeDe_3.5 delphi 反编译

    **Delphi反编译技术详解** 在编程领域,Delphi是一种强大的对象 Pascal 编程语言,以其高效、快速的编译能力和丰富的组件库而受到开发者的喜爱。然而,随着软件安全性和知识产权保护的重要性日益凸显,逆向工程,...

    Understand.for.Delphi反組譯工具

    《深入理解:Delphi反编译工具》 在软件开发领域,Delphi是一种深受程序员喜爱的集成开发环境(IDE),以其高效、强大的Object Pascal语言和丰富的组件库著称。然而,有时我们需要对已有的Delphi编译的程序,如.exe...

    超强的反编译delphi的工程

    标签"很强大"进一步强调了这个工具的性能和功能,意味着它可能包含了高级的反混淆技术,可以解析复杂的Delphi代码和算法,甚至可能支持恢复源代码结构。 在压缩包子文件的文件名称列表中,我们看到一系列以"kb"开头...

    反编译程序的源代码,Delphi版.rar

    这个压缩包中的"Delphi反编译"文件可能包含以下几个部分: 1. **主程序源代码**:这是实现反编译功能的核心代码,它可能会解析Delphi的编译后代码结构,如虚拟机指令(VM instructions)、资源信息和类型信息等。 ...

    Delphi 反编译

    总的来说,Delphi反编译是一个复杂的过程,涉及到多个工具和技术,旨在从已编译的代码中恢复出尽可能接近源代码的形式,以帮助开发者理解和分析Delphi程序。在这个过程中,理解Delphi的编译过程、DFM文件结构、以及...

    delphi反编译文件(带可执行程序DEDE)

    这个压缩包“delphi反编译文件(带可执行程序DEDE)”似乎包含了一个用于反编译Delphi编译的二进制文件的工具——DEDE。 DEDE,全称为Delphi Decompiler Explorer,是一款专门针对Delphi编译的.exe或.dll文件进行反...

    delphi exe/dcu/bpl反编译

    Delphi的反编译技术有其复杂性,因为Delphi的编译器进行了大量优化,使得反编译出的源代码可能难以阅读和理解。此外,反编译的结果通常不会完全恢复原始源代码的结构和命名,可能会丢失注释、调试信息和源代码中的...

    解决DELPHI2005调试ASP.NET程序小问题.rar

    本文主要针对的是一个具体的问题,即如何在DELPHI2005环境下解决调试ASP.NET程序时遇到的小问题。DELPHI2005是一款强大的面向对象的Windows应用程序开发工具,而ASP.NET则是微软.NET框架下的Web应用开发平台。当这两...

    专业Delphi反编译工具(DeDeDark) 3.50.4 超强修改版.rar

    总之,DeDeDark 3.50.4作为一款专业的Delphi反编译工具,不仅提供了强大的代码还原能力,还在资源提取、调试支持等方面表现出色,为开发者提供了宝贵的辅助工具。然而,合理合法地使用这些工具,尊重并遵守软件知识...

    DEDEdelphi反编译软件_decompiler_delphi_delphidede_dede_delphidecompil

    《深入理解DEDE Delphi反编译软件:揭示Delphi程序的秘密》 在软件开发的世界里,逆向工程是一项至关重要的技术,它可以帮助开发者理解已有的程序代码,从而进行学习、调试或者改进。DEDE Delphi反编译软件,作为一...

    delphi反编译工具dede

    Delphi反编译工具Dede是一款专为Delphi编译的可执行程序(exe)设计的逆向工程软件。在IT行业中,逆向工程是一种技术手段,用于分析已编译的程序,以揭示其内部结构、工作原理和实现细节。这对于软件开发者来说,...

    dede 3.5 Delphi反编译

    总的来说,"dede 3.5 Delphi反编译"涉及的是通过反编译工具理解和分析用Delphi 7.0编译的程序,这需要一定的编程基础和技术知识,同时也需要关注法律和伦理问题。VCL7.dsf文件可能是这一过程中的一个重要组成部分,...

    DELPHI反编译工具

    DELPHI反编译工具是针对使用Delphi编程语言编译生成的可执行文件进行逆向工程的专业软件。Delphi是一种基于Object Pascal的强大的集成开发环境(IDE),它以其高效、快速的编译能力和丰富的组件库深受开发者喜爱。...

    anti-softice.zip_Delphi-Anti-Debug_Soft!_delphi debug

    _delphi debug" 提供的信息表明,这个压缩包包含的是与Delphi编程语言相关的反调试技术。"SoftICE"是一款著名的系统级调试器,常被黑客和逆向工程师用于分析程序行为。"Anti-SoftIce"意味着这些代码是为了防止...

Global site tag (gtag.js) - Google Analytics