-
-
[原创]基于int3异常实现动态反调试(简单实例)
-
发表于:
2021-5-3 12:49
10279
-
[原创]基于int3异常实现动态反调试(简单实例)
先回顾一下之前的异常处理
对于正常运行的程序来说,如果触发了异常,操作系统则会交由程序自己已经注册过的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直播授课