下面是本人学习破解的一点体会,现写出来与大家共享,并以此加上以前的帖子来获取邀请码
利用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期)