首页
社区
课程
招聘
[原创]动态分析程序内部调用系统级异常处理函数后的跟踪调试方法
发表于: 2008-5-5 16:40 7556

[原创]动态分析程序内部调用系统级异常处理函数后的跟踪调试方法

2008-5-5 16:40
7556
/////////////////////////////////////////////////////////////////////////////////
文章名称:动态分析程序内部调用系统级异常处理函数后的跟踪调试方法
文章类型:逆向工程、异常处理调试分析
编写作者:Coderui
编写日期:2008年05月06日
作者博客:25bK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3S2A6i4K6u0W2j5X3q4A6k6s2g2Q4x3X3g2U0L8$3#2Q4x3V1k6U0L8$3c8W2M7Y4g2A6
/////////////////////////////////////////////////////////////////////////////////
需要解决的问题:
  一个病毒程序的壳脱掉了,但是调试到程序内部的入口时,病毒作者又自己写了几个创造异常的函数,来干扰病毒分析人员进行动态调试分析。
  程序内部使用的异常处理和壳中使用的异常处理结构机制是一点也不一样的。
  壳创造的异常是由壳中的代码去处理的异常,可以很轻松找到异常处理所指向的代码地址。因为这些处理都是在当前程序的领空中,结构也十分的简单,很容易找到。
  但是有些程序在内部创造的异常就不一样了,他们的异常处理函数部分都是由系统去完成的,就算跟进去(系统领空),里边的代码都是些系统对异常的“处理机制”和“结构嵌套模块”等,一层套一层,一个CALL(函数)套N个CALL(函数),把你转的晕晕忽忽的,辛苦到最后不但没找到返回的代码地址,还把病毒程序给跑飞了,那个郁闷、那个恼火呀:(。

问题的解决方法:
  研究了研究,想了想,其实解决的方法也十分简单。当我们所跟踪的病毒程序进入到真正入口以后,在程序内部可能会带有开发作者特意制造的干扰异常,那么我们可以采用以下方法来进行快速处理。使用OD把病毒主程序载入打开,然后[F9]一次,现在程序遇到异常停在系统领空,我们对主程序代码段下内存断点,然后按一次[Shift + F9]跳过异常继续运行,接着再按几次[F9]后,程序就会回到当前调试程序的领空了。所在代码行,就是调用系统异常处理后病毒要继续执行的恶意代码,也就是病毒作者不想让我们调试分析的病毒功能代码。看样子奸猾的病毒,又要被更多的人彻底的解剖分析了,呵呵。
/////////////////////////////////////////////////////////////////////////////////

[招生]科锐逆向工程师培训(2025年3月11日实地,远程教学同时开班, 第52期)!

收藏
免费 0
支持
分享
最新回复 (20)
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
2
真是勤快
2008-5-5 18:09
0
雪    币: 207
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
不停的按执行到返回,就可以回到源程序的领空了
2008-5-5 19:46
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢,学习了
2008-5-5 19:54
0
雪    币: 207
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
修正一下错误,用我说的方法按执行到返回(ctrl+F9)和楼主的方法下当前段的内存访问断点都是有局限性的:我的返回到的地方已经过了一些代码了(最糟糕的,还不一定返回的来),楼主的如果程序不是返回到当前段,而是其他的地方也是拦截不住的(可以对付大多数情况)。最有效的方法是F7跟进系统代码里,几个ret后会看到ZWContinue函数一定要F7跟进,它会调用ntdll.KiFastSystemCall(不知道有没有写对!)也是一定要F7跟进,里面有着sysenter指令,你F8过了这条指令就返回了,很有效,貌似可以针对任何情况。
ExeStealth的壳就是采用这种方法的,第一个SEH可以用楼主的方法返回,壳跳转到OEP的方法也是这样的,但是它跳到的是另一个段,跟进系统空间后返回就可以dump下来,用一级跟踪修复IAT表就轻松搞定了。顺便就说一下ExeStealth这个壳的特点和脱壳方法,对象不是新版的,版本号忘了(汗呀!)从二哥的豪华版脱壳进阶哪里下的:这个壳最主要的优点在于流程非常清晰,特别适合有一些基础的脱壳手练习,有一些很弱的花指令,壳程序位于最后一个段,有两段自修改壳程序的SMC代码,进入后有一段,然后就是进入系统空间的SEH,用楼主或我上面说的来返回,有一个检测IsDebuggerpresent函数的反调试,里面所有的函数名字符串都是加密了的,临时解密出来用LoadLibrary和GetProcAddress函数获取,然后就马上填充00覆盖了,原程序的段解密在SEH后面进行,动态申请空间,IAT表都是在动态内存里,然后就是00覆盖掉已经执行的壳代码,又是一个进入系统空间的SEH,从sysenter返回后就可以dump了,由于IAT表在动态内存里,调用函数都是先跳到动态内存地址再跳进系统函数里,用OD的dump功能dump下来,重建输入表功能太弱不使用,用Import的一级追踪就全部出来了。真的,这个壳的特点就是流程太明显了,没有垃圾操作,单步下来,全部都是一个壳应该做的事,很清晰明了,适合练手!!!

还搞不懂它的运行机制,今天太晚了,明天好好复习一下seh,看看到底是什么因素影响着这种SEH方式的返回地址。当然希望高手进来给予解答一下或指点一下,不胜感激!!!!
2008-5-5 23:56
0
雪    币: 288
活跃值: (53)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
6
[QUOTE='UD]Arthas;449890']修正一下错误,用我说的方法按执行到返回(ctrl+F9)和楼主的方法下当前段的内存访问断点都是有局限性的:我的返回到的地方已经过了一些代码了(最糟糕的,还不一定返回的来),楼主的如果程序不是返回到当前段,而是其他的地方也是拦截不住的(可以对付大多数情况)。最有效的方法是F7跟进系统代码里,几个ret...[/QUOTE]

谢谢你回复了这个多,呵呵。
我写的方法是调试程序内部异常处理用的。目前处理后的代码都是在代码段,所以内存断点有效。这个方法不是调试壳中异常处理的,上边有注明。

如果都[F7]进去,要跟的代码太多,一个内存访问断点就搞定了。

[Shift+F9]是不行的。在程序内部肯定跑飞。

当前提到的程序内部异常处理是作者在进入程序入口处后,特意加的保护处理。就是为了干扰别人调试用的。
2008-5-6 09:48
0
雪    币: 288
活跃值: (53)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
7
我博客天天更新,呵呵。只是选点好玩的发来,哈哈。
斑竹好啊
2008-5-6 09:50
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
不错啊,学习了!
2008-5-6 10:00
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
这个是不是和SDK的原理差不多呢?
2008-5-6 10:22
0
雪    币: 288
活跃值: (53)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
10
今天把文章题目和内容修改了下,这样会表达的更加明确些。
2008-5-6 13:25
0
雪    币: 288
活跃值: (53)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
11
貌似没关系,可能我们说的不是一个东西,呵呵。
2008-5-6 13:26
0
雪    币: 288
活跃值: (53)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
12
只知道一个病毒的原理是不行的,想看原理直接IDA就OK。
但如果想按照病毒所执行的顺序去动态跟踪分析程序,那么必须得突破这个恶意的异常处理干扰,才能知道执行完毕这个系统异常处理后,病毒接着最先执行了什么恶意代码,然后执行了什么恶意代码,这些光靠猜测是不准的。
2008-5-6 13:39
0
雪    币: 207
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
13
更新了一点东西,添加上了ExeStealth壳的运行流程和脱壳方法。
虽然我说的第一个方法很垃圾,但还是纠正一下,我说的是执行到返回(ctrl+F9),不是忽略执行(shift+F9),至于说跟进系统空间代码太多的问题,我没有见过楼主的病毒不知道,在我举例的这个壳里面,很短的,你F8执行下来ret后马上就可以看到ZWContinue函数了,进去后sysenter指令就近在眼前了,很快速。
2008-5-6 14:40
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
我还是没明白

我的理解是这个病毒调用的都是系统的东西,比如一写注册表,都去让系统来完成,自己只是负责调用和分配任务,如果脱离了这个系统,那么这个病毒就毫无作用,也就是无法运行,貌似壳子的SDK也是这个样子的,这些都是我的个人看法,如果有什么不对,还望各位大大能够指出来,不要笑话我
2008-5-6 15:16
0
雪    币: 288
活跃值: (53)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
15
[QUOTE='UD]Arthas;450158']更新了一点东西,添加上了ExeStealth壳的运行流程和脱壳方法。
虽然我说的第一个方法很垃圾,但还是纠正一下,我说的是执行到返回(ctrl+F9),不是忽略执行(shift+F9),至于说跟进系统空间代码太多的问题,我没有见过楼主的病毒不知道,在我举例的这个壳里面,很短的,你F8执行下来ret...[/QUOTE]

我们说的好象不是同一个种类的异常处理。
您说的始终是壳制造的异常,所以处理代码短。
我说的是程序中的异常,不是壳。是程序调用MFC框架类构造的异常,需要跟很多代码的。

我明白您说的是“(ctrl+F9)”,我写的(shift+F9)是我方法中需要用到的。在某些情况下是不可以“(ctrl+F9)”的,程序会运行出错或跑飞。

您可能没看懂我写的内容的关键点,我们讨论的不是一个话题。您说的是壳内,我说的是程序内部。
2008-5-6 17:35
0
雪    币: 288
活跃值: (53)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
16
呵呵,我们说的不是一个话题。这个和SDK和壳和异常处理的方式无关。

是介绍:开发人员故意在程序的开头制造一个或多个异常,使用系统提供的方式去处理这个异常,然后捕捉处理异常后,要执行的代码的位置。主要是介绍使用简单方法获得异常处理后要执行代码的位置,不是怎么处理的异常。:)
2008-5-6 17:40
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
我明白了,就是那个病毒作者在使坏
2008-5-6 21:53
0
雪    币: 207
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
18
最后顶一下,大家还是让它沉下去吧,呵呵
2008-5-6 22:40
0
雪    币: 202
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
最不喜欢动态调试了

每次都看得晕晕的

佩服LZ精神
2008-5-6 23:30
0
雪    币: 288
活跃值: (53)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
20
呵呵,感谢大家还回来看看帖子。
这个文章里的内容在逆向程序时,还是很有用处的。
我就常在我的程序入口内,在程序工作前,做些干扰性的异常(比如MFC类的异常处理),貌似反动态跟踪效果还不错,呵呵。最起码可以难住那些菜鸟们。
2008-5-7 09:40
0
雪    币: 223
活跃值: (185)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
21
对我还很有用的,谢谢。
2008-6-4 03:24
0
游客
登录 | 注册 方可回帖
返回