好友
阅读权限40
听众
最后登录1970-1-1
|
【文章作者】: XuZhenG[LCG]
【作者邮箱】: 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 [ebp-1C], 0;int x=0; 0040104C .C745 E0 01000>mov dword ptr [ebp-20], 1;int i=1; 00401053 .C745 FC 00000>mov dword ptr [ebp-4], 0 0040105A .8B45 E0 mov eax, dword ptr [ebp-20];eax=i; 0040105D .99cdq 0040105E .F77D E4 idivdword ptr [ebp-1C] ;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:[0]
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 [edi+ecx*4] ;取Except块VA 00401300|.8943 0C |mov dword ptr [ebx+C], eax 00401303|.FF548F 08 |calldword ptr [edi+ecx*4+8];这里调用了我们的Except块
This is the assembly code of the __except block.
00401073 .8B65 E8 mov esp, dword ptr [ebp-18] 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 [esp] 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 [esp], eax 7C92E48BC74424 04 01000>mov dword ptr [esp+4], 1 7C92E493895C24 08 mov dword ptr [esp+8], ebx 7C92E497C74424 10 00000>mov dword ptr [esp+10], 0 7C92E49F54pushesp 7C92E4A0E8 63000000 callRtlRaiseException 7C92E4A5C2 0800 retn8
很多新手看了应该很熟悉吧,运行完了程序就结束,可是在系统中双击可以正常运行。
明白了吧...
很多壳程序就是用SEH欺骗新手反调试的。
TestSEH.rar |
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|