8.8 异常处理机制反调试

异常,处理,机制,调试 · 浏览次数 : 6

小编点评

**异常处理函数的安装和调试:** 1. **安装异常处理函数:** - 使用 `SetUnhandledExceptionFilter()` 函数安装自定义异常处理函数。 - 自定义函数应该接收异常信息并返回 `EXCEPTION_CONTINUE_EXECUTION`。 2. **设置 IsDebug 函数:** - 使用 `IsDebug()` 函数检查是否被调试器附加。 - 如果被调试器附加,则执行 `_asm call pBuff` 指令,其中 `pBuff` 是一个指向要执行的代码的指针。 3. **调试器忽略 int3 中断:** - 在调试器中,要确保“忽略 int3 中断”选项被勾选。 4. **在程序启动前安装异常处理函数:** - 在程序启动前使用 `SetUnhandledExceptionFilter()` 安装自己的异常处理函数。 5. **在调试器中设置断点:** - 在调试器中设置断点在需要调试的代码段上。 **示例代码:** ```c #include #include BOOL IsDebug() { // 检查是否被调试器附加 return FALSE; } void ExceptionFilter(PEXCEPTION_POINTERS ExceptionInfo) { // 处理异常 } int main() { if (!IsDebug()) { printf("[-] 程序正在被调试 \\"); } // 设置异常处理函数 SetUnhandledExceptionFilter(ExceptionFilter); // 设置断点 __int32 break_point = 10; _asm { push eax mov eax, 4ch jmp break_point // 编写要执行的代码 } _asm { pop eax } return 0; } ``` **注意:** - 该代码仅供参考,可能需要根据实际需求进行修改。 - 在调试程序时,请确保异常处理函数正常执行。

正文

通常可以通过在程序中设置异常处理函数,并在其中发起一个异常,然后判断程序是否已经被调试器附加来实现反调试。如果异常处理函数没有被触发,则说明程序已经被调试器附加;如果异常处理函数被触发,则说明程序没有被调试器附加。

安装异常处理函数并手动触发,此时如果被调试器附加,则会不走异常处理流程,此时IsDebug将会返回默认的False,并直接走_asm call pBuff;在调试器不忽略int3中断的情况下,调试将会被终止。

#include <Windows.h>
#include <stdio.h>

BOOL Exceptioni = FALSE;

LONG WINAPI ExceptionFilter(PEXCEPTION_POINTERS ExceptionInfo)
{
    Exceptioni = TRUE;
    return EXCEPTION_CONTINUE_EXECUTION;
}

BOOL IsDebug()
{
    ULONG OldProtect = 0;
    LPTOP_LEVEL_EXCEPTION_FILTER lpsetun;
    
    // 安装自己实现的 ExceptionFilter 自定义异常处理函数
    lpsetun = SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)ExceptionFilter);
    LPVOID pBuff = VirtualAlloc(NULL, 0x1000, MEM_COMMIT, PAGE_READWRITE);
    
    *((PWORD)pBuff) = 0xc3;
    
    VirtualProtect(pBuff, 0x1000, PAGE_EXECUTE_READ | PAGE_GUARD, &OldProtect);

    _asm call pBuff;                       // 如果被调试,则执行中断,不会进行异常处理
    SetUnhandledExceptionFilter(lpsetun);  // 恢复异常处理
    return Exceptioni;
}

int main(int argc, char * argv[])
{
    if (!IsDebug())
    {
        printf("[-] 程序正在被调试 \n");
    }

    system("pause");
    return 0;
}

与8.8 异常处理机制反调试相似的内容:

8.8 异常处理机制反调试

