青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

S.l.e!ep.¢%

像打了激速一樣,以四倍的速度運轉,開心的工作
簡單、開放、平等的公司文化;尊重個性、自由與個人價值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

FileMon源碼學習筆記(一)

Posted on 2010-02-18 15:10 S.l.e!ep.¢% 閱讀(1858) 評論(0)  編輯 收藏 引用 所屬分類: Windows WDM
FileMon源碼學習筆記(一)
2008-11-24 09:37

//----------------------------------------------------------------------
//
// HookDrive
//
// Hook the drive specified by determining which device object to
// attach to. The algorithm used here is similar to the one used
// internally by NT to determine which device object a file system request
// is directed at.
//
//----------------------------------------------------------------------
BOOLEAN
HookDrive(
??? IN ULONG Drive,
??? IN PDRIVER_OBJECT DriverObject
??? )
{
??? IO_STATUS_BLOCK???? ioStatus;
??? HANDLE????????????? ntFileHandle;??
??? OBJECT_ATTRIBUTES?? objectAttributes;
??? PDEVICE_OBJECT????? fileSysDevice;
??? PDEVICE_OBJECT????? hookDevice;
??? UNICODE_STRING????? fileNameUnicodeString;
??? PFILE_FS_ATTRIBUTE_INFORMATION fileFsAttributes;
??? ULONG?????????????? fileFsAttributesSize;
??? WCHAR?????????????? filename[] = L"
\\DosDevices\\A:\\ ";
??? NTSTATUS??????????? ntStatus;
??? ULONG?????????????? i;
??? PFILE_OBJECT??????? fileObject;
??? PHOOK_EXTENSION???? hookExtension;
???
??? //
??? // Is it a legal drive letter?
??? //
??? if( Drive >= 26 ) {

??????? return FALSE;
??? }

??? //
??? // Has this drive already been hooked?
??? //
??? if( DriveHookDevices[Drive] == NULL ) {

??????? //
??????? // Frob the name to make it refer to the drive specified in the input
??????? // parameter.
??????? //
??????? filename[12] = (CHAR) ('A'+Drive);

??????? //
??????? // We have to figure out what device to hook - first open the volume's
??????? // root directory
??????? //
??????? RtlInitUnicodeString( &fileNameUnicodeString, filename );
??????? InitializeObjectAttributes( &objectAttributes, &fileNameUnicodeString,
??????????????????????????????????? OBJ_CASE_INSENSITIVE, NULL, NULL );
??????? ntStatus = ZwCreateFile( &ntFileHandle, SYNCHRONIZE|FILE_ANY_ACCESS,
???????????????????????????????? &objectAttributes, &ioStatus, NULL, 0, FILE_SHARE_READ|FILE_SHARE_WRITE,
???????????????????????????????? FILE_OPEN,
???????????????????????????????? FILE_SYNCHRONOUS_IO_NONALERT|FILE_DIRECTORY_FILE,
???????????????????????????????? NULL, 0 );
??????? if( !NT_SUCCESS( ntStatus ) ) {

??????????? DbgPrint(("Filemon: Could not open drive %c: %x\n", 'A'+Drive, ntStatus ));
??????????? return FALSE;
??????? }

??????? DbgPrint(("Filemon: opened the root directory!!! handle: %x\n", ntFileHandle));??

??????? //
??????? // Got the file handle, so now look-up the file-object it refers to
??????? //
??????? ntStatus = ObReferenceObjectByHandle( ntFileHandle, FILE_READ_DATA,
????????????????????????????????????????????? NULL, KernelMode, &fileObject, NULL );
??????? if( !NT_SUCCESS( ntStatus )) {

??????????? DbgPrint(("Filemon: Could not get fileobject from handle: %c\n", 'A'+Drive ));
??????????? ZwClose( ntFileHandle );
??????????? return FALSE;
??????? }

??????? //
??????? // Next, find out what device is associated with the file object by getting its related
??????? // device object
??????? //
??????? fileSysDevice = IoGetRelatedDeviceObject( fileObject );

??????? if( ! fileSysDevice ) {

??????????? DbgPrint(("Filemon: Could not get related device object: %c\n", 'A'+Drive ));
??????????? ObDereferenceObject( fileObject );
??????????? ZwClose( ntFileHandle );
??????????? return FALSE;
??????? }

??????? //
??????? // Check the device list to see if we've already attached to this particular device.
??????? // This can happen when more than one drive letter is being handled by the same network
??????? // redirecter
??????? //
??????? for( i = 0; i < 26; i++ ) {

??????????? if( DriveHookDevices[i] == fileSysDevice ) {

??????????????? //
??????????????? // If we're already watching it, associate this drive letter
??????????????? // with the others that are handled by the same network driver. This
??????????????? // enables us to intelligently update the hooking menus when the user
??????????????? // specifies that one of the group should not be watched -we mark all
??????????????? // of the related drives as unwatched as well
??????????????? //
??????????????? ObDereferenceObject( fileObject );
??????????????? ZwClose( ntFileHandle );
??????????????? DriveHookDevices[ Drive ] = fileSysDevice;
??????????????? return TRUE;
??????????? }
??????? }

??????? //
??????? // The file system's device hasn't been hooked already, so make a hooking device
??????? // object that will be attached to it.
??????? //
??????? ntStatus = IoCreateDevice( DriverObject,
?????????????????????????????????? sizeof(HOOK_EXTENSION),
?????????????????????????????????? NULL,
?????????????????????????????????? fileSysDevice->DeviceType,
?????????????????????????????????? 0,
?????????????????????????????????? FALSE,
?????????????????????????????????? &hookDevice );
??????? if( !NT_SUCCESS(ntStatus) ) {

??????????? DbgPrint(("Filemon: failed to create associated device: %c\n", 'A'+Drive ));??

??????????? ObDereferenceObject( fileObject );
??????????? ZwClose( ntFileHandle );

??????????? return FALSE;
??????? }

??????? //
??????? // Clear the device's init flag as per NT DDK KB article on creating device
??????? // objects from a dispatch routine
??????? //
??????? hookDevice->Flags &= ~DO_DEVICE_INITIALIZING;

??????? //
??????? // Setup the device extensions. The drive letter and file system object are stored
??????? // in the extension.
??????? //
??????? hookExtension = hookDevice->DeviceExtension;
??????? hookExtension->LogicalDrive = 'A'+Drive;
??????? hookExtension->FileSystem?? = fileSysDevice;
??????? hookExtension->Hooked?????? = TRUE;
??????? hookExtension->Type???????? = STANDARD;

??????? //
??????? // Finally, attach to the device. The second we're successfully attached, we may
??????? // start receiving IRPs targetted at the device we've hooked.
??????? //
??????? ntStatus = IoAttachDeviceByPointer( hookDevice, fileSysDevice );
??????? if( !NT_SUCCESS(ntStatus) ) {

??????????? //
??????????? // Couldn' attach for some reason
??????????? //
??????????? DbgPrint(("Filemon: Connect with Filesystem failed: %c (%x) =>%x\n",
????????????????????? 'A'+Drive, fileSysDevice, ntStatus ));

??????????? //
??????????? // Derefence the object and get out
??????????? //
??????????? ObDereferenceObject( fileObject );
??????????? ZwClose( ntFileHandle );

??????????? return FALSE;

??????? } else {

??????????? //
??????????? // Make a new drive group for the device,l if it does not have one
??????????? // already
??????????? //
??????????? DbgPrint(("Filemon: Successfully connected to Filesystem device %c\n", 'A'+Drive ));
??????? }

??????? //
??????? // Determine if this is a NTFS drive
??????? //
??????? fileFsAttributesSize = sizeof( FILE_FS_ATTRIBUTE_INFORMATION) + MAXPATHLEN;
??????? hookExtension->FsAttributes = (PFILE_FS_ATTRIBUTE_INFORMATION) ExAllocatePool( NonPagedPool,
?????????????????????????????????????????????????????????????????????????????????????? fileFsAttributesSize );
??????? if( hookExtension->FsAttributes &&
??????????? !NT_SUCCESS( IoQueryVolumeInformation( fileObject, FileFsAttributeInformation,
?????????????????????????????????????????????????? fileFsAttributesSize, hookExtension->FsAttributes,
?????????????????????????????????????????????????? &fileFsAttributesSize ))) {

??????????? //
??????????? // On failure, we just don't have attributes for this file system
??????????? //
??????????? ExFreePool( hookExtension->FsAttributes );
??????????? hookExtension->FsAttributes = NULL;
??????? }

??????? //
??????? // Close the file and update the hooked drive list by entering a
??????? // pointer to the hook device object in it.
??????? //
??????? ObDereferenceObject( fileObject );

??????? ZwClose( ntFileHandle );

??????? DriveHookDevices[Drive] = hookDevice;
???????
??? } else {

??????? hookExtension = DriveHookDevices[Drive]->DeviceExtension;
??????? hookExtension->Hooked = TRUE;
??? }
??? return TRUE;
}

