关于ZwCreateProcessEx()的几个问题

naixian1983 2008-06-16 01:27:50
我在xp上用detours拦截CreateProcess()是成功的,但在win2000 专业版+sp4上测试会出现错误信息Explorer.exe Has Generated Errors and Will Be Closed by Windows.在网上查了资料,在win2000+sp4上要hook ZwCreateProcessEx(这个API,但问题是我在SDK 和MFC的库文件里根本找不到这个函数,以下是detours hook CreateProcess()的方法



DETOUR_TRAMPOLINE(BOOL WINAPI MyCreateProcessW(LPCWSTR lpApplicationName,LPCWSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes,LPSECURITY_ATTRIBUTES lpThreadAttributes,BOOL bInheritHandles,DWORD dwCreationFlags,LPVOID lpEnvironment,LPCSTR lpCurrentDirectory,LPSTARTUPINFOA lpStartupInfo,LPPROCESS_INFORMATION lpProcessInformation), CreateProcessW)

BOOL WINAPI NewCreateProcessW(LPCWSTR lpApplicationName,LPCWSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes,LPSECURITY_ATTRIBUTES lpThreadAttributes,BOOL bInheritHandles,DWORD dwCreationFlags,LPVOID lpEnvironment,LPCSTR lpCurrentDirectory,LPSTARTUPINFOA lpStartupInfo,LPPROCESS_INFORMATION lpProcessInformation)
{


return MyCreateProcessW(lpApplicationName,lpCommandLine, lpProcessAttributes,lpThreadAttributes, bInheritHandles,dwCreationFlags,lpEnvironment,lpCurrentDirectory,lpStartupInfo, lpProcessInformation);
}







大侠们知道怎么用detours来拦截ZwCreateProcessEx()吗??
...全文
643 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnzdgs 2008-06-17
  • 打赏
  • 举报
回复
ObjectAttributes参数是指针,要用->
naixian1983 2008-06-17
  • 打赏
  • 举报
回复
up
naixian1983 2008-06-17
  • 打赏
  • 举报
回复
晕,还是一样



typedef struct _UNICODE_STRING {
USHORT Length;
USHORT MaximumLength;
PWSTR Buffer;
} UNICODE_STRING;
typedef UNICODE_STRING *PUNICODE_STRING;
typedef const UNICODE_STRING *PCUNICODE_STRING;

typedef struct _OBJECT_ATTRIBUTES {
ULONG Length;
HANDLE RootDirectory;
PUNICODE_STRING ObjectName;
ULONG Attributes;
PVOID SecurityDescriptor;
PVOID SecurityQualityOfService;
} OBJECT_ATTRIBUTES;
typedef OBJECT_ATTRIBUTES *POBJECT_ATTRIBUTES;


CAPIHook g_ZwCreateProcess;
typedef LONG (WINAPI *PFNZwCreateProcess) (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);

LONG WINAPI MyZwCreateProcess(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)

{


LONG nResult=((PFNZwCreateProcess)(PROC)g_ZwCreateProcess)
(ProcessHandle,DesiredAccess,ObjectAttributes,InheritFromProcessHandle,InheritHandles,SectionHandle,DebugPort,ExceptionPort);
::MessageBoxW(NULL, ObjectAttributes.ObjectName.Buffer, 0, 0);

return nResult;



}






error C2228: left of '.ObjectName' must have class/struct/union type
error C2228: left of '.Buffer' must have class/struct/union type

是不是我的电脑没有DDK的关系啊?还是没有包含什么头文件?
cnzdgs 2008-06-17
  • 打赏
  • 举报
回复
这些都是DDK里面定义的,你直接把下面定义加到代码里就可以:
typedef struct _UNICODE_STRING {
USHORT Length;
USHORT MaximumLength;
PWSTR Buffer;
} UNICODE_STRING;
typedef UNICODE_STRING *PUNICODE_STRING;
typedef const UNICODE_STRING *PCUNICODE_STRING;

typedef struct _OBJECT_ATTRIBUTES {
ULONG Length;
HANDLE RootDirectory;
PUNICODE_STRING ObjectName;
ULONG Attributes;
PVOID SecurityDescriptor;
PVOID SecurityQualityOfService;
} OBJECT_ATTRIBUTES;
typedef OBJECT_ATTRIBUTES *POBJECT_ATTRIBUTES;
naixian1983 2008-06-17
  • 打赏
  • 举报
回复
当我加上ObjectAttributes.ObjectName.Buffer时出现error C2228: left of '.ObjectName' must have class/struct/union type和error C2228: left of '.Buffer' must have class/struct/union type的错误
,缺少什么头文件啊?
cnzdgs 2008-06-17
  • 打赏
  • 举报
回复
我很久以前做过这方面的测试,很多细节现在已经记不清了。ZwCreateProcess和ZwCreateProcessEx可以只创建进程而不同时加载程序模块,XP以上系统好象都是这样的做法,所以在这两个函数中无法或者程序文件名称和路径。
至于CreateProcess和CreateProcessAsUser我没有研究过,估计是CreateProcess内部要调用CreateProcessAsUser。
naixian1983 2008-06-17
  • 打赏
  • 举报
回复
再问多一个问题

请问cnzdgs 有没有测试过vista呢?
vista是调用CreateProcess()吗?还是调用了CreateProcessAsUser()?
naixian1983 2008-06-17
  • 打赏
  • 举报
回复
to cnzdgs

当我按你方法做时,出来的结果跟我hook CreateProcess()的结果是一样的,而且并没有显示程序的路径和名字,晕。

但我觉得win2000是调用了ZwCreateProcess()来启动程式的,因为当我hook全系统的ZwCreateProcess()时,出来的讯息是XXX.exe the handle is invalid.
为什么拦截到了而不可以得到程序的路径和名字??真不明白




cnzdgs 2008-06-16
  • 打赏
  • 举报
回复
建议你先用::MessageBoxW(NULL, ObjectAttributes.ObjectName.Buffer, 0, 0)把拦截到的程序名称显示出来看看,我以前做过类似的程序,结论是不能用Hook ZwCreateProcess或ZwCreateProcessEx的方法,具体记不清了,可能是系统加载进程不调用ZwCreateProcess,也可能是调用这个函数的时候没有给出程序名称,也有可能是程序不能处理等其它原因。
naixian1983 2008-06-16
  • 打赏
  • 举报
回复
up
naixian1983 2008-06-16
  • 打赏
  • 举报
回复
to zhoujianhei
我用我用替换IAT的方法可以拦截到ZwCreateProces()了
但根据我上面的代码,只是单单拦截了全系统的ZwCreateProces(),但我如何做到拦截某个文件或某个盘的ZwCreateProces()?
zhoujianhei 2008-06-16
  • 打赏
  • 举报
回复

ZwCreateProcessEx,所在库为NTDLL.DLL。
CreateProcess和CreateProcessEx都会调用ZwCreateProcessEx函数。

一般使用inline hook 进行挂钩.

1. LoadLibrary(NTDLL.DLL);
2. GetProcAddress(...,"ZwCreateProcessEx");
3. 修改函数开头字节使其跳转到MyZwCreateProcess。
4. ...


naixian1983 2008-06-16
  • 打赏
  • 举报
回复

typedef LPWSTR PUNICODE_STRING;
typedef struct _OBJECT_ATTRIBUTES {
ULONG Length;
HANDLE RootDirectory;
PUNICODE_STRING ObjectName;
ULONG Attributes;
PSECURITY_DESCRIPTOR SecurityDescriptor;
PSECURITY_QUALITY_OF_SERVICE SecurityQualityOfService;
} OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES;

CAPIHook g_ZwCreateProcess;

LONG WINAPI MyZwCreateProcess(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)

{


LONG nResult=((PFNZwCreateProcess)(PROC)g_ZwCreateProcess)
(ProcessHandle,DesiredAccess,ObjectAttributes,InheritFromProcessHandle,InheritHandles,SectionHandle,DebugPort,ExceptionPort);
MessageBox(NULL ,"^_^,hooked!","Caption",0);

return nResult;
}




naixian1983 2008-06-16
  • 打赏
  • 举报
回复
to cnzdgs

我用替换IAT的方法可以拦截到ZwCreateProces()了



typedef LPWSTR PUNICODE_STRING;
typedef struct _OBJECT_ATTRIBUTES {
ULONG Length;
HANDLE RootDirectory;
PUNICODE_STRING ObjectName;
ULONG Attributes;
PSECURITY_DESCRIPTOR SecurityDescriptor;
PSECURITY_QUALITY_OF_SERVICE SecurityQualityOfService;
} OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES;


LONG WINAPI MyZwCreateProcess(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)

{


LONG nResult=((PFNZwCreateProcess)(PROC)g_ZwCreateProcess)
(ProcessHandle,DesiredAccess,ObjectAttributes,InheritFromProcessHandle,InheritHandles,SectionHandle,DebugPort,ExceptionPort);
MessageBox(NULL ,"^_^,hooked!","Caption",0);

return nResult;
}





PUNICODE_STRING ObjectName应该是要拦截的路径或文件名,但我要怎样写才可以拦截“D:”盘??
naixian1983 2008-06-16
  • 打赏
  • 举报
回复
ls的图片看不到啊
menusystem 2008-06-16
  • 打赏
  • 举报
回复
cnzdgs 2008-06-16
  • 打赏
  • 举报
回复
Hook后出错可能是MyCreateProcessW里面没有处理好,另外,有的函数可能是没法用detours的。
naixian1983 2008-06-16
  • 打赏
  • 举报
回复
但为什么网上他们都说hook ZwCreateProcessEx()是成功的,那就是说应该有办法做到啊,
但他们都不是用detours,我想知道如果用detours怎么做呢?如果hook CreateProcess(),
在win2000+sp4上就会出现上面的错误
cnzdgs 2008-06-16
  • 打赏
  • 举报
回复
你的函数不是ZwCreateProcessEx的原型,ZwCreateProcessEx的原型是:
NTSTATUS Hook_ZwCreateProcessEx(
OUT PHANDLE ProcessHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
IN HANDLE ParentProcess,
IN BOOLEAN InheritObjectTable,
IN HANDLE SectionHandle OPTIONAL,
IN HANDLE DebugPort OPTIONAL,
IN HANDLE ExceptionPort OPTIONAL,
IN HANDLE UnknownHandle
);
拦这个函数基本上没有什么用,因为无法从这个函数的参数中获得exe文件名称和路径。如果用驱动程序,应该注册PsSetCreateProcessNotifyRoutine、PsSetLoadImageNotifyRoutine这两个通知;如果用应用程序,应该拦CreateProcess、CreateProcessAsUser。

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