__except

进行处理时,系统最终会调用RtlIsValidHandler来判断异常处理函数是否有效,如果你希望处理异常

应该是Hook RtlIsValidHandler,可是微软没有导出这个接口

于是我们逆向看看RtlIsValidHandler

发现它会判断ZwQueryInformationProcess的返回值,这里就是ExecuteFlag,这个值不好进行设置,内核会根据flag=8将其锁死,所以我们hook ZwQueryInformationProcess即可

我们再看调用IsValidHandler的RtlDispatchException函数

也判断了一个标记

那么最终我们应该增加0x40+0x30 也就是0x70的标记即可

//根据逆向我们似乎发现了一个办法,也就是Process的MemoryFlag,可用ZwQueryInformationProcess来进行查询
//0x22 flag,返回的一个字节就是MemoryFlag
//#define MEM_EXECUTE_OPTION_DISABLE                          0x1
//#define MEM_EXECUTE_OPTION_ENABLE                           0x2
//#define MEM_EXECUTE_OPTION_DISABLE_THUNK_EMULATION          0x4
//#define MEM_EXECUTE_OPTION_PERMANENT                        0x8
//#define MEM_EXECUTE_OPTION_EXECUTE_DISPATCH_ENABLE          0x10
//#define MEM_EXECUTE_OPTION_IMAGE_DISPATCH_ENABLE            0x20
//#define MEM_EXECUTE_OPTION_VALID_FLAGS                      0x3F
//当其具有MEM_EXECUTE_OPTION_IMAGE_DISPATCH_ENABLE | MEM_EXECUTE_OPTION_EXECUTE_DISPATCH_ENABLE时就可以了
//或者是0x70

下面是hook函数的代码

NTSTATUS __stdcall MyZwQueryInformationProcess(
IN HANDLE ProcessHandle,
IN PROCESSINFOCLASS ProcessInformationClass,
OUT PVOID ProcessInformation,
IN ULONG ProcessInformationLength,
OUT PULONG ReturnLength OPTIONAL
)
{
g_bInMyZwQueryInformationProcess ++;
if (ProcessInformationClass == ProcessExecuteFlags && ProcessHandle == GetCurrentProcess() && ProcessInformationLength == sizeof(ULONG))
{
NTSTATUS n2 = raw_ZwQueryInformationProcess(ProcessHandle,
ProcessInformationClass,
ProcessInformation,
ProcessInformationLength,
ReturnLength);

if (g_bInMyZwQueryInformationProcess == 1)
{
//Debug_View(L"n2=%x, retlen=%d", n2, (*ReturnLength));
}

if (n2 == 0 && ProcessInformation)
{
if (g_bInMyZwQueryInformationProcess == 1)
{
//Debug_View(L"Old Execute Flag: %x", (*((ULONG*)ProcessInformation)));
}

(*((ULONG*)ProcessInformation)) |=0x70;

if (g_bInMyZwQueryInformationProcess == 1)
{
//Debug_View(L"New Execute Flag: %x", (*((ULONG*)ProcessInformation)));
}
}

g_bInMyZwQueryInformationProcess--;
return n2;
}

g_bInMyZwQueryInformationProcess--;
return raw_ZwQueryInformationProcess(ProcessHandle,
ProcessInformationClass,
ProcessInformation,
ProcessInformationLength,
ReturnLength);
}

google一下,发现很多都是直接通过 Zw Query System Information 通过11号获取进程结构SYSTEM_ PROCESS _ INFORMATION ,对于详细的进程信息表达不够。所以想要通过这个来查看详细的 E PROCESS 结构。方法可以通过 PsLookup Process By Process Id 这个 函数 来获取。 函数 原型在下面给出。 typedef struct _SYSTEM 转:http://blog.sina.com.cn/s/blog_4a1acc7f0100cfud.html      896  37F 0000D379 Zw AcceptConnectPort         897  380 0000D38E Zw AccessCheck         898  381 0000D3A3 Zw AccessCheckAndAuditAlarm NTSTATUS Zw Query System Information ( IN SYSTEM_ INFORMATION _CLASS System Information Class, OUT PVOID System Information , IN ULONG System Information Length, OUT PULONG ReturnLength); System Information Class查询的系统信... 该 函数 存在于NTDLL.DLL动态链接库中。NTDLL.DLL负责ring3与ring0之间的通信。当使用子系统方式进行系统调用的时候,ntdll.dll和SSDT会配合使用。关于SSDT技术以后会讲解到。 关于 Zw Query System Information 这个 函数 可以用来查询进程信息、内核信息、硬件信息(例如CPU数目)、句柄信息、时间信息等54个系统信息。 该 函数 的原型是 Option ExplicitPublic Declare Function Zw Query Information Process _Lib "NTDLL.DLL" (ByVal Process Handle As Long, _ByVal Process Information Class As PROCESS INFOCLASS, _ByVal Process Information As Long... 程序主要应用 函数 Zw Query System Information 实现的,这也是window内核的一个很重要,结构很复杂的 函数 函数 原型 如下: //声明Zq Query Ayatem Information NTSTATUS Zw Query System Information ( <br />      从所周知,在Windows NT/2000系统的API黑洞之一便是NTDLL.DLL,此DLL包含了许多未公开的API 函数 。本文将列举一、二,并以如何获取任何指定进程的父进程ID为例作为示范。<br />   NTDLL.DLL中有一个 函数 叫Nt Query Information Process ,用它可以将指定类型的进程信息拷贝到某个缓冲。其原型如下:<br />NTSYSAPI<br />NTSTATUS<br />NTAPI<br />Nt Query Information Proces #include #include typedef DWORD (WINAPI * ZW QUERY SYSTEM INFORMATION )(DWORD,PVOID,DWORD,PDWORD); typedef struct _SYSTEM_ PROCESS _ INFORMATION { DWORD NextEntryDelta; DWORD ThreadCount; 思路:1):在E PROCESS 结构中获取。此时要用到一个导出 函数 :PsGet Process ImageFileName,申明如下: NTSYSAPI UCHAR * PsGet Process ImageFileName( __in PE PROCESS Process ); 此 函数 获取的是一个简单的进程名,... http://hi.baidu.com/liushijianlu/blog/item/b104c810a08f8b28dc5401fb.html>深入理解文件操作 函数 native api之 Zw Query Information File看这个 函数 的名字和参数就能够知道他是干嘛用的了,但是他的作用远不止这些,这需要一些技巧和深入的理解才能有了新的思路。现在仅仅是明白了 函数