首页
社区
课程
招聘
[原创]基于int3异常实现动态反调试(简单实例)
发表于: 2021-5-3 12:49 10280

[原创]基于int3异常实现动态反调试(简单实例)

2021-5-3 12:49
10280

先回顾一下之前的异常处理

对于正常运行的程序来说,如果触发了异常,操作系统则会交由程序自己已经注册过的SEH来处理,如果进程内部没有具体的SEH,那么相关异常就无法处理,操作系统就会启动默认的异常处理机制,终止进程运行。

对于调试运行时,进程内部发生异常,os会首先把异常抛给进调试进程处理,当被调试者发生异常时,调试器就会暂停运行,必须采取某种措施来处理异常(直接修改异常或将异常抛给被调试者,最后才是OS默认的异常处理机制),完成后继续调试。

一般而言,异常处理器内部都含有修改eip的代码。即使我们能够在调试器中设置将对应的异常直接抛给程序自身的SEH处理,但即便如此,如果在异常处理器内部适当应用些静态反调试技术,也能轻松判断进程是否处于调试状态,而且EIP在异常处理器内部怎么变化也是不知道的,这代表我们必须跟进异常处理器才能一探究竟,从而继续调试。

将程序拖入x32dbg,F9运行到程序EP,然后逐渐调试

图片描述

当运行到如图所示时,我们再次单步,就会直接退出调试

安装新的SEH:

触发断点异常

访问非法地址,无法继续调试(如果调试器不将异常抛给程序,那么就会执行这里,就会退出调试)

新安装的SEH异常处理函数

删除安装的SEH

让调试器直接忽略int3异常,将其直接抛给程序自己处理

图片描述
图片描述

然后我们在程序新安装的SEH下个断点查看是否已经派发到程序了

图片描述

然后F9运行,若执行了程序的SEH,则代表我们设置成功,调试器将异常抛给了程序处理

图片描述
之后我们便可忽略int3,继续调试
图片描述

 
 
 
 
 
00401011 | 68 2C104000              | push dynad_seh.40102C                   |
00401016 | 64:FF35 00000000         | push dword ptr fs:[0]                   |
0040101D | 64:8925 00000000         | mov dword ptr fs:[0],esp                |
00401011 | 68 2C104000              | push dynad_seh.40102C                   |
00401016 | 64:FF35 00000000         | push dword ptr fs:[0]                   |

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 5
支持
分享
最新回复 (3)
雪    币: 137
活跃值: (1350)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
同理的还有debugprint异常
bool IsDebugged()
{
    __try
    {
        RaiseException(DBG_PRINTEXCEPTION_C, 0, 0, 0);
    }
    __except(GetExceptionCode() == DBG_PRINTEXCEPTION_C)
    {
        return false;
    }

    return true;
}
不过处理方法还是一样的
2021-5-6 21:16
0
雪    币: 248
活跃值: (3789)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
huojier 同理的还有debugprint异常 bool IsDebugged() { __try { RaiseException(DBG_PRINTEXCEPTION ...
也可以在调试器里面忽略
2021-5-6 22:01
0
雪    币: 3668
活跃值: (9335)
能力值: ( LV9,RANK:319 )
在线值:
发帖
回帖
粉丝
4
感谢,大家一起进步
2021-5-8 02:20
0
游客
登录 | 注册 方可回帖
返回
//