展开菜单
首页 精品内容 本月促销 装机必备 Windows PDF教程 macOS软件 IOS软件 Android AI 专题
全部分类

当前位置:

首页 > 软件教程 > 绕过IsDebuggerPresent反调试技巧

绕过IsDebuggerPresent反调试技巧

在某爱论坛上看到一个师傅分享了一个关于如何绕过IsDebuggerPresent的反调试技术的Crackme教程。我闲来无事,决定复现并调试一下。首先,这里是原文的链接:https://www.52pojie.cn/thread-1432590-1-1.html反调试什么是反调试技术反调试技术,顾名思义,就是一种用来防止程序被调试的技术。简单的反调试往往是识别是否被调试,如果是则退出程序、封禁账号等(检测)。更复杂的反调试可以在反汇编代码中插入花指令,使调试器的反汇编引擎无法正确解析反汇编指令(干扰)。门

在某爱论坛上看到一个师傅分享了一个关于如何绕过IsDebuggerPresent的反调试技术的Crackme教程。我闲来无事,决定复现并调试一下。

首先,这里是原文的链接:https://www.52pojie.cn/thread-1432590-1-1.html

反调试

什么是反调试技术

反调试技术,顾名思义,就是一种用来防止程序被调试的技术。简单的反调试往往是识别是否被调试,如果是则退出程序、封禁账号等(检测)。更复杂的反调试可以在反汇编代码中插入花指令,使调试器的反汇编引擎无法正确解析反汇编指令(干扰)。门槛较高的反调试则可以从驱动层将调试权限清零,使得调试器失效等(权限清零)。反调试的手段可以大致归纳为:检测、干扰、权限清零三种常见手段。

反调试手段层出不穷,可以分为两类:0环(内核级调试)和3环(用户应用层调试)。之前在写对抗沙盒的时候,判断父进程是否是explorer.exe,不是则退出,似乎也可以作为一种简单的反调试手段。之前没怎么了解过反调试,最多听海哥说过可以检查句柄表。今天就学习一下,先看看Windows的反调试API,0环反调试等以后知识储备够了再学习。

IsDebuggerPresent

IsDebuggerPresent API可以确定调用过程是否正在由用户模式调试器调试。

参考链接:https://docs.microsoft.com/en-us/windows/win32/api/debugapi/nf-debugapi-isdebuggerpresent

CheckRemoteDebuggerPresent

CheckRemoteDebuggerPresent API可以确定是否正在调试指定的进程。

参考链接:https://docs.microsoft.com/en-us/windows/win32/api/debugapi/nf-debugapi-checkremotedebuggerpresent

开始调试

打开Crackme程序,界面看起来人畜无害。

如何绕过IsDebuggerPresent的反调试

查壳结果显示,这是一个64位的MFC程序,用C++编写,没有壳。

如何绕过IsDebuggerPresent的反调试

ASLR

什么是ASLR

维基百科:在计算机科学中,地址空间配置随机加载(英语:Address space layout randomization,缩写ASLR,又称地址空间配置随机化、地址空间布局随机化)是一种防范内存损坏漏洞被利用的计算机安全技术。ASLR通过随机放置进程关键数据区域的地址空间来防止攻击者能可靠地跳转到内存的特定位置来利用函数。现代操作系统一般都加设这一机制,以防范恶意程序对已知地址进行Return-to-libc攻击。

总的来说,ASLR就是将内存地址虚拟化,我们看到的内存地址并不是真正的内存地址偏移。

ASLR的作用

地址空间配置随机加载利用随机方式配置数据地址空间,使某些敏感数据配置到一个恶意程序无法事先获知的地址,令攻击者难以进行攻击。粗俗地说,就是使得每次调试工具(如OD、x64dbg等)加载程序后,地址是随机动态分配的,无法使用固定的地址进行定位。

ASLR的体现

用x64 debug打开程序。

如何绕过IsDebuggerPresent的反调试

到达系统断点,我们需要让他到达OEP,即程序入口点。

ALT+F9

如何绕过IsDebuggerPresent的反调试

这里地址是7FF6E.....

再看真实的入口点:

如何绕过IsDebuggerPresent的反调试

明显不一样。

用MFC编译出的64位程序默认是开启ASLR的。

关闭ASLR

