hook api 异常问题
经过一段时间的努力,终于把关于hook api的东西搞定了,可是出现了几个小问题,还不是很清楚,特发帖讨论,希望各位大侠多多关注。
下面是一段hook NtCreateProcess的代码,很挫,见笑了:
NTSTATUS FakedZwCreateProcess(
OUT PHANDLE ProcessHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN HANDLE InheritFromProcessHandle,
IN BOOLEAN InheritHandles,
IN HANDLE SectionHandle OPTIONAL,
IN HANDLE DebugPort OPTIONAL,
IN HANDLE ExceptionPort OPTIONAL,
IN HANDLE Unknown
)
{
NTSTATUS ntstatus;
int mark;
int i;
char aProcessName[MAXPROCNAMELEN];
char aPathName[MAXPROCNAME];
char data[MAXDATALEN];
DbgPrint("create process begin:\n");
RtlZeroMemory(aProcessName,MAXPROCNAMELEN);
RtlZeroMemory(aPathName,MAXPROCNAME);
RtlZeroMemory(data,MAXDATALEN);
GetProcess(aProcessName);//调用native api的进程名
if (strstr(aProcessName,"anti"))//本程序的跳过
{
ntstatus=RealZwCreateProcess(
ProcessHandle,
DesiredAccess,
ObjectAttributes,
InheritFromProcessHandle,
InheritHandles,
SectionHandle ,
DebugPort ,
ExceptionPort,
Unknown
);
return ntstatus;
}
GetFullProcessName(SectionHandle,aPathName);//得到路径名
DbgPrint("ZwCreateProcess is called by %s\n",aProcessName);
DbgPrint("The path is %s\n",aPathName);//调用程序的路径
sprintf(data,"%s##\tZwCreateProcess\t%s", aProcessName,aPathName);
mark=manage(data);//由他来进行输入缓冲,判断是否危险动作的处理。
if (mark==1)
{
ntstatus=RealZwCreateProcess(
ProcessHandle,
DesiredAccess,
ObjectAttributes,
InheritFromProcessHandle,
InheritHandles,
SectionHandle ,
DebugPort ,
ExceptionPort,
Unknown
);
DbgPrint("mark =1\n");
}
else if (mark==2)
{
DbgPrint("mark==2");
ntstatus= STATUS_ACCESS_DENIED;//用户选择了拒绝执行
}
return ntstatus;
}
我把出问题的代码已经用红色标出来了。
我把这个程序描述一下,它hook 了 几个操作注册表的函数,以及NtCreateProcess和NtWriteVirtualMemory。
程序运行时会蓝屏,出错代码是PAGED_FAULT_IN_NONPAGED_AREA ,然后查看crashdump发现是RtlZeroMemory的问题,删除这个RtlZeroMemory后,问题解决。不明白是为什么会这样。
但是我把hook注册表函数去掉后,光hook NtCreateProcess和NtWriteVirtualMemory就不会出问题,程序的代码一点都没变。
大家觉得可能是什么地方的问题,我是第一次写驱动,所以可能有些地方不太清楚,请各位赐教~~