大家如果跟过asprotect肯定有如下的体会
0167:013004AC PUSH ESP
0167:013004AD XOR EAX,008B0130
0167:013004B2 MOV [01303560],EAX
0167:013004B7 CALL 013004F6
0167:013004BC PUSH DWORD 013004C5
0167:013004C1 INC DWORD [ESP]
0167:013004C4 RET <-转到13004C6
****************************************************
0167:013004C6 MOV EAX,[ESP+0C]
0167:013004CA JMP SHORT 013004CD
……
0167:013004CD ADD DWORD [EAX+B8],BYTE +02
0167:013004D4 JMP SHORT 013004F0
……
0167:013004F0 XOR EAX,EAX
0167:013004F2 RET <-转到BFFxxxxx,如果贸然跟进去的话,十有八九会跟丢,一般的办法是找下一个RET,如下面的1300539处,然后在那下断点,一般就能断下来。但它的依据是什么呢?
*************************************************************
注意上面第一段的那个CALL,它有什么作用呢?它会先将地址13004BC入栈,然后转到13004F6。
0167:013004F6 XOR EAX,EAX
0167:013004F8 JMP SHORT 013004FC
……
0167:013004FC PUSH DWORD [FS:EAX]
0167:013004FF JMP SHORT 01300502
……
0167:01300502 MOV [FS:EAX],ESP 建立SEH链,前面入栈的13004BC就作为异常处理程序入口。
0167:01300505 XOR [EAX],EAX 产生内存保护异常,转到13004BC去执行,执行完后理应返回到1300505。而上面的ADD
DWORD [EAX+B8],BYTE +02一句则是将返回地址加2,变为1300507。到13004F2处异常处理程序结束,通过系统返回到下面的1300507继续执行。
0167:01300507 JMP SHORT 0130050A
……
0167:0130050A POP DWORD [FS:00]
0167:01300511 JMP SHORT 01300515
……
0167:01300515 POP EAX
0167:01300516 PUSH DWORD 012FE1E0
0167:0130051B PUSH DWORD 01300640
0167:01300520 PUSH DWORD 012FFC6C
0167:01300525 PUSH DWORD 012FF91C
0167:0130052A PUSH DWORD 012FF2F4
0167:0130052F PUSH DWORD 012FED9C
0167:01300534 PUSH DWORD 01300030
0167:01300539 RET
- 标 题:空下来又来看看asprotect,发现里面SEH用得真不少。 (1千字)
- 作 者:hying
- 时 间:2001-8-14 16:17:06
- 链 接:http://bbs.pediy.com