首页
社区
课程
招聘
[求助]为什么还有异常还有其他原因吗?
发表于: 2005-10-20 17:32 4123

[求助]为什么还有异常还有其他原因吗?

2005-10-20 17:32
4123
小弟我在做进阶篇联系的时候.碰到一个郁闷的问题~~~~~~
下面是第三教程所说的
找Oep时注意两点。
1、单步往前走,不要回头。
2、观察。注意poshad、poshfd,popad、popfd等,和外壳代码处对应,注意地址发生大的变化。单步跟踪什 么时候F8走,F7,F4步过?

这里我说说关于F8(Step Over)和F7(Step in)的一般方法,粗跟的时候一般都是常用F8走,但是有些call是变形的Jmp,此时就需要F7代过,区别是否是变形Jmp的一个简单方法是比较call的目标地址和当前地址,如果两者离的很近,一般就是变形Jmp了,用F7走。对于Call的距离很远,可以放心用F8步过,如果你再用F7步过,只是浪费时间而已。F8步过对压缩壳用的很多,F7步过加密壳用的很多,如果用F8一不小心就跑飞(程序运行),跟踪失败。

加密壳找Oep
对于加密壳,我的方法一般是用OD载入,钩掉所有异常(不忽略任何异常,除了忽略在KERNEL32 中的内存访问异常打勾。有时由于异常过多可以适当忽略一些异常),运行,数着用了多少次Shift+F9程序运行,显然最后一次异常后,程序会从壳跳到OEP开始执行,这就是我们寻找OEP的一个关键,如果程序 Shift+F9后直接退出,很明显加密壳检测调试器,最简单的应付方法就是用OD插件隐藏OD。
单步异常是防止我们一步步跟踪程序,即F8,F7,F4等,Int3中断是检测调试器用的,仅在Win9x系统中有效,2000/XP就会出现断点异常,其它的异常主要是干扰调试。这一系列的异常虽然干扰我们调试,但也给我们指明了一条通路,就是Shift+F9略过所有异常,然后找到最后一处异常,再它的恢复异常处下断点,跟踪到脱壳入口点。
确定从所有Seh异常中走出来,如果前面有大量循环,逐段解压。

当然你也可以用另一个好东西――Trace,在Command里来个tc eip<42b000 (42b000是当前段的起始位置,滚动条拖到最上面就能看到了,一般程序编译的基地址为400000),42b000只是例子,如果你的下模拟跟踪时机很准,确定没有Seh异常,稍等一会我们就会停在OEP处(对特别加密壳需要大量时间跟踪,因为它的循环极多,但比手动跟踪快,大部分时候是的。)详细跟踪情况可以点运行跟踪看OD跟踪记录。

我们来实际体会一下。
我们把Od中的选项-调试选项-异常选项卡中
除了忽略在KERNEL32 中的内存访问异常打勾,其余一个勾都不打,请检查自己的Od设置。

用OD载入程序后。
Od提示程序加壳,选不继续分析。

00401000 > FC CLD 停在这里。
00401001 FC CLD
00401002 FC CLD
00401003 90 NOP
00401004 - E9 BDBA0000 JMP NOTEPAD.0040CAC6
00401009 - E3 D5 JECXZ SHORT NOTEPAD.00400FE0
0040100B 04 4F ADD AL,4F
0040100D - 74 A4 JE SHORT NOTEPAD.00400FB3
..................................................................
F9运行。
Od提示内存异常,Shift+F9继续运行。

0040CC9E 8618 XCHG BYTE PTR DS:[EAX],BL
0040CCA0 ^ EB FA JMP SHORT NOTEPAD.0040CC9C
0040CCA2 4A DEC EDX
0040CCA3 75 6E JNZ SHORT NOTEPAD.0040CD13

Od提示调试的程序无法处理异常,按Shift+F9程序退出。

0040CC9E 8618 XCHG BYTE PTR DS:[EAX],BL
0040CCA0 ^ EB FA JMP SHORT NOTEPAD.0040CC9C

很明显加密壳检测出OD调试器,最简单的应付方法就是用OD插件隐藏OD。
用插件隐藏Od后。
我们Shift+F9忽略第一次异常到了这里。
单步异常,再次Shift+F9程序就运行了。停,看堆栈吧。

0040CCD2 4B DEC EBX
0040CCD3 6F OUTS DX,DWORD PTR ES:[EDI] ; I/O 命令
0040CCD4 6368 69 ARPL DWORD PTR DS:[EAX+69],EBP

