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 不仅是一门语言,更是一种思维方式——如何用最优雅的代码,撬动最底层的系统能力。未来,你可以继续深入DLL注入、API Hook、驱动通信等领域,构建更强大的工具。但请始终记住:能力越大,责任越大。愿你在技术的海洋中乘风破浪,不忘初心,砥砺前行。🌊✨本文还有配套的精品资源,点击获取简介:外挂制作是指通过编写辅助程序改变游戏或应用程序原有功能的技术,常用于自动化操作、性能增强等场景。 阅读详情

相关推荐

在Windows 2000/XP下实现进程保护的高级策略

在Windows编程中,有些API函数因其功能强大而被广泛使用。以下是几个例子::用于启动一个新进程。:用于获取已存在进程的句柄。:用于向进程的内存空间写入数据。:用于修改进程内存区域的保护属性。和:用于动态加载DLL并获取函数地址。这些API函数在合法的程序开发中是必不可少的,但它们同样可以被恶意软件利用来执行非法操作,比如注入代码、提升权限等。反调试技术包括:检测调试器:利用检测API调用、异常处理器等手段识别调试器的存在。防断点技术。

weixin_30021053的博客 828

delphi 防止跟踪

还有一点,调试器对我们的威胁很大,我们不会让Cracker们舒舒服服地使用SoftICE、TRW或OllyDbg来调试我们的程序。除了常用的MeItICE方法外,这里我给一个笔者写的方法:   {检查自己的进程的父进程是否为Explorer.exe,否则是被调试器加载了}

ddrvos的专栏 1449

SBM与超效率SBM模型实战:从原始面板数据到MATLAB高效实现

本文详细介绍了SBM模型与超效率SBM模型的核心原理,并提供了从原始面板数据预处理到MATLAB高效实现的完整实战指南。通过具体代码解析,帮助研究者掌握如何利用MATLAB进行数据标准化、模型构建、效率求解及结果可视化,从而精准评估决策单元的相对效率,尤其适用于在高效单元中进一步精细排名的场景。

weixin_29100399的博客 480

常用反跟踪技术

作者:smokingroom日期:2005-04-12站点:www.programmerlife.com邮箱:smokingroom@sina.com前言:反跟踪调试技术对于Delphi程序员来说,似乎比较陌生。因为许多的技术,直接用Delphi语言似乎比较难以完成,而对汇编来说,则比较容易完成,因此,下面的代码用到了内嵌汇编语言。如果你看不懂也不要紧,因为已经经过测试,可以直接放进你的程序里面。

老裴 2668

红外基本数据观察需要用到的技巧

1.用ps查看Y8的数据,直接将Y8.raw格式拖动到ps中去。 2.用ps查看Y16数据,直接将Y16.raw拖动到PS中去。 3.Y16转Y8是将Y16的值(Y16的范围~32768–32767)映射到Y8的值(Y8的范围为0~255),步骤如下:1.按照Y16的大小排列并统计相同Y16出现的次数直方图; 2.根据抛点比例计算抛点个数,分别从前往后与从后往前...

阿锋的专栏 2630

文石NoteX3国行版安装 Google Play经验分享

文石NoteX3国行版安装 Google Play经验分享。

2301_80693261的博客 7606

软件反跟踪技术

<br />一、软件分析技术概述<br /> <br />转自:http://bbs.isbase.net/thread-50211-1-1.html<br /><br /><br />在进行软件的破解、解密以及计算机病毒分析工作中,一个首要的问题是对软件及病毒进行分析。<br />这些软件都是机器代码程序,对于它们分析必须使用静态或动态调试工具,分析跟踪其汇编代码。 <br />从软件使用说明和操作中分析软件<br />欲破解软件,首先应该先使用该软件,了解一下功能是否有限制,最好阅读一下软件的说明或手册

hpu110的专栏 2776

DSP配置I2C通讯(非IO口软件模拟时序)

dsp即数字信号处理器,是一种广泛应用的嵌入式处理器,主要应用是实时快速地实现各种数字信号处理算法,目前,国际主要的dsp供应商是ti公司,其tms32系列产品占据了dsp市场近一半的份额,本文以TMS320F28377D为例,使用ti公司dsp开发工具ccs10.1配置i2c模块。 写这篇文章的缘由,因为市面上很多DSP其实内部是具有硬件I2C接口的,但由于网络上大部分资料和例程都是利用IO口模拟I2C时序进而实现I2C通讯的。给很多想学习硬件I2C通讯的小伙伴带来了困难。 下面先介绍一下配置步骤 1.E

weixin_44387442的博客 5546

让delphi在调试时不监视指定异常