通常可以通过在程序中设置异常处理函数,并在其中发起一个异常,然后判断程序是否已经被调试器附加来实现反调试。如果异常处理函数没有被触发,则说明程序已经被调试器附加;如果异常处理函数被触发,则说明程序没有被调试器附加。安装异常处理函数并手动触发,此时如果被调试器附加,则会不走异常处理流程,此时`IsDebug`将会返回默认的`False`,并直接走`_asm call pBuff;`在调试器不忽略`i

Abp vNext 入门到放弃系列

文章目录 1.模块介绍 2.模块加载机制 3.依赖注入 4.AutoMapper-- 待定 5.本地化--待定 6.模型验证--待定 7.异常处理--待定 8.缓存 9.动态代理和拦截 10.分布式锁 11.领域驱动设计 Abp vNext Pro Abp Vnext Pro Github地址 的

【踩坑】.NET 8.0 自定义IExceptionHandler不生效

中间件实现异常处理 在ASP.NET Core里,我们可以使用中间件(Middleware)实现全局的异常处理。 如内置的异常处理中间件 UseExceptionHandler app.UseExceptionHandler(appError => { appError.Run(async cont

< Python全景系列-8 > Python超薄感知,超强保护:异常处理的绝佳实践

欢迎来到系列第八篇,异常处理的深入探讨。本文将分五部分展开。首先,我们将学习Python异常处理的基础知识,理解`try/except`语句的用法。然后,我们将了解Python的常见异常类型并通过实例理解它们的作用。第三部分,我们将更深入地解析`try-except`块,理解其工作原理及更加复杂的用法。在第四部分,我们会介绍如何自定义异常,并讨论其应用场景。最后,我们将介绍上下文管理器在异常处理中

8个实用的Java Streams API

分享8个开箱即用的API,方便日常处理集合。 1. 快速过滤空值:Stream.ofNullable 该方法是在 Java 9 中引入的,有助于过滤集合中的所有空值,从而可能使我们避免空指针异常。 在下面的示例中,有一个包含 null 的List。此时,我们可以使用Stream.ofNullable

[转帖]Oracle、MySQL、PG是如何处理数据库“半页写”的问题的?

数据库“断页”是个很有意思的话题,目前任何数据库应该都绕不过去。我们知道数据库的块大小一般是8k、16k、32k,而操作系统块大小是4k,那么在数据库刷内存中的数据页到磁盘上的时候,就有可能中途遭遇类似操作系统异常断电而导致数据页部分写的情况,进而造成数据块损坏,数据块损坏对于某些数据库是致命的,可

基于pandas的数据清洗 -- 异常值的清洗

博客地址:https://www.cnblogs.com/zylyehuo/ 开发环境 anaconda 集成环境:集成好了数据分析和机器学习中所需要的全部环境 安装目录不可以有中文和特殊符号 jupyter anaconda提供的一个基于浏览器的可视化开发工具 自定义一个1000行3列(A,B,C

分布式事务提交慢的一次总结和思考

分布式事务提交慢的一次总结和思考 背景 分布式事务未提交 是应用程序出现宕机异常的很重要的一原因. 应用宕机主要可以分为: 1. 内存泄露导致的OOM宕机. 表现在系统越来越慢, 应用的内存和CPU占用量越来越高. 最终达到无响应的状态, 此时数据库一般是正常的. 2. 分布式事务未提交导致的宕机,

SpringBoot 整合 EasyExcel 实现自由导入导出,太强了

在实际的业务系统开发过程中,操作 Excel 实现数据的导入导出基本上是个非常常见的需求。 之前,我们有介绍一款非常好用的工具:EasyPoi,有读者提出在数据量大的情况下,EasyPoi 会占用内存大,性能不够好,严重的时候,还会出现内存异常的现象。 今天我给大家推荐一款性能更好的 Excel 导

微服务17:微服务治理之异常驱逐

★微服务系列 微服务1:微服务及其演进史 微服务2:微服务全景架构 微服务3:微服务拆分策略 微服务4:服务注册与发现 微服务5:服务注册与发现(实践篇) 微服务6:通信之网关 微服务7:通信之RPC 微服务8:通信之RPC实践篇(附源码) 微服务9:服务治理来保证高可用 微服务10:系统服务熔断、