首页
论坛
课程
招聘
[调试逆向] [软件保护] [其他内容] [原创]基于int3异常实现动态反调试(简单实例)
2021-5-3 12:49 2471

[调试逆向] [软件保护] [其他内容] [原创]基于int3异常实现动态反调试(简单实例)

2021-5-3 12:49
2471

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

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

 

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

 

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

 

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

一:运行和初步调试程序

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

 

图片描述

 

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

二:分析关键汇编

安装新的SEH:

1
2
3
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                |

触发断点异常

1
00401024 | CC                       | int3                                    |

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

1
2
00401025 | B8 FFFFFFFF              | mov eax,FFFFFFFF                        |
0040102A | FFE0                     | jmp eax                                 |

新安装的SEH异常处理函数

1
2
3
4
5
0040102C | 36:8B4424 0C             | mov eax,dword ptr ss:[esp+C]  |获取CONTEXT结构体指针
00401031 | BB 40104000              | mov ebx,dynad_seh.401040      |
00401036 | 3E:8998 B8000000         | mov dword ptr ds:[eax+B8],ebx |设置EIP为0x401040
0040103D | 33C0                     | xor eax,eax                   |返回值置为0
0040103F | C3                       | ret                           |

删除安装的SEH

1
2
00401040 | 64:8F05 00000000         | pop dword ptr fs:[0]                    |
00401047 | 83C4 04                  | add esp,4                               |

三:破解

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

 

图片描述
图片描述

 

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

 

图片描述

 

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

 

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


第五届安全开发者峰会(SDC 2021)议题征集正式开启!

上传的附件:
收藏
点赞3
打赏
分享
最新回复 (3)
雪    币: 145
活跃值: 活跃值 (515)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
huojier 活跃值 2021-5-6 21:16
2
0
同理的还有debugprint异常
bool IsDebugged()
{
    __try
    {
        RaiseException(DBG_PRINTEXCEPTION_C, 0, 0, 0);
    }
    __except(GetExceptionCode() == DBG_PRINTEXCEPTION_C)
    {
        return false;
    }

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