找到可选PE头的DllCharacteristics属性,取消DYNAMIC_BASE。

如何绕过IsDebuggerPresent的反调试

如何绕过IsDebuggerPresent的反调试

回到真正的内存偏移。

如何绕过IsDebuggerPresent的反调试

关于DllCharacteristics可以参考:

https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-image_optional_header64

x64反调试

F9让程序运行,但是一运行程序就会直接结束,不会弹出窗口。

如何绕过IsDebuggerPresent的反调试

做到这里不禁让我想到直接写反杀箱的时候一样,一运行就挂。

大概代码是这样:

if (explorer_id == parent_id) {
    CeatRemoThread(explorer_id);
} else {
    exit(1);
}

只不过他这里是其他判断,比如是否被调试,是就直接exit,不是则执行下面的。

于是对ExitProcess下断点。

bp ExitProcess

如何绕过IsDebuggerPresent的反调试

下断点后直接F9运行到断点处。

观察此时的堆栈。

如何绕过IsDebuggerPresent的反调试

这里又返回到crakeme,猜想是否是判断是否在调试之后又回到原本的函数。

选中这一行按回车,跟进反汇编。

如何绕过IsDebuggerPresent的反调试

看到使用了IsDebuggerPresent来反调试。

IDA Pro x64反调试

进入IDA后,按G,并输入刚刚反汇编开始的地址。

如何绕过IsDebuggerPresent的反调试

跳转后。

如何绕过IsDebuggerPresent的反调试

选择startaddress。

如何绕过IsDebuggerPresent的反调试

F5进入伪代码。

如何绕过IsDebuggerPresent的反调试

这里很明确了,就是这个在反调试。

IDA pro 反反调试处理

可以直接在函数头部就直接ret,让他不走IsDebuggerPresent。

这里要用到IDA Pro的KeyPatch功能:

选中函数的头部,然后右键 → Key Patch → Patch:

如何绕过IsDebuggerPresent的反调试

接下来要将Patch完的结果导出到文件:

Edit→ Patch Program → Apply patches to input file。

如何绕过IsDebuggerPresent的反调试

OK即可。

如何绕过IsDebuggerPresent的反调试

验证反反调试处理

如何绕过IsDebuggerPresent的反调试

正式Crack

先随便输入一个数看看。

如何绕过IsDebuggerPresent的反调试

本来这里可以搜索字符串,但发现定位有些问题。

换一种思路,定位API,以前写Win32程序的时候,要想在dialog中输出一段字符串,用SetWindowText,这里可以用这个API定位。

bp SetWindowTextW

如何绕过IsDebuggerPresent的反调试

回车,断点就设置好了。

如何绕过IsDebuggerPresent的反调试

然后再点确定。

如何绕过IsDebuggerPresent的反调试

观察此时堆栈,出现了100和密码错误,并且有个返回函数。

如何绕过IsDebuggerPresent的反调试

选中返回函数那一行,回车。

找到附近的"密码正确"。

如何绕过IsDebuggerPresent的反调试

IDA Pro分析

跳转到刚刚"密码正确的地址"。

如何绕过IsDebuggerPresent的反调试

选中函数头部F5,进入伪代码。

如何绕过IsDebuggerPresent的反调试

得到:

如何绕过IsDebuggerPresent的反调试

说实话,这个伪代码不是很能直接看得懂,看了下原作者的,他调试的是Debug版的,跟这个Release版的还是有差别的,感觉Release版IDA很多都识别不了了。

附上作者关于密码的源代码:

