hook zwwritefile并得到写文件的路径

在这上面忙活了几天,终于不蓝屏了

//HookNtWriteFile

HookZwWriteFile(
IN HANDLE FileHandle, 
IN HANDLE Event OPTIONAL, 
IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, 
IN PVOID ApcContext OPTIONAL, 
OUT PIO_STATUS_BLOCK IoStatusBlock, 
IN PVOID Buffer, 
IN ULONG Length, 
IN PLARGE_INTEGER ByteOffset OPTIONAL, 
IN PULONG Key OPTIONAL 
)
{
if (TurnOnFileMon==1)//如果功能开启的话
{
PDEVICE_EXTENSION deviceExtension;//设备扩展
char ansiProcessName[PROCNAMELEN];
//UNICODE_STRING *volumeDosName;
WCHAR DelFullName[1024];
PCWSTR WriteFileName;
PFILE_OBJECT fileobj;
FILE_INFORMATION_CLASS FileInformationClass = FileNameInformation ;
if ( FileHandle != NULL)
{
NTSTATUS nts = STATUS_UNSUCCESSFUL;
//得到进程路径和进程名
UNICODE_STRING UniProcessPath,volumeDosName;
ANSI_STRING AnsiProcessPath,ansiProcessName1;
ANSI_STRING ansipath,apathpre;
UNICODE_STRING unipath,upathpre;
PCWSTR ProcessPath = GetCurrentProcessFileName();//进程路径
RtlInitUnicodeString(&UniProcessPath,ProcessPath);
RtlUnicodeStringToAnsiString(&AnsiProcessPath,&UniProcessPath,TRUE);
  
GetProcessName(ansiProcessName); //进程名
RtlInitAnsiString(&ansiProcessName1,ansiProcessName);

//KdPrint(("%s(%s)修改文件 \r\n",ansiProcessName,AnsiProcessPath.Buffer));
//  IO_STATUS_BLOCK iosb ={ 0,0 };
//  ANSI_STRING    ansiUndeleteFileName ;//
 // UNICODE_STRING usFileName ={ 0,0,0 }; //

if(NT_SUCCESS(ObReferenceObjectByHandle(FileHandle,GENERIC_READ,NULL,KernelMode,&fileobj,NULL)))
{
WriteFileName=fileobj->FileName.Buffer;
RtlInitUnicodeString(&unipath,WriteFileName);
RtlUnicodeStringToAnsiString(&ansipath,&unipath,TRUE);
if (wcscmp(WriteFileName,PreWriteFileName)!=0)
{
volumeDosName.Buffer = ExAllocatePool( PagedPool, 16);
volumeDosName.MaximumLength=8;
//RtlVolumeDeviceToDosName(fileobj-> DeviceObject, &volumeDosName); 
IoVolumeDeviceToDosName(fileobj->DeviceObject, &volumeDosName );
RtlInitUnicodeString(&upathpre,volumeDosName.Buffer);
RtlUnicodeStringToAnsiString(&apathpre,&upathpre,TRUE);
KdPrint(("%s(%s)修改文件  %s(%s) \r\n",ansiProcessName,AnsiProcessPath.Buffer,apathpre.Buffer,ansipath.Buffer));
ExFreePool(volumeDosName.Buffer);
}

//wcscpy(PreWriteFileName,WriteFileName);
//PreWriteFileName=WriteFileName;


ObDereferenceObject(fileobj);
RtlFreeAnsiString(&apathpre);
RtlFreeAnsiString(&ansipath);


}

//KdPrint(("%s(%s)修改文件 %s\r\n",ansiProcessName,AnsiProcessPath.Buffer,ansipath.Buffer));
/*
POBJECT_NAME_INFORMATION wFilePath;

if (NT_SUCCESS(ObReferenceObjectByHandle(FileHandle,0,NULL,KernelMode,&fileobj,NULL)))//获取文件对象
{            
if (IoQueryFileDosDeviceName(fileobj,&wFilePath)==STATUS_SUCCESS)  //获取文件对象所对应的文件Dos设备名称,即是全路径
{    
wcscpy(fullUniName.Buffer,wFilePath->Name.Buffer);
ExFreePool(wFilePath);  //IoQueryFileDosDeviceName获取的OBJECT_NAME_INFORMATION 需要手动释放    
}
ObDereferenceObject(fileobj);  //放弃对FileObject的引用
}
*/



RtlFreeAnsiString(&AnsiProcessPath);
  /*
  {

ANSI_STRING apath;
UNICODE_STRING upath;

ANSI_STRING apathpre;
UNICODE_STRING upathpre;
转换路径的结束




ObReferenceObjectByHandle(FileHandle,GENERIC_READ,*IoFileObjectType,KernelMode,(PVOID *)&fileobj,NULL);
WriteFileName=fileobj->FileName.Buffer;

// 此处转换 路径
RtlInitUnicodeString(&upath,WriteFileName);
RtlUnicodeStringToAnsiString(&apath,&upath,TRUE);


volumeDosName = ExAllocatePool( PagedPool, 512*2+2*sizeof(ULONG));
volumeDosName->MaximumLength = 512*2;
memset(volumeDosName,0,volumeDosName->MaximumLength); 

//IoVolumeDeviceToDosName(pFileObject->DeviceObject, &DosName);
if (wcscmp(WriteFileName,PreWriteFileName)!=0){
IoVolumeDeviceToDosName( ((PFILE_OBJECT)fileobj)->DeviceObject, volumeDosName );
if  (volumeDosName!=NULL)//应该是这里会蓝屏

{
// 此处转换 盘符
RtlInitUnicodeString(&upathpre,volumeDosName->Buffer);
RtlUnicodeStringToAnsiString(&apathpre,&upathpre,TRUE);


KdPrint(("%s(%s)修改文件:%s%s \r\n",aProcessName,aProcessPath.Buffer,apathpre.Buffer,apath.Buffer));

//填写设备扩展
deviceExtension=(PDEVICE_EXTENSION)g_pDriverObject->DeviceExtension;


strcpy(deviceExtension->ProcName,aProcessName);
strcpy(deviceExtension->ProcFullPath,aProcessPath.Buffer);
strcpy(deviceExtension->FilePre,apathpre.Buffer);
strcpy(deviceExtension->FilePath,apath.Buffer);

//通知应用层可以来取了
KeSetEvent(deviceExtension->FileEvent,0,FALSE);
KeClearEvent(deviceExtension->FileEvent);


PreWriteFileName=WriteFileName;
}
}
ExFreePool(volumeDosName);
ObDereferenceObject(fileobj);
  }*/
}
}

return RealZwWriteFile(
  FileHandle, 
  Event OPTIONAL, 
  ApcRoutine OPTIONAL, 
  ApcContext OPTIONAL, 
  IoStatusBlock, 
  Buffer, 
  Length, 
  ByteOffset OPTIONAL, 
  Key OPTIONAL 
  );
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值