__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看这个
函数
的名字和参数就能够知道他是干嘛用的了,但是他的作用远不止这些,这需要一些技巧和深入的理解才能有了新的思路。现在仅仅是明白了
函数