[讨论]关于_ValidateEH3RN-软件逆向-看雪-安全社区|安全招聘|kanxue.com
发布日期:2025-01-07 15:05 点击次数:72
关于 _ValidateEH3RN Windows XP SP2中对结构化异常处理做了一些改动,在__except_handler3中增加了对_ValidateEH3RN的调用。这个函数的代码非常长,在Visual Studio .NET 2003调试器和IDA Pro的帮助下,我重写了这个函数的源代码。然后我用命令行 “cl /c /Ob1 /Z7 /Zl _ValidateEH3RN.c”进行编译。然后我又用Visual Studio .NET 2003附带的DUMPBIN实用工具反汇编了生成的目标文件以及Microsoft提供的目标文件(其单线程调试版本在crt\src\intel\xst_lib目录中)。当我用Beyond Compare比较生成的两个汇编语言文件时,我惊奇地发现,在生成的308行汇编代码中,前217行两者完全一样,后面的90行代码除了使用的寄存器不同(也就是说,假设其中一个使用的是EAX,另一个使用的可能是EDX)外,两者并无任何差别。结果我写的代码比Microsoft提供的代码大两个字节。我花了许多时间阅读MSDN中与编译器以及调试器相关的文档,但都不能解决这个问题。就连Google也帮不了忙。我将此问题贴在OpenRCE以及MSDN论坛中的Visual C++版块上,可能是因为代码太长的缘故,至今无一人响应。我向Matt Pietrek写信请教这个问题。Matt Pietrek现在在Microsoft Visual Studio调试器工作组。以前向Matt Pietrek请教问题时,可能是由于问题并不复杂,虽然Matt很忙,但总是第二天就能给我答复,可这次却迟迟没有回音。我将这个问题帖在此处,希望高手不吝赐教。 注:可以直接使用附件中提供的文件,可读性比较好。 下面是_ValidateEH3RN.c文件: // 这个宏的定义是从CRT源代码目录中的makefile中获得的 #define WIN32_LEAN_AND_MEAN #include <windows.h> #define TRYLEVEL_NONE -1 // 为了方便 // 以下两个结构是从Visual Studio .NET 2003调试器 // 的“局部变量”窗口中获得的 typedef struct _SCOPETABLE_ENTRY { DWORD EnclosingLevel; PVOID FilterFunc; PVOID HandlerFunc; } SCOPETABLE_ENTRY, *PSCOPETABLE_ENTRY; typedef struct _EH3_EXCEPTION_REGISTRATION { struct _EH3_EXCEPTION_REGISTRATION *Next; PVOID ExceptionHandler; PSCOPETABLE_ENTRY ScopeTable; DWORD TryLevel; } EH3_EXCEPTION_REGISTRATION, *PEH3_EXCEPTION_REGISTRATION; // 下面这个函数是从WINNT.H 中复制过来的 // (Windows Server 2003 SP1 DDK\inc\wnet目录) #define PcTeb 0x18 __inline struct _TEB * NtCurrentTeb( void ) { __asm mov eax, fs:[PcTeb] } // 全局变量 INT nValidPages=0; PVOID rgValidPages[0x10]={NULL}; BOOL lModifying=FALSE; // 此函数的调用约定是从__except_handler3的反汇编代码 // 中获得的,它的参数是从调试器的“调用堆栈”窗口中获得的 // 局部变量及其顺序是从调试器的“局部变量”窗口中获得的 int __cdecl _ValidateEH3RN( PEH3_EXCEPTION_REGISTRATION pRN) { MEMORY_BASIC_INFORMATION mbi; PIMAGE_SECTION_HEADER pSection; PVOID pScopePage; INT iValid; UINT iSection; INT iValid2; PNT_TIB pTIB; PSCOPETABLE_ENTRY pScopeTable; INT nFilters; PVOID pTmp; PIMAGE_NT_HEADERS pNTHeader; PIMAGE_DOS_HEADER pDOSHeader; PIMAGE_OPTIONAL_HEADER pOptHeader; DWORD level; DWORD rvaScopeTable; pScopeTable = pRN->ScopeTable;// 是否按DWORD边界对齐 if ((DWORD)pScopeTable & 0x3) { return 0; } // 获取TIB pTIB = (PNT_TIB)NtCurrentTeb(); // 是否超出堆栈界限 if ((PVOID)pScopeTable >= (PVOID)pTIB->StackLimit && (PVOID)pScopeTable < (PVOID)pTIB->StackBase) { return 0; } if (pRN->TryLevel == TRYLEVEL_NONE) { return 1; } // 获取过滤器表达式的数目 for (nFilters=0,level=0;level<=pRN->TryLevel;level++) { DWORD enclosing = pScopeTable[level].EnclosingLevel; if (enclosing!=TRYLEVEL_NONE && enclosing>=level) { return 0; } if (pScopeTable[level].FilterFunc != NULL) nFilters++; } if (nFilters && // (pRN-8) -> saved ESP ((PVOID)*(PDWORD)((PBYTE)pRN-8)<pTIB->StackLimit
上一篇:MOLI万站,正式上线