Delphi_OD_代码_调试_Delphi反调试技术(以OD为例附核心原代码) (转)
1.程序窗口[chuang kou]句柄[ju bing]检测
原理:用FindWindow函数[han shu]查找[cha zhao]具有相同窗口[chuang kou]类名和标题的窗口[chuang kou],如果找到就说明[shuo ming]有OD在运行[yun hang]
//********************************************
//通过查找[cha zhao]窗口[chuang kou]类名来实现检测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,'找到调试[tiao shi]器!','提示[ti shi]',MB_OK+MB_ICONINFORMATION)
else
MessageBox(Handle,'未找到调试[tiao shi]器!','提示[ti shi]',MB_OK+MB_ICONINFORMATION)
end;
2.用线程[xian cheng]环境块检测
原理:用ring3级下的调试[tiao shi]器对可执行[zhi hang]程序[zhi hang cheng xu][ke zhi hang cheng xu]进行调试[tiao shi]时,调试[tiao shi]器会把被调试[tiao shi]的可执行[zhi hang]程序[zhi hang cheng xu][ke zhi hang cheng xu]作为一个子线程[xian cheng]进行跟踪[gen zong].这时被调试[tiao shi]的可执行[zhi hang]程序[zhi hang cheng xu][ke zhi hang cheng xu]的PEB结构[jie gou]偏移0x02处的BeingDebugged的值为1,如果可执行[zhi hang]程序[zhi hang cheng xu][ke zhi hang cheng xu]未被调试[tiao shi],则值为0,所以可以利用这个值来检测程序是否被ring3级下的调试[tiao shi]器调试[tiao shi]
//***************************************
//使用PEB结构[jie gou]检测OllyDBG
//***************************************
function AntiLoader():Boolean; //检测调试[tiao shi]器;
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,'发现调试[tiao shi]器!','提示[ti shi]',MB_OK+MB_ICONINFORMATION)
else
MessageBox(Handle,'未发现调试[tiao shi]器!','提示[ti shi]',MB_OK+MB_ICONINFORMATION);
end;
3.用API函数[han shu]IsDebuggerPresent检测
原理:操作系统[xi tong][cao zuo xi tong]将调试[tiao shi]对象[dui xiang]设置[she zhi]为在特殊环境中运行[yun hang],而kernel32.dll中的API函数[han shu]IsDebuggerPresent的功能是用于[yong yu]判断进程[jin cheng]是否处于调试[tiao shi]环境中,这样就可以利用这个API函数[han shu]来查看进程[jin cheng]是否在调试[tiao shi]器中执行[zhi hang]
//****************************************
//利用IsDebuggerPresent函数[han shu]检测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,'发现调试[tiao shi]器!','提示[ti shi]',MB_OK+MB_ICONINFORMATION)
else
MessageBox(Handle,'未发现提示[ti shi]器!','提示[ti shi]',MB_OK+MB_ICONINFORMATION);
end;
4.检查程序[jian cha cheng xu]的父进程[jin cheng]
原理:Windows操作系统[xi tong][cao zuo xi tong]下的GUI可执行[zhi hang]程序[zhi hang cheng xu][ke zhi hang cheng xu]的父进程[jin cheng]都是explorer.exe(CUI可执行[zhi hang]程序[zhi hang cheng xu][ke zhi hang cheng xu]的父进程[jin cheng]是 CMD.exe,系统[xi tong]服务[xi tong fu wu]的父进程[jin cheng]是Service.exe,在实际使用的时候需要根据自己的程序类型[lei xing]来选择[xuan ze]父进程[jin cheng]实现反跟踪[gen zong]),而正被调试[tiao shi]器OD调试[tiao shi]的程序的父进程[jin cheng]是调试[tiao shi]器的执行[zhi hang]程序[zhi hang cheng xu]ollydbg.exe而不是别的.所以可以利用检查父进程[jin cheng]是否为explorer.exe的方法[fang fa]来检测OD.
//***************************************************
//检查父进程[jin cheng]来检测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
////得到所有进程[jin cheng]的列表[lie biao]快照[kuai zhao]
hSnap:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if hSnap=INVALID_HANDLE_VALUE then
begin
Result:=False;
Exit;
end;
Process32.dwSize:=sizeof(PROCESSENTRY32);
//查找[cha zhao]进程[jin cheng]
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
//取得系统[xi tong]目录[xi tong mu lu]
GetWindowsDirectory(szBuffer,MAX_PATH);
//合并系统[xi tong]目录[xi tong mu lu]和\EXPLORER.EXE
StrCat(szBuffer,ParentName);
//转换[zhuan huan]成大写以后比较当前调试[tiao shi]程序[tiao shi cheng xu]的进程[jin cheng]是否为父进程[jin cheng]
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,'发现调试[tiao shi]器!','提示[ti shi]',MB_OK+MB_ICONINFORMATION)
else
MessageBox(Handle,'未发现调试[tiao shi]器!','提示[ti shi]',MB_OK+MB_ICONINFORMATION)
end;
5.检查STARTUPINFO结构[jie gou]
原理:Windows操作系统[xi tong][cao zuo xi tong]中的explorer.exe创建进程[jin cheng]的时候会把STARTUPINFO结构[jie gou]中的值设为0,而非explorer.exe创建进程[jin cheng]的时候会忽略这个结构[jie gou]中的值,也就是结构[jie gou]中的值不为0,所以可以利用这个来判断OD是否在调试[tiao shi]程序[tiao shi cheng xu].
/************************************************
//通过检测STARTUPINFO结构[jie gou]来检测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,'发现调试[tiao shi]器!','提示[ti shi]',MB_OK)
else
MessageBox(Handle,'未发现调试[tiao shi]器!','提示[ti shi]',MB_OK);
end;
Delphi_OD_代码_调试_Delphi反调试技术(以OD为例附核心原代码) (转)的更多相关文章
- Delphi_OD_代码_调试_Delphi反调试技术(以OD为例附核心原代码)
1.程序窗口[chuang kou]句柄[ju bing]检测原理:用FindWindow函数[han shu]查找[cha zhao]具有相同窗口[chuang kou]类名和标题的窗口[chuan ...
- Windows 32位-调试与反调试
1.加载调试符号链接文件并放入d:/symbols目录下. 0:000> .sympath srv*d:\symbols*http://msdl.microsoft.com/download/s ...
- 华为手机内核代码的编译及刷入教程【通过魔改华为P9 Android Kernel 对抗反调试机制】
0x00 写在前面 攻防对立.程序调试与反调试之间的对抗是一个永恒的主题.在安卓逆向工程实践中,通过修改和编译安卓内核源码来对抗反调试是一种常见的方法.但网上关于此类的资料比较少,且都是基于AOSP ...
- C/C++ 程序反调试的方法
C/C++ 要实现程序反调试有多种方法,BeingDebugged,NtGlobalFlag,ProcessHeap,CheckRemoteDebuggerPresent,STARTUPINFO,Is ...
- 浅谈android反调试之 签名校验
反调试原理 很多时候,我们都需要进行修改修改应用程序的指令,然后重打包运行,重新打包就需要充签名. 利用签名的变化我们用于反调试.反调试实现代码如下: 为了更加隐藏,比较函数可能在SO层进行实现,如下 ...
- 修改Android手机内核,绕过反调试
本文博客链接:http://blog.csdn.net/qq1084283172/article/details/57086486 0x1.手机设备环境 Model number: Nexus 5 O ...
- 手动绕过百度加固Debug.isDebuggerConnected反调试的方法
本文博客地址:http://blog.csdn.net/qq1084283172/article/details/78237571 1.调用Debug.isDebuggerConnected函数这种反 ...
- 反调试技术常用API,用来对付检测od和自动退出程序
在调试一些病毒程序的时候,可能会碰到一些反调试技术,也就是说,被调试的程序可以检测到自己是否被调试器附加了,如果探知自己正在被调试,肯定是有人试图反汇编啦之类的方法破解自己.为了了解如何破解反调试技术 ...
- Linux下的反调试技术
Linux下的反调试技术 2014年01月30日 ⁄ 综合 ⁄ 共 2669字 ⁄ 字号 小 中 大 ⁄ 评论关闭 转自 http://wangcong.org/blog/archives/310 ...
随机推荐
- GnuRadio Hacking①:使用GnuRadio+SDR破解固定码无线遥控
0×01 信号捕获 在这篇文章中,我们将使用GnuRadio+SDR硬件对某品牌型号的无线跳蛋进行无线重放攻击的演示. 市面上常见的无线遥控工作的频段,通常工作在315Mhz.433Mhz,也有少数的 ...
- ajax请求!
ajax请求: var data ='{"useName":"'+name+'",}' $.ajax({ type:"post", url: ...
- js参数传递分析
需要明白,js基本类型存放在栈,对象存放在堆. 结论:基本类型变量作为参数,不会改变变量值.对象变量作为参数,不修改属性(访问原始对象的操作),也不会改变变量值 起因,是群里一个问题: var a = ...
- iOS 微信分享
1.注册微信开放平台账号:https://open.weixin.qq.com 2.创建应用 设置图片可以使用一个小工具,详情http://www.cnblogs.com/czq1989/p/5073 ...
- The Swift Programming Language 英文原版官方文档下载
The Swift Programming Language 英文原版官方文档下载 今天Apple公司发布了新的编程语言Swift(雨燕)将逐步代替Objective-C语言,大家肯定想学习这个语言, ...
- 和efast对接
(1) efast加入白名单 (2) 外网环境对接外网环境 内网环境对接内网环境 (3) 使用拉取的数据下单 才能同步到efast 4 档案同步 数据库 sys_ishop_sync ...
- ArcGIS for Android_离在线一体化核心技术基本流程
核心思想: a.数据首先存储于ArcSDE中,要素添加GlobleID,图层数据启用数据归档或开启版本化.b.然后将ArcSDE数据库托管于ArcGIS for Server作为数据存储.c.在Arc ...
- JavaBean学习总结(上)
一.何为JavaBean: 遵循特定规则的Java类,必须为共有类: 1. 需要对成员属性私有化: 2. 需要无参的构造函数: 3. 需要通过public方法将私有属性暴露给其他程序,且方法遵循一定命 ...
- ajax请求cookie有效性问题验证
与人讨论时遇到一个问题,就是: 浏览器中后台发起的一个异步ajax请求,服务器做响应时,附带了cookie信息,那么后续对同域名下其他页面请求时,该cookie是否有效,会一并随请求提交到web服务器 ...
- AFNetworking 3.0
AFN 一.什么是AFN 全称是AFNetworking,是对NSURLConnection的一层封装 虽然运行效率没有ASI高,但是使用比ASI简单 在iOS开发中,使用比较广泛 AFN的githu ...