-
-
[原创]基于int3异常实现动态反调试(简单实例)
-
2021-5-3 12:49
9050
-
[原创]基于int3异常实现动态反调试(简单实例)
基于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 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,继续调试
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法