XuZhenG 发表于 2008-10-11 18:14

讲解Structured Exception Handler

【文章作者】: XuZhenG
【作者邮箱】: xuzheng1111@126.com
【作者主页】: http://hi.baidu.com/xuzheng1111
http://xz.bee.pl
【软件名称】: 自己写的
【下载地址】: 自己写的
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
如有人将此用入商业用途,给作者造成损失本人概不负责。
--------------------------------------------------------------------------------
【详细过程】

废话:
这样吧 今天写一个壳常用的技术...

正文:
应用异常更改程序运行的流程
PS:这种技术只能骗骗脱壳新手

SEH is short for
Structured Exception Handler. 结构化异常处理

A sample code:

Visual C++ Code

#include "windows.h"
#include "stdio.h"
void main(void)
{
int x=0,i=1;
__try
{
i=i/x;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
printf("Got it!");
}
}




这是一个简单的 /subsystem:console 的程序。(Compiled By Visual C++ 6 & Located in Windows Xp Sp3 En_VOL)

定义了两个变量
x = 0, i = 1;
然后 try里面 用了 i = i/x; 我们知道 整数不能除以0;所以这句话很明显是错误的。
为什么我这里要写上这些内容呢?

我们来看看程序到这里怎么执行吧...
程序运行到 __try 块 发现异常... 整数除以0;

很明显是一个异常 然后系统会开始寻找最近的 __except块。 然后执行except块内容处理异常。





壳程序会经常故意设置一些错误的代码然后用这种异常处理的方法,更改程序流程,可以欺骗一些水平较差的新手,我们下面来说他如何欺骗。



OD Load it...

Find that..


00401045 .C745 E4 00000>mov dword ptr , 0;int x=0;
0040104C .C745 E0 01000>mov dword ptr , 1;int i=1;
00401053 .C745 FC 00000>mov dword ptr , 0
0040105A .8B45 E0 mov eax, dword ptr ;eax=i;
0040105D .99cdq
0040105E .F77D E4 idivdword ptr ;eax=eax/x; 即 i=i/x;异常发生



Before that,you will see...


00401010 > > \55pushebp
00401011 .8BECmov ebp, esp
00401013 .6A FF push-1
00401015 .68 28004200 push00420028
0040101A .68 80124000 push_except_handler3 ;SE handler installation
0040101F .64:A1 0000000>mov eax, dword ptr fs:



SE handler installated,See the Stack(堆栈).

0012FFB0 0012FFE0 Pointer to next SEH record
0012FFB4 00401280 SE handler

然后去401280下HE断点,Shift+F9就能停在401280


发现异常后程序会展开 全局系统处理... 处理程序在 401280的地方 就是SE handler

See the code


00401280 >/$55pushebp;Structured exception handler
00401281|.8BECmov ebp, esp
00401283|.83EC 08 sub esp, 8
00401286|.53pushebx
00401287|.56pushesi



Let's see how the program run to the __Except block.


004012FD|.8B048F|mov eax, dword ptr ;取Except块VA
00401300|.8943 0C |mov dword ptr , eax
00401303|.FF548F 08 |calldword ptr ;这里调用了我们的Except块



This is the assembly code of the __except block.


00401073 .8B65 E8 mov esp, dword ptr
00401076 .68 1C004200 push0042001C; /format = "Got it!"
0040107B .E8 50000000 callprintf; \printf


Did you see it? It is the code of __except Block.



新手注意了:
如果在发生异常的地方F8会怎么样呢?


Just try it!

7C92E4608B1C24mov ebx, dword ptr
7C92E46351pushecx
7C92E46453pushebx
7C92E465- E9 D21B8183 jmp 0014003C
7C92E46A0AC0oral, al
7C92E46C74 0C jeshort 7C92E47A
7C92E46E5Bpop ebx
7C92E46F59pop ecx
7C92E4706A 00 push0
7C92E47251pushecx
7C92E473E8 C8EBFFFF callZwContinue
7C92E478EB 0B jmp short 7C92E485
7C92E47A5Bpop ebx
7C92E47B59pop ecx
7C92E47C6A 00 push0
7C92E47E51pushecx
7C92E47F53pushebx
7C92E480E8 0BF5FFFF callZwRaiseException
7C92E48583C4 EC add esp, -14
7C92E488890424mov dword ptr , eax
7C92E48BC74424 04 01000>mov dword ptr , 1
7C92E493895C24 08 mov dword ptr , ebx
7C92E497C74424 10 00000>mov dword ptr , 0
7C92E49F54pushesp
7C92E4A0E8 63000000 callRtlRaiseException
7C92E4A5C2 0800 retn8


很多新手看了应该很熟悉吧,运行完了程序就结束,可是在系统中双击可以正常运行。
明白了吧...

很多壳程序就是用SEH欺骗新手反调试的。
TestSEH.rar

Tale 发表于 2008-10-11 18:21

牛 膜拜!~~~~~~~~~~~~~~

zzage 发表于 2008-10-11 18:23

除0产生SEH异常~不错.学习下~~~
PUSH DWORD PTR FS:
MOV DWORD PTR FS:,ESP
MOV ESI,0
MOV EAX,DWORD PTR DS:
这几句也可以产生SEH异常

Hmily 发表于 2008-10-11 18:23

超哥的CM用到了~

XuZhenG 发表于 2008-10-11 18:25

异常产生的方法很多
PUSH DWORD PTR FS:
MOV DWORD PTR FS:,ESP
MOV ESI,0
MOV EAX,DWORD PTR DS:
这个是0xC0000005Access Violation 内存访问异常

`·新手上路_ 发表于 2008-10-11 21:10

SEH暗桩吗?膜拜膜拜,分析很透彻!慢慢消化.......

wgz001 发表于 2008-10-12 19:17

楼主能否讲解下怎么绕过SEH啊谢谢了

膜拜楼主

体无完肤 发表于 2013-9-9 15:43


搞笑啊
页: [1]
查看完整版本: 讲解Structured Exception Handler