在调试程序时,可能需要让delphi不拦截某些异常,这时我们可以设置debugger options中的language exceptions来完成。下面举例说明如何让delphi在调试时不拦截EOleError,[@more@...

congzhangkang8746的博客 386

XDMA 驱动安装与性能测试全流程解析

本文详细解析了XDMA驱动的完整安装与性能测试流程。从环境准备、源码获取、编译安装到驱动加载与设备验证,逐步指导用户打通FPGA加速卡与主机间的高速数据通道。重点介绍了如何通过官方测试脚本进行功能验证与带宽性能测试,帮助用户评估XDMA驱动的实际传输效能,为AI推理、高频交易等低延迟高带宽应用奠定基础。

weixin_29216049的博客 525

【k8s故障处理篇】calico-kube-controllers状态为“ImagePullBackOff”解决办法

【k8s故障处理篇】calico-kube-controllers状态为“ImagePullBackOff”解决办法

jks212454的博客 2308

如何让Delphi在调试运行程序时正确执行捕获异常

        今天在Delphi调试运行程序时,发现程序执行后没有提示我想要的错误信息xxx(比如Read Error),却仍旧提示存取地址错误类似的系统错误。 后来在网上找到解决此问题的方法。1脱离Delphi环境执行编译好的程序。2如非要在Delphi环境中运行也可以,在Tools->Debuger   Options->Language   Exceptions面板中把“Sto

樊亿的专栏 1985

MIKE水动力笔记1_岸线及水深数据之依靠全球数据库资源提取的方法

通过各种数据库资源来获取全球岸线及水深数据,这种方法获取的岸线及水深数据精度偏低,比较适合大尺度范围的水动力研究。

晏长街的博客 1万+

UnrealDbg:突破游戏驱动反调试机制的利器

UnrealDbg:突破游戏驱动反调试机制的利器 随着游戏产业的发展,游戏驱动中的反调试机制日益复杂,给开发者带来了巨大的挑战。传统的调试工具往往无法突破这些反调试机制,导致调试工作难以进行。为了解决这个问题,UnrealDbg 项目应运而生,它是一个基于 VT(Intel Virtualization Technology)技术构建的调试体系,旨在帮助开发者突破游戏驱动的反调试机制,提高调试效率...

gitblog_00824的博客 1264

清华源pip install出现ERROR: Could not find a version that satisfies the requirement的解决方案

本文主要介绍了清华源pip install出现ERROR: Could not find a version that satisfies the requirement的解决方案,希望能对学习python的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 8万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

深度解析IDR:Delphi程序逆向工程的5大核心技术与实战应用

在Windows平台逆向工程领域,Interactive Delphi Reconstructor(IDR)作为专业的Delphi反编译工具,为开发者提供了从编译后程序恢复源代码结构的重要能力。本文将深入剖析IDR的五大核心技术模块,分享实际应用场景中的操作技巧和问题解决方案。 ## 🛠️ 逆向工程环境配置与优化 ### 知识库系统深度配置 IDR的知识库系统是其反编译精度的核心保障。项目包

gitblog_00417的博客 1600

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

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

 1.程序窗口句柄检测原理:用FindWindow函数查找具有相同窗口类名和标题的窗口,如果找到就说明有OD在运行//********************************************//通过查找窗口类名来实现检测OllyDBG//********************************************function AntiLoader

编程资料收集与共享交流 1315

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

旧调重弹-SetUnhandledExceptionFilter的使用问题

 这几天在写一个测试程序,包括使用SetUnhandledExceptionFilter来 反OD调试,关于SetUnhandledExceptionFilter的反调试原理之前(一年前了哈) simonzh2000等人都有详细讲述,这里就不多讲了,在Delphi里面要用这个 函数却有点问题,先看看代码: program SetUnhandledExceptionFilterTest; uses 

zskof的专栏 1064

Delphi 19种反调试检测法

//使用IsDebuggerPresent这个API来检测是否被调试function FD_IsDebuggerPresent(): Boolean;beginif IsDebuggerPresent then      Result := Trueelse      Result := False;end; //使用查看PEB结构中标志位beingDegug来检测是否被调试function P...

weixin_34192993的博客 499

熊猫烧香病毒逆向分析:3个核心函数与IDA Pro/OD实战调试流程

本文深入解析熊猫烧香病毒的逆向分析过程,通过IDA Pro静态分析和OllyDbg动态调试,详细拆解其三个核心函数的运作机制。文章涵盖病毒自复制、文件感染和自我保护等关键功能,提供实战调试技巧和安全分析环境搭建指南,帮助安全研究人员掌握恶意代码分析方法论。

weixin_28715953的博客 351

浅谈软件安全设计(一)

{**************************************************************  CrackMe #01  code by 黑夜彩虹 & vxin with almost pure delphi  个人网站:http://soft.eastrise.net                                              

vxin的专栏 1064

delphi软件多种反调试代码

调试与反调试、反反调试是永远存在的问题,现在的大多数软件也加了反调试功能(尤其是网游),保护其不被调试破解。 调试大家都知道有很多这方面的工具,如OD、CE、ICE…,反调试大家也知道有很多种方法,如自己加代码实现、加壳等,反反调试… 今天做了一个小程序,采用了19种方式来检测自己是否被调试、下断等,这只是一个小测试,没有加入驱动和hook等乱七八糟的东西,纯以代码实现。...

weixin_33690963的博客 246

Delphi反调试【初级】检测法

1.程序窗口句柄检测 原理:用FindWindow函数查找具有相同窗口类名和标题的窗口,如果找到就说明有OD在运行 //******************************************** //通过查找窗口类名来实现检测OllyDBG //******************************************** function ...

weixin_33896069的博客 181

反反调试总结

TP:3种方法适用于win7 x64 ~ win10 一:1.恢复调试权限 2.结束11号线程 3.恢复所有线程 二:秒杀TP方法:CE使用VEH模式 结束11号线程 三:手动过TP:先于TX游戏运行OD,结束11号线程 直接附加进程 x86方法: 1.以上随便一种 + IAT HOOK Tesafe.sys MmIsAddressVaild 对挂钩函数地址进程过滤 2.以上随便一种

zhuhuibeishadiao 6077
上一篇: 如何删除ActiveX控件
下一篇: Java可变参数方法重载的错误3例
wezly
博客等级 码龄20年 8粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值