您的位置 首页 > 腾讯云社区

VMPROTECT处理异常4--seh4(2)---franket

EH4的IDA解析

http://www.hexblog.com/?p=106

http://www.hexblog.com/?p=19

示例1:

void SEHTest() { DWORD dwTemp = 100; __try //0层 { __try //1层 { __try //2层 { } __except(2) //filter里的值是随便写的 { dwTemp = 20; } } __except(1) { dwTemp = 10; } } __except(0) { dwTemp = 0; } }

IDA可以解析了它的所有filter和hander:

EH4的结构

EH4的完整解析可以参看http://www.mouseos.com/windows/SEH8.html

其结构如下:

所以关键是找到ScopeTable,这里有一篇翻译:http://www.cnblogs.com/awpatp/archive/2010/06/15/1758763.html

EH4反汇编手工解析步骤1 

我们来看看关键点:

exception handler链表的头是存储在FS:[0]当中的. 所以, 如果你步入debugger的汇编语言语句的话, 你会看到如下的指令:

MOV DWORD PTR FS:[00000000],ESP

或者

MOV DWORD PTR FS:[00000000],ECX

你可以确定, 这就是在配置和拆除一个_try/_except 块了.

以上面的示例1为参考,我们可以写这样的代码来判断这个函数是否存在EH4:

if (dwLen == 7 && memcmp(pDecode, "x64x89x25x00x00x00x00", 7) == 0 || dwLen == 7 && memcmp(pDecode, "x64x89x0Dx00x00x00x00", 7) == 0)//EH4 增加ecx判断 { //64:8925 00000000 mov dword ptr fs:[0], esp //64:890D 00000000 mov dword ptr fs:[0], ecx

或者:

if (memcmp(pbyTemp1, "x64x89x25", 3) == 0 || memcmp(pbyTemp1, "x64xA3", 2) == 0) { //64:8925 00000000 mov dword ptr fs:[0], esp步骤2 

最大搜索控制在一个段内,从函数起始,到步骤1之间的汇编,判断是否依次有以下关键汇编:

1."x6AxFE",指令长为2

00230000 6afe push 0FFFFFFFEh // tryleavel的初始值,一般在push ebp后就会使用

2."x68x00x00x00x00",指令长为5,后四字节随意,比如:按EH4结构,这里可能会push ScopeTable

push offset stru_416A68

3."x68x00x00x00x00",指令长为5,后四字节随意,比如:按EH4结构,这里可能会push ExceptionHandler

push offset SEH_4113B0步骤3

如果存在步骤2这三条依次指令,就做下一步判断:

同样是搜索从函数起始从函数起始,到步骤1之间的汇编,是否依次有以下关键汇编:

1."x64xA1x00x00x00x00",6字节,这个是必须的,因为EH4是放在fs:[0]处

64a100000000 mov eax,dword ptr fs:[00000000h]

2."x50",1字节,压入eax,即上表的prev_structure,把前一个压栈

50 push eax

3."x64xA3x00x00x00x00",6字节,把新构建的EH4压回到fs:[0]

mov large fs:0, eax ---来自腾讯云社区的---franket

关于作者: 瞎采新闻

这里可以显示个人介绍!这里可以显示个人介绍!

热门文章

留言与评论(共有 0 条评论)
   
验证码: