首页
社区
课程
招聘
[求助]拦截 zwcreatefile 怎么不成功啊!!!!!
发表于: 2009-7-28 10:29 6845

[求助]拦截 zwcreatefile 怎么不成功啊!!!!!

2009-7-28 10:29
6845
怎么拦截了 zwcreatefile 并返回STATUS_ACCESS_DENIED 怎么文件还能建建成功啊????
是不是程序调用了底层的IRP啊!!!!!

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 229
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
没人遇到过这各问题吗??????
2009-7-28 10:51
0
雪    币: 243
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
scm
3
这个前两天我基本搞OK了。我这个人笨了就这个拦截文件创建(Zwcreatefile)都搞了一星期。
2009-7-28 11:13
0
雪    币: 229
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
我刚刚在网上找了一下,,好像还有个zwopenfile 也可以创建文件的,,,先试一下,,,
2009-7-28 11:20
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
5
贴代码,光说你返回失败了,谁知道你怎么写的啊~楼主该好好看看提问的智慧
2009-7-28 11:20
0
雪    币: 381
活跃值: (140)
能力值: ( LV13,RANK:330 )
在线值:
发帖
回帖
粉丝
6
LZ应该贴点代码去来吧?
Zwcreatefile拦截文件创建是绝对可行的,你看看自己返回STATUS_ACCESS_DENIED的时机是否正确。
大概形式应该这样
NTSTATUS HookSSDTZwCreateFile(		
		OUT PHANDLE  FileHandle,
		IN ACCESS_MASK  DesiredAccess,
		IN POBJECT_ATTRIBUTES  ObjectAttributes,
		OUT PIO_STATUS_BLOCK  IoStatusBlock,
		IN PLARGE_INTEGER  AllocationSize  OPTIONAL,
		IN ULONG  FileAttributes,
		IN ULONG  ShareAccess,
		IN ULONG  CreateDisposition,
		IN ULONG  CreateOptions,
		IN PVOID  EaBuffer  OPTIONAL,
		IN ULONG  EaLength)
{
         NTSTATUS ntStatus = FilterFromZwCreateFile(DesiredAccess,ObjectAttributes,FileAttributes,CreateDisposition,CreateOptions);
	if(NT_SUCCESS(ntStatus)) 
	{
		// 调用原始API
		ntStatus = g_OrgZwCreateFile( FileHandle,
								DesiredAccess,
								ObjectAttributes,
								IoStatusBlock,
								AllocationSize,
								FileAttributes,
								ShareAccess,       	
								CreateDisposition, 
								CreateOptions,     
								EaBuffer  OPTIONAL,
								EaLength); 
	}
	return ntStatus;
}

2009-7-28 11:22
0
雪    币: 229
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
NTSTATUS HookZwCreateFile(
OUT PHANDLE FileHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
OUT PIO_STATUS_BLOCK IoStatusBlock,
IN PLARGE_INTEGER AllocationSize OPTIONAL,
IN ULONG FileAttributes,
IN ULONG ShareAccess,
IN ULONG CreateDisposition,
IN ULONG CreateOptions,
IN PVOID EaBuffer OPTIONAL,
IN ULONG EaLength
)
{
UNICODE_STRING ufilename;
ANSI_STRING   afilename;
char * p;
int i=0;
ufilename=*(ObjectAttributes->ObjectName);
RtlUnicodeStringToAnsiString(&afilename,&ufilename,TRUE);
p=afilename.Buffer;
DbgPrint("createfile :%s\n",afilename.Buffer);
DbgPrint("ext:%s\n",p+strlen(p)-4);
if(strlen(p)>12)
if(
/*
   (
     ((CreateDisposition & FILE_CREATE) ) ||
         ((CreateDisposition & FILE_OPEN_IF) ) ||
          ((CreateDisposition & FILE_OVERWRITE_IF) ) ||
           ((CreateDisposition & FILE_SUPERSEDE) )
         )  &&
  */
    (!_strnicmp(p+strlen(p)-4,".dwg",4))   &&
    udoscmp(p+4)
   
   )
{

DbgPrint("filter\n");
return STATUS_ACCESS_DENIED;

}
//ExFreePool(ufilename.Buffer);
return RealZwCreateFile
(
  FileHandle,
  DesiredAccess,
  ObjectAttributes,
  IoStatusBlock,
   AllocationSize,
  FileAttributes,
  ShareAccess,
  CreateDisposition,
  CreateOptions,
  EaBuffer,
  EaLength
);
}

代码没什么问题吧???

其它的程序都可以拦截,,,就autocad.exe 拦截不了,,,文件还是被创建了,,,???
2009-7-28 11:25
0
雪    币: 229
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
老外写的东西就是不一样?????不知道它是怎么创建的???
2009-7-28 11:27
0
雪    币: 381
活跃值: (140)
能力值: ( LV13,RANK:330 )
在线值:
发帖
回帖
粉丝
9
代码贴的太乱了,也不知道对其以下。不过原因很明确,是你的过滤规则代码出问题了,思路是没错的,自己慢慢调吧,写代码就得有点耐心啊
2009-7-28 11:32
0
雪    币: 229
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
用DLL HOOK API 拦截发现,,程序确实用了 createfile  ,,,驱动+DLL 拦截,,都不成功,,,WHY?

HANDLE WINAPI MyCreateFileA
(
   LPCTSTR lpFileName,
  DWORD dwDesiredAccess,
  DWORD dwShareMode,
  LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  DWORD dwCreationDisposition,
  DWORD dwFlagsAndAttributes,
  HANDLE hTemplateFile

)
{
        TCHAR exe[256]={0};
        GetModuleFileName(NULL,exe,256);
        TCHAR tmp[256]={0};
        char *p=(char *)lpFileName;
        sprintf(tmp,"[%d]%s,CreateFileA:%s\n",gnum++,exe,lpFileName);
        if(dwCreationDisposition & CREATE_NEW)
        if(strlen(p)>4&& !_strnicmp(p+strlen(p)-4,".dwg",4)  && udoscmp((char *)lpFileName))
        {
                MessageBoxA(0,"","what are you doing noe",MB_OK);
                //DeleteFile(lpFileName);
                return 0;
        }
    OutputDebugString(tmp);

return TrueCreateFileA
(
     lpFileName,
   dwDesiredAccess,
   dwShareMode,
   lpSecurityAttributes,
   dwCreationDisposition,
   dwFlagsAndAttributes,
   hTemplateFile
);
}
2009-7-28 11:32
0
雪    币: 229
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
我是返回的STATUS_ACCESS_DENIED啊,,,,代码没问题,,,用记事本就可以栏截,,,用AUTOCAD 就不行???
2009-7-28 11:34
0
雪    币: 381
活跃值: (140)
能力值: ( LV13,RANK:330 )
在线值:
发帖
回帖
粉丝
12
创建文件的方法有很多,就一个ZwCreateFile想搞定全部是不可能的,“用AUTOCAD 就不行”也是正常的事。有的可能没有经过这个API就把文件给建了,自然也就截获不到了。对于这种情况你就得先确定了AUTOCAD是否真的通过CreateFile来创建文件的。你可以对该API下断点,看该API执行前后有没有文件出來。
2009-7-28 11:44
0
雪    币: 223
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
在你dll的函数MyCreateFileA中加个assert,如果autocad有调用ZwCreateFile函数自然会进入你的函数,弹出断言后就可以挂上调试了,看看哪里出问题了。如果没出断言  很可能是人家没调用ZwCreateFile。
2009-7-28 11:58
0
雪    币: 229
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
14
好的,,,多谢指点
2009-7-28 12:07
0
游客
登录 | 注册 方可回帖
返回
//