原创软件 编程技术 驱动设计 汇编与C 加密解密 系统研究 胡乱收集 进化灵魂 共享资源 点这里
当前位置:首页> 汇编与C> VC++ 编译器支持C++意外处理(/EHsc) 选项内部奥秘
 

VC++ 编译器支持C++意外处理(/EHsc) 选项内部奥秘(点击:1566)

VC++ 编译器支持C++意外处理(/EHsc) 选项内部奥秘

C++ 编译器支持C++意外处理(/EHsc) 选项内部奥秘

 

如果起用/Ehsc开关(默认是启用的)则生成的可执行文件有2个特点:

 

第一: Image Optional Header DllCharacteristics   不包含标志IMAGE_DLLCHARACTERISTICS_NO_SEH  0x0400

第二: Image Optional Header Data Driectory  Load Config  包含信息(0x48)字节

 

Load Config : 结构0x40DWORD)处是SHE处理程序向量,0x44(DWORD) 处是SHE处理程序向量个数。

 

在这种情况下,如果用ASM内嵌联编模拟SEH 就不会成功,因为windows只调用存在于Load Config结构中的SHE处理向量。

 

如果关闭/Ehsc开关,这具备另外2个特点

 

第一: Image Optional Header DllCharacteristics   包含标志IMAGE_DLLCHARACTERISTICS_NO_SEH  0x0400

第二: Image Optional Header Data Driectory  Load Config  不包含任何信息。

 

在这种情况下,如果用ASM内嵌联编模拟SEH 也不会成功,因为windows 将忽略任何包含有IMAGE_DLLCHARACTERISTICS_NO_SHE标志信息的模块中的意外。

 

如果你生产的版本是调试版本,无论你是否打开/Ehsc开关,这具备另外2个特点。

 

第一: Image Optional Header DllCharacteristics   不包含标志IMAGE_DLLCHARACTERISTICS_NO_SEH  0x0400

第二: Image Optional Header Data Driectory  Load Config  不包含任何信息。

 

所以调试模式下,汇编SEH模拟始终可以成功。

 

总结,如果要在RELASE版本下 使用汇编模拟SHE,需要处理掉IMAGE_DLLCHARACTERISTICS_NO_SHE,与Load Config数据结构。

 

 

下下是分析手记:

SHE处理被触发后,RING3下执行的第一个函数是: KiUserExceptionDispatcher,以下是部分代码

 

.text:7C94AB2F                 push    ebp

.text:7C94AB30                 mov     ebp, esp

.text:7C94AB32                 push    ecx

.text:7C94AB33                 push    [ebp+arg_0]

.text:7C94AB36                 call    RtlImageNtHeader

.text:7C94AB36

.text:7C94AB3B                 test    byte ptr [eax+5Fh], 4//IMAGE_DLLCHARACTERISTICS_NO_SHE

.text:7C94AB3F                 jnz     loc_7C96EF23

 

上面是判断IMAGE_DLLCHARACTERISTICS_NO_SHE 标志部分,如果改标志存在,KiUserExceptionDispatcher不会调用用户SHE过程,而支持调用ZwRaiseException,引起程序直接终止。

 

.text:7C96E276

.text:7C96E276 loc_7C96E276:                           ; CODE XREF: sub_7C94AA30+44j

.text:7C96E276                 sub     edi, [ebp+var_14]

.text:7C96E279                 xor     edx, edx

.text:7C96E27B                 test    eax, eax

.text:7C96E27D                 mov     esi, eax

.text:7C96E27F                 jl      short loc_7C96E296

.text:7C96E27F

.text:7C96E281

.text:7C96E281 loc_7C96E281:                           ; CODE XREF: sub_7C94AA30+2C4j

.text:7C96E281                 lea     ecx, [esi+edx]

.text:7C96E284                 sar     ecx, 1

.text:7C96E286                 mov     eax, [ebx+ecx*4]

.text:7C96E289                 cmp     edi, eax//比较Load Config SEH向量

.text:7C96E28B                 jb      loc_7C94ACE1

.text:7C96E28B

.text:7C96E291                 jmp     loc_7C94A934

 

上面代码是在Load Config中搜索匹配SHE处理向量,如果不能匹配,则最终KiUserExceptionDispatcher会调用ZwRaiseException,引起程序直接终止。

 

 

 

 
友情连接
罗云彬编程乐园 AoGo汇编小站 老罗缤纷天地 水色银光 破解勇
80x86汇编小站 SmallWaves Hume的Asm ASM教程下载 X86汇编语言
一块三毛钱 惊涛之帆工作室 CVC(病毒木马) 看雪学院 笨冬瓜
HMX HOME NCPH官方 强档LINUX L4FDYOS sunwear的blog
安全焦点 未雨绸缪 雷雨、白云、hurk 极端的混混 D哥博客
赛迪网网络安全 红狼安全小组 岁月联盟 雄鹰基地 MILWORM
FRSIRT 驱动开发网 CZY CCG论坛 HNC网络联盟

欢迎加入CNASM站群QQ联盟

本站LOGO

音乐欣赏

管理登陆

email:whg0001⊙163.com QQ:312016 无花果-编程驿站 copyright 1999-2005 all rights reserved.

蜀ICP备05016108(四川★成都)欢迎与我合作