void encodeCString(CString str) {                   //简单的字符串加密函数
    for (int i=0;ivoid CMFCApplication2Dlg::OnBnClickedButton1()
{
CString correctStr = L"密码正确";
CString errorStr = L"密码错误";
CString debugStr = L"检测到被调试";
BOOL flag = TRUE;
CString str = GetDlgItem(IDC_EDIT1)->GetWindowText();
CString strList[5];
long t1 = GetTickCount64();                     //获取开始时间

// TODO: 在此添加控件通知处理程序代码
if (str.GetLength() < 15 || str.GetLength() > 25) {
    flag = FALSE;
    encodeCString(errorStr);
    GetDlgItem(IDC_STATIC)->SetWindowTextW(errorStr);
} else {
    //password
    //610 - 520 - 666 - 233
    CString sToken = _T("");
    int i = 0; // substring index to extract
    while (AfxExtractSubString(sToken, str, i, '-')) {
        //以-进行分割
        //..//work with sToken
        //..
        strList[i] = sToken.Trim();                     //字符串去空格
        i++;
        if (i > 4) {
            //如果分割大于4,则不满足条件
            flag = FALSE;
            encodeCString(errorStr);
            GetDlgItem(IDC_STATIC)->SetWindowTextW(errorStr);
            break;
        }
    }
    if (i != 4) {
        //如果分割不等于4,不满足条件
        flag = FALSE;
        encodeCString(errorStr);
        GetDlgItem(IDC_STATIC)->SetWindowTextW(errorStr);
    } else {
        for (i = 0; i < 4; i++) {
            if (strList[i].CompareNoCase(_T("610")) != 0 &&
                strList[i].CompareNoCase(_T("520")) != 0 &&
                strList[i].CompareNoCase(_T("666")) != 0 &&
                strList[i].CompareNoCase(_T("233")) != 0) {
                flag = FALSE;
                encodeCString(errorStr);
                GetDlgItem(IDC_STATIC)->SetWindowTextW(errorStr);
                break;
            }
        }
        if (flag) {
            for (i = 0; i < 4; i++) {
                strList[i].MakeReverse();
            }
            if (strList[0].CompareNoCase(_T("016")) != 0 ||
                strList[1].CompareNoCase(_T("025")) != 0 ||
                strList[2].CompareNoCase(_T("666")) != 0 ||
                strList[3].CompareNoCase(_T("332")) != 0) {
                flag = FALSE;
                encodeCString(errorStr);
                GetDlgItem(IDC_STATIC)->SetWindowTextW(errorStr);
            }
        }
    }
}

//判断标记
if (flag) {
    encodeCString(correctStr);
    GetDlgItem(IDC_STATIC)->SetWindowTextW(correctStr);
}

Sleep(500);
long t2 = GetTickCount64();                     //获取结束时间
if (t2 - t1 >= 560) {                            //如果时间差大于等于560则超时,是被调试的情况
    encodeCString(debugStr);
    GetDlgItem(IDC_STATIC)->SetWindowTextW(debugStr);
}

}

可以看到跟IDA生成的伪代码差距还是比较大,但还是不影响用源码分析一波算法。

  1. 通过GetTickCount64获取自系统启动以来经过的毫秒数,变量t1。

    GetTickCount64:https://docs.microsoft.com/en-us/windows/win32/api/sysinfoapi/nf-sysinfoapi-gettickcount64

  2. 获取输入的密码长度,如果长度小于15,或大于25,就赋值flag=false,然后SetWindowText"密码错误",并且可以看到这个字符串是由encodeCString加密了的,所以如果一开始如果想直接找字符串,可能就无法准确定位。

  3. AfxExtractSubString:https://docs.microsoft.com/en-us/cpp/mfc/reference/cstring-formatting-and-message-box-display?view=msvc-160

    这个API可用于从给定的源字符串中提取子字符串,通过这个API的返回值可以判断有几个"-",如果是4段密码,且以“-”分割,就可以进入比较字符串环节。

  4. CompareNoCase:https://docs.microsoft.com/en-us/windows/win32/api/chstring/nf-chstring-chstring-comparenocase

    该函数使用lstrcmpi函数对一个CString和另一个CString进行比较。

    返回值为:

    由参数lpsz指定这个用于比较的string。如果两个对象完全一致则返回0,如果小于lpsz,则返回-1,否则返回1。

    这里不等于-1就行,也就是不小于。

  5. MakeReverse:https://docs.microsoft.com/en-us/windows/win32/api/chstring/nf-chstring-chstring-makereverse

    功能大概就是反转字符串,所以四个数为610,520,666,233。

  6. 最后有一个计算时间差。

所以总结一下就是:长度满足15-25之间,以“-”分割成4段,每段分别为610、520、666、233,反转后分别为016、025、666、332。

比如这样:

如何绕过IsDebuggerPresent的反调试

但是这个小程序我还是发现不少bug,比如:

如何绕过IsDebuggerPresent的反调试

还有这样写的话程序会直接崩掉:

如何绕过IsDebuggerPresent的反调试

后记

作为学习反反调试的初级阶段,重要的是使用x64 debug和IDA Pro分析的过程,这个还是很有帮助的。

脑海中又浮现了海哥的话:“没有好的正向基础就不会有好的逆向基础。”

如何绕过IsDebuggerPresent的反调试

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
作者最新文章
软件教程 API
相关文章 更多
精品专题 更多
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

PDF教程

正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

IOS软件

正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

AI

正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

Mac软件 更多
WPS Office macOS版
WPS Office macOS版

WPS Office是一款面向macOS用户的综合办公套件,将文字处理、电子表格、演示文稿、PDF工具、模板与云协作整合在同一应用中。它兼容常见Microsoft Office格式,支持Intel及Apple芯片Mac,基础功能可免费使用,

Shapr3D macOS版
Shapr3D macOS版

Shapr3D是一款面向工业设计、机械工程、建筑概念和三维打印工作流的CAD软件。Mac版采用Parasolid建模内核,支持草图约束、实体建模、工程图、可视化渲染及常见CAD格式交换,并可通过账户在多台设备之间同步项目。

REAPER macOS版
REAPER macOS版

REAPER是Cockos开发的数字音频工作站,提供多轨音频与MIDI录制、剪辑、处理、混音和母带制作工具。Mac版兼容Intel与Apple芯片,支持AU、VST、VST3、CLAP等插件格式,并提供高度可定制的工作流程。

Ableton Live macOS版
Ableton Live macOS版

Ableton Live 是面向音乐制作人与现场表演者的数字音频工作站,提供编曲视图、独具特色的现场视图、音频录制、MIDI创作、实时变速、乐器及效果器。Mac版原生支持Apple芯片,并可连接音频接口、MIDI控制器和第三方插件。

Adobe After Effects macOS版
Adobe After Effects macOS版

Adobe After Effects 是面向动态图形、影视特效与视频合成的专业创作软件。它提供关键帧动画、遮罩抠像、运动跟踪、三维空间、文字动画和表达式等工具,并可与 Premiere Pro、Photoshop、Illustrator

Adobe Audition macOS版
Adobe Audition macOS版

Adobe Audition 是面向播客、影视后期、音乐制作及内容创作者的专业音频工作站,提供波形精修、多轨录制与混音、频谱编辑、降噪修复、响度匹配和效果处理工具,并可与 Adobe Premiere 协同完成视频声音制作。

Adobe Bridge macOS版
Adobe Bridge macOS版

Adobe Bridge 是面向摄影师、设计师及内容团队的免费数字资产管理工具,可集中预览照片、视频和 Adobe 项目文件,并利用评级、标签、关键词、元数据、筛选与收藏集完成分类检索。它还支持批量重命名、格式导出、相机导入及 Camera

Adobe Illustrator macOS版
Adobe Illustrator macOS版

Adobe Illustrator 是 Adobe 推出的专业矢量图形设计软件,适合在 Mac 上制作标志、图标、插画、包装、信息图及印刷版面。它以路径和锚点构建可无损缩放的图形,并提供钢笔、形状、文字、图像描摹、渐变、画板及生成式功能。

Adobe InDesign macOS版
Adobe InDesign macOS版

Adobe InDesign 是面向印刷品与数字出版物的专业版面设计软件,可在 Mac 上制作书籍、杂志、宣传册、海报、报告及交互式文档。它提供精细的文字样式、网格、母版、长文档管理和印前输出能力。

Adobe Lightroom Classic macOS版
Adobe Lightroom Classic macOS版

Adobe Lightroom Classic 是面向桌面摄影工作流的照片管理与后期处理软件,可将原始照片保存在本地硬盘,通过目录、关键词、评分和收藏夹高效整理图库,并提供 RAW 冲印、蒙版、镜头校正、批量同步及多格式导出等功能。

Adobe Media Encoder macOS版
Adobe Media Encoder macOS版

Adobe Media Encoder 是 Adobe 推出的专业音视频编码与转码工具,可通过队列、预设和监视文件夹批量完成格式转换、代理文件创建及多平台成片输出,并与 Premiere Pro、After Effects 等软件紧密协作。

Adobe Photoshop macOS版
Adobe Photoshop macOS版

Adobe Photoshop 是面向摄影师、设计师和内容创作者的专业图像处理软件,提供图层、蒙版、选区、修复、调色、文字排版、智能对象及生成式编辑等能力。Mac 版支持 Intel 与 Apple Silicon 处理器。

WINDOWS 更多
Adobe InDesign Windows版
Adobe InDesign Windows版

Adobe InDesign 是面向印刷与数字出版的专业页面排版工具,可制作书籍、杂志、宣传册、海报、交互式 PDF 和电子书。它提供精细的文字样式、多页面管理、印前检查及多格式输出能力,并能与 Photoshop、Illustrator

Adobe Illustrator Windows版
Adobe Illustrator Windows版

Adobe Illustrator 是用于绘制矢量图形、插画、图标、徽标和版式的专业设计工具。它以路径和锚点为核心,作品放大后仍能保持清晰,并提供画板、文字、渐变、图像描摹及精确变换等功能,适合品牌视觉、印刷物料、数字界面和商业插画创作。

Adobe Bridge Windows版
Adobe Bridge Windows版

Adobe Bridge 是 Adobe 推出的创意资产管理工具,可集中预览、分类和查找照片、视频、PDF及多种设计文件,并支持元数据、关键词、评级、批量重命名和格式导出。它可与 Photoshop、Illustrator 等应用衔接,

Affinity Photo Windows版
Affinity Photo Windows版

Affinity Photo 是一款面向摄影师、修图师和视觉设计人员的桌面图像编辑工具,提供 RAW 显影、多图层合成、蒙版、实时滤镜、批处理和色彩管理等功能。原独立产品已停止销售,其照片编辑能力已延续至免费的新 Affinity 应用;

Adobe Lightroom Classic Windows版
Adobe Lightroom Classic Windows版

Adobe Lightroom Classic 是面向 Windows 桌面摄影工作流的照片管理与无损编辑工具,可通过目录集中整理大型图库,并完成 RAW 显影、局部蒙版、批量调整、打印和多格式导出。它强调本地文件管理与精细控制,

Figma Windows版
Figma Windows版

Figma 是面向产品设计与开发团队的云端协作平台,可在 Windows 桌面客户端中完成界面绘制、组件管理、交互原型、评论评审和开发交付。文件保存在云端,多名成员能够同步编辑并共享设计系统;官方同时提供免费 Starter 方案及按席位计

Affinity Designer Windows版
Affinity Designer Windows版

Affinity Designer 是面向矢量图形、数字插画和界面设计的专业创作工具,可在矢量、像素与导出工作区之间快速切换。它提供曲线编辑、形状构建、画板、排版、图层和专业色彩管理,并支持常见设计文件的导入及多种印刷、网页格式输出。

Capture One Pro Windows版
Capture One Pro Windows版

Capture One Pro 是面向摄影师和影像团队的专业桌面照片处理工具,提供相机定制色彩配置、RAW转换、图层与蒙版、联机拍摄、目录及会话管理等功能。它适合棚拍、人像、商业产品、婚礼和风光摄影,

Adobe Acrobat Pro Windows版
Adobe Acrobat Pro Windows版

Adobe Acrobat Pro 是面向专业 PDF 工作的综合解决方案,可在 Windows 中创建、编辑、转换、比较、整理和保护文档,并支持表单、电子签名、扫描件文字识别及敏感信息永久遮盖。订阅还包含网页、移动服务和云端协作能力,

Adobe After Effects Windows版
Adobe After Effects Windows版

Adobe After Effects 是面向动态图形、动画与影视视觉特效制作的专业工具,可完成关键帧动画、图层合成、遮罩跟踪、抠像、文字动画和二维三维元素整合。Windows 版通过 Adobe Creative Cloud 安装及更新,

DaVinci Resolve Windows版
DaVinci Resolve Windows版

DaVinci Resolve是Blackmagic Design推出的一体化影视后期工具,将素材管理、非线性剪辑、专业调色、Fusion视觉特效、Fairlight音频处理和成片交付整合在统一工程中。免费版已覆盖多数个人创作需求,

Adobe Media Encoder Windows版
Adobe Media Encoder Windows版

Adobe Media Encoder 是 Adobe 面向视频与音频制作流程提供的专业编码和转码工具,可批量处理媒体文件、创建代理、套用输出预设并监控文件夹自动执行任务。它与 Premiere、After Effects、Audition