以上摘自FileMon源碼,作者在獲得要hook的設備的DeviceObject的時候用了以下方式:

ZwCreateFile——》ObReferenceObjectByHandle——》IoGetRelatedDeviceObject

另外,這個設備對象也可以直接用一個函數獲得IoGetDeviceObjectPointer,該函數原型如下:

NTSTATUS
IoGetDeviceObjectPointer(
??? IN PUNICODE_STRING ObjectName ,
??? IN ACCESS_MASK DesiredAccess ,
??? OUT PFILE_OBJECT * FileObject ,
??? OUT PDEVICE_OBJECT * DeviceObject
??? );

直接由名字獲得設備對象和文件對象,而該函數內部的實現方式combojiang大俠也給出過c的逆向代碼如下: 逆向為c的代碼:
NTSTATUS
IoGetDeviceObjectPointer(
???? IN PUNICODE_STRING ObjectName,
???? IN ACCESS_MASK DesiredAccess,
???? OUT PFILE_OBJECT *FileObject,
???? OUT PDEVICE_OBJECT *DeviceObject
???? )
{
???? IO_STATUS_BLOCK ioStatus;
???? OBJECT_ATTRIBUTES objectAttributes;
????
???? //額外定義出來的棧變量。由于C與匯編的游戲規則不同。
???? PFILE_OBJECT fileObject;
???? HANDLE fileHandle;
???? NTSTATUS status;
????
???? InitializeObjectAttributes( &objectAttributes,
???????????????????????????????? ObjectName,
???????????????????????????????? OBJ_KERNEL_HANDLE,
???????????????????????????????? (HANDLE) NULL,
???????????????????????????????? (PSECURITY_DESCRIPTOR) NULL );
????????????????????????????????
??? status = ZwOpenFile( &fileHandle,
????????????????????????? DesiredAccess,
????????????????????????? &objectAttributes,
????????????????????????? &ioStatus,
????????????????????????? 0,
????????????????????????? 0x40 );

???? if (status >= 0)
???? {

????????? status = ObReferenceObjectByHandle( fileHandle,
???????????????????????????????????????????? 0,
???????????????????????????????????????????? IoFileObjectType,
???????????????????????????????????????????? 0,
???????????????????????????????????????????? (PVOID *) &fileObject,
???????????????????????????????????????????? 0 );
???????? if (status >= 0)
???????? {

???????????? *FileObject = fileObject;
???????????? *DeviceObject = IoGetRelatedDeviceObject( fileObject );
???????? }

???????? ZwClose( fileHandle );
???? }

???? return status;
}
與FileMon的源碼使用的方法類似,所以FileMon源碼里面應該可以用這個函數直接替代,但是原作者沒有直接調用這個函數,不知道原因是什么,難道是寫FileMon的時候還沒提供這個函數,所以要自己來實現嗎?

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美1区视频| 久久久久国色av免费观看性色| 久久亚洲美女| 久久精品夜夜夜夜久久| 激情文学综合丁香| 亚洲国产成人久久综合一区| 麻豆国产精品一区二区三区| 亚洲剧情一区二区| 在线视频你懂得一区| 国产日韩欧美二区| 欧美激情视频一区二区三区不卡| 欧美成人一品| 亚洲一区二区三区777| 亚洲女优在线| 亚洲福利视频在线| 亚洲视屏一区| 亚洲国产黄色| 亚洲永久网站| 加勒比av一区二区| 99精品国产福利在线观看免费 | 国产一区二区毛片| 亚洲国产精品美女| 国产欧美日韩精品一区| 亚洲高清在线观看一区| 国产精品一区二区视频| 欧美 日韩 国产一区二区在线视频| 欧美精品日韩综合在线| 久久久噜噜噜久久中文字幕色伊伊| 欧美成人一区二区| 久久精品国产一区二区三| 欧美久久影院| 免费看成人av| 国产精品婷婷| 亚洲毛片在线看| 亚洲成色999久久网站| 亚洲性人人天天夜夜摸| 亚洲卡通欧美制服中文| 久久久久久久尹人综合网亚洲| 一区二区三区四区蜜桃| 久久综合影音| 久久久亚洲精品一区二区三区 | 欧美v日韩v国产v| 久久成人国产| 国产精品久久久对白| 亚洲人成在线观看一区二区| 在线精品福利| 久久狠狠亚洲综合| 欧美在线观看视频一区二区三区| 欧美国产一区在线| 欧美高清在线一区| 在线免费日韩片| 久久精品国产久精国产一老狼| 欧美一区二区三区精品| 国产精品老女人精品视频| 亚洲精选一区| 宅男精品视频| 欧美日韩精品免费看| 亚洲国产婷婷香蕉久久久久久| 伊人久久亚洲美女图片| 久久精品麻豆| 欧美3dxxxxhd| 亚洲欧洲日产国码二区| 欧美精品成人一区二区在线观看 | 在线视频日韩| 午夜精品久久久久久久99热浪潮| 欧美午夜一区二区福利视频| av不卡在线观看| 亚洲一区二区三区午夜| 国产精品成人免费视频| 99视频超级精品| 亚洲中午字幕| 国产日韩一区二区| 欧美一区二区免费| 蜜桃久久av一区| 亚洲免费高清视频| 国产精品夫妻自拍| 午夜视黄欧洲亚洲| 欧美jizz19hd性欧美| 亚洲美女色禁图| 国产精品家教| 久久精品国产第一区二区三区最新章节 | 亚洲女同精品视频| 久久久五月天| 日韩视频久久| 国产精品一区二区欧美| 久久久91精品国产| 亚洲破处大片| 欧美中文在线视频| 亚洲激情视频网| 欧美日一区二区三区在线观看国产免| a4yy欧美一区二区三区| 久久疯狂做爰流白浆xx| 亚洲国产精品成人| 国产精品igao视频网网址不卡日韩| 亚洲综合欧美日韩| 欧美国产日本在线| 亚洲欧美日韩精品综合在线观看| 韩国一区电影| 欧美三级第一页| 久久久久久999| 亚洲天堂av图片| 欧美成人免费全部| 香蕉成人久久| 亚洲精品看片| 国产真实久久| 欧美丝袜一区二区三区| 久久免费国产| 午夜精品久久久久久久久久久久久| 欧美激情二区三区| 久久国产66| 亚洲一区日韩在线| 亚洲国产一成人久久精品| 国产精品一区二区男女羞羞无遮挡| 女仆av观看一区| 欧美在线观看www| 夜夜夜久久久| 亚洲三级免费观看| 免费日本视频一区| 欧美呦呦网站| 亚洲一区二区3| 9l视频自拍蝌蚪9l视频成人| 黄色成人在线网址| 国产免费成人| 国产精品免费视频观看| 欧美日韩黄色一区二区| 免费人成精品欧美精品| 久久精品理论片| 欧美一区二区三区日韩| 亚洲综合视频在线| 制服丝袜激情欧洲亚洲| 亚洲欧洲在线视频| 亚洲精品1234| 亚洲激情中文1区| 亚洲国产成人高清精品| 男女激情久久| 欧美大学生性色视频| 蜜臀久久99精品久久久久久9 | 久久九九电影| 久久九九全国免费精品观看| 欧美一区二区三区在线观看视频 | 亚洲激情不卡| 亚洲欧洲一区| 日韩亚洲国产欧美| 亚洲天堂免费观看| 亚洲男人的天堂在线观看 | 亚洲国产99精品国自产| 欧美激情亚洲| 亚洲人成亚洲人成在线观看| 亚洲美女网站| 亚洲一区二区欧美日韩| 亚洲欧美日韩精品久久久| 亚洲欧美日韩区| 久久精品91久久久久久再现| 久久精品国产亚洲一区二区| 久久一综合视频| 欧美激情亚洲自拍| 欧美手机在线视频| 国产一区二区三区久久悠悠色av | 欧美国产日韩精品| 亚洲国产另类久久精品| 亚洲激情不卡| 亚洲一区二区视频| 久久久久久夜| 欧美成人免费全部观看天天性色| 欧美日韩和欧美的一区二区| 国产精品免费一区二区三区观看 | 免费不卡在线观看| 欧美激情一区二区三区高清视频| 欧美国产在线电影| 国产伦精品一区二区三区| 国内精品久久久久影院薰衣草| 亚洲国产精品激情在线观看| 亚洲新中文字幕| 久久久久久久久伊人| 亚洲日本成人| 久久se精品一区二区| 欧美激情精品久久久久久免费印度| 国产精品国产馆在线真实露脸 | 在线观看日韩国产| 亚洲四色影视在线观看| 久久久精品国产免大香伊 | 亚洲国产一区二区a毛片| 中文亚洲视频在线| 理论片一区二区在线| 国产精品美女一区二区| 亚洲国产精品一区| 欧美一区二区三区男人的天堂| 欧美激情一区二区| 欧美一区二区三区久久精品茉莉花| 久久综合久久美利坚合众国| 国产精品视频免费| 一本高清dvd不卡在线观看| 久久久综合网站| 亚洲天堂网在线观看| 欧美精品国产精品日韩精品| 红桃视频欧美| 欧美自拍偷拍| 亚洲在线免费视频| 欧美日韩一二三区| 99在线观看免费视频精品观看|