专栏首页技术杂记VMPROTECT处理异常4--seh4(2)
原创

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

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, "\x64\x89\x25\x00\x00\x00\x00", 7) == 0
|| dwLen == 7 && memcmp(pDecode, "\x64\x89\x0D\x00\x00\x00\x00", 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, "\x64\x89\x25", 3) == 0
            || memcmp(pbyTemp1, "\x64\xA3", 2) == 0)
        {
            //64:8925 00000000          mov     dword ptr fs:[0], esp

步骤2 

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

1."\x6A\xFE",指令长为2

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

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

push    offset stru_416A68

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

push    offset SEH_4113B0

步骤3

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

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

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

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

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

50              push    eax

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

mov     large fs:0, eax

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

相关文章

  • VMPROTECT处理异常3--seh4

    ExceptionList,正好位于TEB的偏移0处,总是由[FS:0]指向的,这个结构是用来注册我们的_except_handler()即:异常处理程序

    franket
  • 什么是“零信任”网络

    “零信任”是一个安全术语也是一个安全概念,它将网络防御的边界缩小到单个或更小的资源组,其中心思想是企业不应自动信任内部或外部的任何人/事/物、不应该根据物理或网...

    franket
  • 【玩转腾讯云】腾讯云DDNS 解决方案(2)

    franket
  • C语言数组结合位运算实战-位移与查表

    在嵌入式项目开发中,LED灯的操作是一定要会的,也是基础中的基础,比如用51单片机写个跑马灯,这不简单嘛,定义一个数组把那8个跑马灯存起来,然后搞个for循环...

    morixinguan
  • HackIM 2019-Mime checkr

    原文地址:http://www.mohamed-chamli.me/blog/hackim%202019/Mimecheckr

    安恒网络空间安全讲武堂
  • MikroTik-SMB 测试之 Mutiny-Fuzzer

    Mutiny是由思科研究人员开发的一款基于变异的网络fuzz框架,其主要原理是通过从数据包(如pcap文件)中解析协议请求并生成一个.fuzzer文件,然后基于...

    信安之路
  • 为了抓取弹幕,你需要知道的一些二进制数据常识

    文本不会讲具体某个网站的弹幕抓取方法。而是描述抓取到二进制的弹幕信息以后,如何进行处理。

    青南
  • CVE-2020-0796,又是一场补丁攻坚战

    每年真正比较有影响力的漏洞编号,其实并不多,而这个CVE-2020-0796,就是我们在疫情之下全面返岗伊始,最值得去重视的一个。

    Bypass
  • shell编程/字库裁剪(2)——编程过程

      之所以想用shell实现,是因为shell是UNIX/LINUX的工作语言,可以实现很强大的功能,所以借此话题顺带讲一下shell编程的思路。可是现实是,很...

    窗户
  • 漏洞告之:SMBv3协议远程代码执行漏洞(附自查脚本)

    北京时间3月10日23时微软发布安全通告称Microsoft Server Message Block 3.1.1(SMBv3)协议在处理某些请求的方式中存在代...

    Aran

扫码关注云+社区

领取腾讯云代金券