![]() |
| 原创软件 | 编程技术 | 驱动设计 | 汇编与C | 加密解密 | 系统研究 | 胡乱收集 | 进化灵魂 | 共享资源 |
|
| 当前位置:首页> 汇编与C> VC++ 编译器支持C++意外处理(/EHsc) 选项内部奥秘 |
VC++ 编译器支持C++意外处理(/EHsc) 选项内部奥秘(点击:1566) |
|
C++ 编译器支持C++意外处理(/EHsc) 选项内部奥秘 如果起用/Ehsc开关(默认是启用的)则生成的可执行文件有2个特点: 第一: Image
Optional Header DllCharacteristics
不包含标志IMAGE_DLLCHARACTERISTICS_NO_SEH 0x0400 第二: Image
Optional Header Data Driectory
Load Config 包含信息(0x48)字节 Load Config : 结构0x40(DWORD)处是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,引起程序直接终止。 |
| 友情连接 |
本站LOGO |
管理登陆 |
email:whg0001⊙163.com QQ:312016 无花果-编程驿站 copyright 1999-2005 all rights reserved. |
蜀ICP备05016108(四川★成都)欢迎与我合作 |
|