堆栈内容。

0012FFBC 0012FFE0 指针到下一个 SEH 记录
0012FFC0 0040CCD7 SE 句柄 呵,这里表示Od的最后一个异常处理出口就是0040CCD7,会在0040CCD7处的代码处继续正常运行。
0012FFC4 77E67903 返回到 KERNEL32.77E67903

哪我们就Ctrl+G,填入0040CCD7,回车,F2下断点,Shift+F9中断在这里。
顺利运行到这里,再没有Seh陷阱,可以单步跟踪去Oep处了。

0040CCD7 8B4424 04 MOV EAX,DWORD PTR SS:[ESP+4]
0040CCDB 8B00 MOV EAX,DWORD PTR DS:[EAX]
0040CCDD 3D 04000080 CMP EAX,80000004
0040CCE2 74 06 JE SHORT NOTEPAD.0040CCEA
0040CCE4 4B DEC EBX
0040CCE5 65:72 61 JB SHORT NOTEPAD.0040CD49 ; 多余的前缀
0040CCE8 6C INS BYTE PTR ES:[EDI],DX ; I/O 命令
0040CCE9 61 POPAD
0040CCEA EB 02 JMP SHORT NOTEPAD.0040CCEE
................................................................

去Oep出的过程我们先想象一下。

0040CCD7 8B4424 04 MOV EAX,DWORD PTR SS:[ESP+4]
0040CCDB 8B00 MOV EAX,DWORD PTR DS:[EAX]
0040CCDD 3D 04000080 CMP EAX,80000004
0040CCE2 74 06 JE SHORT NOTEPAD.0040CCEA
0040CCE4 4B DEC EBX
0040CCE5 65:72 61 JB SHORT NOTEPAD.0040CD49 ; 多余的前缀
0040CCE8 6C INS BYTE PTR ES:[EDI],DX ; I/O 命令
0040CCE9 61 POPAD
0040CCEA EB 02 JMP SHORT NOTEPAD.0040CCEE

教程这里说:数着用了多少次Shift+F9程序运行,显然最后一次异常后,程序会从壳跳到OEP开始执行,这就是我们寻找OEP的一个关键,如果程序 Shift+F9后直接退出,很明显加密壳检测调试器,最简单的应付方法就是用OD插件隐藏OD。

我按教程里面做了到了
哪我们就Ctrl+G,填入0040CCD7,回车,F2下断点,Shift+F9中断在这里。
顺利运行到这里,再没有Seh陷阱,可以单步跟踪去Oep处了。

0040CCD7 8B4424 04 MOV EAX,DWORD PTR SS:[ESP+4]
0040CCDB 8B00 MOV EAX,DWORD PTR DS:[EAX]
0040CCDD 3D 04000080 CMP EAX,80000004
0040CCE2 74 06 JE SHORT NOTEPAD.0040CCEA
0040CCE4 4B DEC EBX
0040CCE5 65:72 61 JB SHORT NOTEPAD.0040CD49 ; 多余的前缀
0040CCE8 6C INS BYTE PTR ES:[EDI],DX ; I/O 命令
0040CCE9 61 POPAD
0040CCEA EB 02 JMP SHORT NOTEPAD.0040CCEE
按理说不会有异常的,可是调式下去的时候,还是碰到异常~~~~~~

这是为什么 请问还有跟什么有关~~~

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
郁闷没人肯 帮忙给点提示也好~~~~~~~~~
2005-10-20 23:55
0
雪    币: 898
活跃值: (4039)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
3
大家不明白你想说什么你做什么
2005-10-21 08:53
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
叙述不清楚 真不好意思・・・

感谢老大回复!!!
2005-10-21 11:01
0
雪    币: 494
活跃值: (629)
能力值: ( LV9,RANK:1210 )
在线值:
发帖
回帖
粉丝
5
这种看图学话式的学法害人不浅。要是壳代码一个异常
也不用,岂不是永远找不到oep了。

到最后一个异常的原因是很多壳用SEH来清除断点,所以
越过最后的异常后,壳代码难以再清硬件断点,可以使用
esp定律,或者对代码所在的section下内存访问断点。
OllyDump有个找oep的功能意思也差不多。

这种按x次的工作可以写个脚本来干。如果按100次不够,那
就按101次。
2005-10-21 12:48
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
谢谢楼上的前辈指点!!!!!!!!!!
2005-10-22 06:06
0
游客
登录 | 注册 方可回帖
返回
//