首页
社区
课程
招聘
[旧帖] [邀请码已发]利用SEH机制实现反跟踪的一段汇编代码分析.doc 0.00雪花
发表于: 2009-11-12 17:32 2216

[旧帖] [邀请码已发]利用SEH机制实现反跟踪的一段汇编代码分析.doc 0.00雪花

2009-11-12 17:32
2216
下面是本人学习破解的一点体会,现写出来与大家共享,并以此加上以前的帖子来获取邀请码

利用SEH机制实现反跟踪的一段汇编代码分析

一、概述
利用SEH来实现反跟踪的目的是反脱壳的一种重要的技术,其原理是什么呢?,今天我就结合一段汇编代码来作简要说明。
二、代码说明
                1.在堆栈中构造一个EXCEPTION_REGISTRATION结构
1)00401000 >  68 51104000       push seh.00401051
2)00401005    64:FF35 00000000  push dword ptr fs:[0]
3)0040100C   64:8925 00000000  mov dword ptr fs:[0],esp
上述三句指令完成构造一个ERR结构,第一句异常处理的代码段地址入栈,第二句是前一个EXCEPTION_REGISTRATION指针入栈,第三句是fs:[0]指向新生成的EXCEPTION_REGISTRATION结构。
2.引发异常的指令
1)00401013    BE 00000000       mov esi,0
2)00401018    8B06              mov eax,dword ptr ds:[esi]
3)0040101A    6A 00             push 0
4)0040101C 68 00304000   push seh2.00403000        ; ASCII "SEH"
5)00401021    68 0F304000       push seh2.0040300F
6)00401026    6A 00             push 0
7)00401028    E8 57000000       call <jmp.&USER32.MessageBoxA>
                这段代码主要产生一个访问地址00000000异常(1,2两句)
                3.异常处理完毕后,从这里开始执行
                0040102D    6A 00             push 0
0040102F    68 00304000       push seh.00403000 ;“SEH”               
  00401034    68 04304000       push seh.00403004  ;”HELLO SEH”                 
00401039    6A 00             push 0
0040103B    E8 44000000       call <jmp.&USER32.MessageBoxA>
                本段代码调用MessageBox函数。
                4. 恢复原来的SHE链并退出程序

                1)00401040    64:8F05 00000000  pop dword ptr fs:[0]
2)00401047    83C4 04           add esp,4
3)0040104A    6A 00             push 0
4)0040104C    E8 39000000       call <jmp.&KERNEL32.ExitProcess>
        本段代码第一句代码指向下一个EXCEPTION_REGISTRATION的指针出栈放到fs:[0]中,第二句代码栈顶指针+4退栈.接下来调用ExitProcess函数。
          5.异常处理回调函数
          1)00401051    55                push ebp
2)00401052    8BEC              mov ebp,esp
3)00401054    53                push ebx
4)00401055    8B45 10           mov eax,dword ptr ss:[ebp+10]
5)00401058    8D1D 2D104000     lea ebx,dword ptr ds:[40102D]
6)0040105E    8998 B8000000     mov dword ptr ds:[eax+B8],ebx
7)00401064    33DB              xor ebx,ebx
8)00401066    8958 04           mov dword ptr ds:[eax+4],ebx
9)00401069    8958 08           mov dword ptr ds:[eax+8],ebx
10)0040106C    8958 0C           mov dword ptr ds:[eax+C],ebx
11)0040106F    8958 10           mov dword ptr ds:[eax+10],ebx
12)00401072    C740 18 55010000  mov dword ptr ds:[eax+18],155
13)00401079    B8 00000000       mov eax,0
14)0040107E    5B                pop ebx
15)0040107F    C9                leave
16)00401080    C2 1000           retn 10
本段代码完成对所发生的异常进行处理,其中主要指令说明如下:
第四句获取CONTEXT的指针,第五,第六句设置异常处理代
                码执行后程序的执行位置(40102D地址处),7)------11)句对调试
    寄存CONTEXT.Dr0 == 0 , CONTEXT.Dr0 == 0, CONTEXT.Dr0 == 0, CONTEXT.Dr0 == 0,使断点失效。达到反跟踪的目的。

三、小结
        从上面的分析可知,SEH处理实现反跟踪的原理在于通过回调函数来改变CONEXT结构的部分字段的值,从而改变线程执行环境,最终实现反跟踪。上述几段代码组合在一起加入到要保护程序的外壳代码中,可以实现去除硬件断点,从而达到反跟踪的目的,这是本人学习过程中的一点体会。那出来和大家共享,不到之处,望不要见笑。
四、 补充说明:
                异常处理回调函数

                SEH异常处理回调函数的参数定义如下:
                __HandlerProc{
                        __lpExceptionRecord,       //指向一个EXCEPTION_RECORD结构
                        __lpSEH                 //指向EXCEPTION_REGISTRATION结构的地址
                        __lpContext,              //指向CONTEXT结构
                        __lpDispatcherContext

}
函数中涉及到的其他数据结构在此不在说明,很多资料都有介绍。

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

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 2362
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
原来SHE又会唱歌 又会反跟踪啊
2009-11-12 17:34
0
雪    币: 13222
活跃值: (4207)
能力值: ( LV15,RANK:1673 )
在线值:
发帖
回帖
粉丝
3
呵呵...这个应该注意一下...很容易搞错...不过其实LZ文中也有正确的字眼,不过是对错混用...
2009-11-12 17:48
0
雪    币: 173
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
进来学习学习。
2009-11-13 16:19
0
雪    币: 32
活跃值: (34)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
正看到这儿  mark
2012-8-5 19:15
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
学习学习……
2012-8-5 21:48
0
游客
登录 | 注册 方可回帖
返回
//