• 标 题:空下来又来看看asprotect,发现里面SEH用得真不少。 (1千字)
  • 作 者:hying
  • 时 间:2001-8-14 16:17:06
  • 链 接:http://bbs.pediy.com

大家如果跟过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