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);

http://blog.csdn.net/jiangxinyu/article/details/5348468

反调试技术(Delphi版)的更多相关文章

  1. 基于TLS的反调试技术

    TLS(Thread Local Storage 线程局部存储) 一个进程中的每个线程在访问同一个线程局部存储时,访问到的都是独立的绑定于该线程的数据块.在PEB(进程环境块)中TLS存储槽共64个( ...

  2. 反调试技术常用API,用来对付检测od和自动退出程序

    在调试一些病毒程序的时候,可能会碰到一些反调试技术,也就是说,被调试的程序可以检测到自己是否被调试器附加了,如果探知自己正在被调试,肯定是有人试图反汇编啦之类的方法破解自己.为了了解如何破解反调试技术 ...

  3. Linux下的反调试技术

    Linux下的反调试技术 2014年01月30日 ⁄ 综合 ⁄ 共 2669字 ⁄ 字号 小 中 大 ⁄ 评论关闭 转自  http://wangcong.org/blog/archives/310 ...

  4. Windows 反调试技术——OpenProcess 权限过滤 - ObRegisterCallback

    转载: https://blog.xpnsec.com/anti-debug-openprocess/ 看雪翻译:https://bbs.pediy.com/thread-223857.htm 本周我 ...

  5. Windows反调试技术(上)

    写在前面 在逆向工程中为了防止破解者调试软件,通常都会在软件中采用一些反调试技术来防破解.下面就是一些在逆向工程中常见的反调试技巧与示例. BeingDebuged 利用调试器加载程序时调试器会通过C ...

  6. Windows反调试技术(下)

    OD的DBGHELP模块 检测DBGHELP模块,此模块是用来加载调试符号的,所以一般加载此模块的进程的进程就是调试器.绕过方法也很简单,将DBGHELP.DLL改名. #include <Wi ...

  7. Delphi_OD_代码_调试_Delphi反调试技术(以OD为例附核心原代码) (转)

    1.程序窗口[chuang kou]句柄[ju bing]检测原理:用FindWindow函数[han shu]查找[cha zhao]具有相同窗口[chuang kou]类名和标题的窗口[chuan ...

  8. Delphi_OD_代码_调试_Delphi反调试技术(以OD为例附核心原代码)

    1.程序窗口[chuang kou]句柄[ju bing]检测原理:用FindWindow函数[han shu]查找[cha zhao]具有相同窗口[chuang kou]类名和标题的窗口[chuan ...

  9. Android 中的反调试技术

    比较简单的有下面这两种 调试端口检测, 23946(0x5D8A) Demo: void CheckPort23946ByTcp() { FILE* pfile=NULL; char buf[0x10 ...

随机推荐

  1. Arcgis api For silverlight 加载QQ地图

    原文 http://www.cnblogs.com/thinkaspx/archive/2012/11/07/2759079.html //本篇博客仅在技术上探讨可行性   //如果要使用Q 地图,请 ...

  2. JS 的Date对象

    原文 http://www.cnblogs.com/towerking/p/3220410.html 一.获取Date对象 在JS中我们可以通过下面一段代码获取本地时间 var currentDate ...

  3. 【转】Android虚拟平台的编译和整合

    原文网址:http://blog.csdn.net/rickleaf/article/details/6369065 概要 Android从2008年开始到本文写的2011年,短短三年的时间里成为手机 ...

  4. Dos命令---ipconfig

    Dos命令---ipconfig 作者:vpoet mail:vpoet_sir@163.com ipconfig是很常用的Dos命令,我们可以用ipconfig /?查看该命令的说明.在linux下 ...

  5. tangible T4 Editor 2.2.3 plus modeling tools for VS 2012 扩展名

    tangible T4 Editor 2.2.3 plus modeling tools for VS 2012 扩展名 tangible T4 Editor 2.2.3 plus modeling ...

  6. Java专项面试训练(一)

    1.在Java中,( )类提供定位本地文件系统,对文件或目录及其属性进行基本操作( D ) A.FileInputStream B.FileReader C.FileWriter D.File解析:F ...

  7. No module named MYSQLdb 问题解决

    问题描述: 报错:ImportError: No module named MySQLdb 对于不同的系统和程序有如下的解决方法: easy_install mysql-python (mix os) ...

  8. CSS3初步

    一.CSS与CSS3的区别 非常简单,CSS代表"Casading Style Sheets",就是样式表,是一种替代并为网站添加样式的标记性语言.现在所使用的CSS基本是在199 ...

  9. DNA Sorting(排序)

    欢迎参加——BestCoder周年纪念赛(高质量题目+多重奖励) DNA Sorting Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: ...

  10. Android手机APN设置(中国移动 联通3G 电信天翼),解决不能上网的问题

    中国移动 第一步,设置CMNET上网 新建APN 1.名称:cmnet 2.APN:cmnet 3.APN类型:default 就仅仅填写上面3个选项,其它都是默认,不用填写. 第二步,设置彩信 新建 ...