-
-
[原创]异常处理流程(一) 异常处理三剑客
-
发表于:
2018-5-9 17:35
6544
-
异常处理流程是学习逆向中至关重要的一环,我们试图揭开异常处理流程的神秘面纱。
调试器:OllyDbg
环境:WIN XP SP3 虚拟机
异常处理的本质是一个外部中断。中断是计算机硬件的一个重要概念,这里分享一个百度百科的解释给不清楚的朋友参考。
https://baike.baidu.com/item/%E4%B8%AD%E6%96%AD/3933007?fr=aladdin
具体讲,就是在遇到异常时,程序会跳出正常的程序执行流程,执行一段远在程序代码之外的代码,这段代码叫SEH(
Structured Exception Handling
)结构化异常处理函数。顾名思义是处理异常的专用函数。很多壳会利用系统的这一特性实现反调试,可谓是别出心裁了。只要有想法,任何一个不起眼的函数或者机制都可以摇身一变成为反调试的利器。本例就是如此
初次配置反调试插件时,首先忽略所有异常,用插件把FindWindow和IsDebuggerPresent过掉,保存,重启,让插件生效。
载入OD,发现运行以后停下来,显示无法处理的异常,很奇怪,明明忽略所有的异常,为什么还会因为异常被断下?
遇到这情况,需要明白异常区前都执行了什么函数
载入程序,首先来了解一些,SetUnhandleExeptionFilter函数的作用
翻译第二段:当这个函数调用完成后,如果一个未调试器调试的进程有异常发生后,异常会让这个进程运行结构化异常处理函数(SEH),这个函数(原文是filter,不是function。所以这里是意译)会调用由
lpTopLevelExceptionFilter所指定的异常处理函数。
所以这个函数很关键很关键很关键。
这个函数怎么用呢?我们看一下。
查看函数列表,有这个函数,下断(请思考,如果没有该怎么办呢?)
该函数的参数很重要,它要做的事很重要
断下,看堆栈:
Cal到SetUnhandledExceptionFilter来自00401005
Ptoplevelfilter=00401108
返回到7c81776f
给00401108设置断点bp 401108,这个参数就是
lpTopLevelExceptionFilter 。它是一个专门处理异常的函数的首地址,有异常就执行这个函数。
然而这里401108不是处理异常的,一点异常处理的功能都没有,由于无法处理,系统就自动退出了,实现了反调试。作者很有想法,他的思路值得我们借鉴。
SetUnhandledExceptionFilter
这个函数的返回值有三种情况:
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2018-5-11 12:29
被r0Cat编辑
,原因: