国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
深入理解ZwCreateFile
前言:

任何編碼的東西必須充分的了解規(guī)則!

我試探性的搜索了下關(guān)于這個(gè)native api的相關(guān)的問題,很郁悶的發(fā)現(xiàn),這些問題90%都是沒有真正理解了這個(gè)函數(shù)導(dǎo)致的!

有的人連函數(shù)干嘛的都不知道就著急的寫驅(qū)動(dòng),真是不可一世!所謂兼收并蓄為的是厚積薄發(fā),其間如履薄冰。說的很貼切!

對此我一直支持achills師傅的思想!搞明白了最基本的和必須的東西,一切后續(xù)的東西迎刃而解!

這個(gè)文章我沒有過多的寫什么東西,因?yàn)楹芏鄸|西都文檔化了,只需要我們認(rèn)真而且真正從本質(zhì)上串一遍,完全的理解了它就可以了!而且有些東西也沒有必 要再寫了,比如HOOK SSDT inline hook等,現(xiàn)在缺的不是怎么實(shí)現(xiàn)一個(gè)代碼的流程,缺的是兩個(gè)東西:一個(gè)是思路,一個(gè)是準(zhǔn)確性。

原型:

NTSYSAPI
NTSTATUS
NTAPI
ZwCreateFile(
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
);

參數(shù)理解:
OUT-
FileHandle--------這是一個(gè)指向一個(gè)變量的指針,用來最后存放file object handle的
IoStatusBlock-----這個(gè)也是個(gè)指針變量,指向一個(gè)叫做IO_STATUS_BLOCK的結(jié)構(gòu)體,最后函數(shù)返回的時(shí)候,這個(gè)結(jié)構(gòu)體的成員 里面要填充一些值,具體的呢就是完成狀態(tài),請求操作的一些信息,最重要的一個(gè)成員就是Information成員,他顯示了函數(shù)對文件的處理方式,他的值 可能是下面的幾個(gè):
FILE_SUPERSEDED(替代)
FILE_OPENED(打開)
FILE_CREATED(創(chuàng)建)
FILE_OVERWRITTEN(重寫)
FILE_EXISTS(存在)
FILE_DOES_NOT_EXIST(文件不存在)

再看下這個(gè)IO_STATUS_BLOCK的具體結(jié)構(gòu):
typedef struct _IO_STATUS_BLOCK {
union {
    NTSTATUS Status;
    PVOID Pointer;
} DUMMYUNIONNAME;

ULONG_PTR Information;
} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;

通過上述的兩個(gè)輸出的參數(shù)我們可以看到,這個(gè)ZwCreateFile函數(shù)就是返回創(chuàng)建好的文件對象的句柄,然后返回一個(gè)期間處理的方式。

IN-
DesiredAccess----這個(gè)參數(shù)指定一個(gè)訪問權(quán)限,大概有以下的權(quán)限:
FILE_ANY_ACCESS 0x0000 // any type
FILE_READ_ACCESS 0x0001 // file & pipe
FILE_READ_DATA 0x0001 // file & pipe
FILE_LIST_DIRECTORY 0x0001 // directory
FILE_WRITE_ACCESS 0x0002 // file & pipe
FILE_WRITE_DATA 0x0002 // file & pipe
FILE_ADD_FILE 0x0002 // directory
FILE_APPEND_DATA 0x0004 // file
FILE_ADD_SUBDIRECTORY 0x0004 // directory
FILE_CREATE_PIPE_INSTANCE 0x0004 // named pipe
FILE_READ_EA 0x0008 // file & directory
FILE_WRITE_EA 0x0010 // file & directory
FILE_EXECUTE 0x0020 // file
FILE_TRAVERSE 0x0020 // directory
FILE_DELETE_CHILD 0x0040 // directory
FILE_READ_ATTRIBUTES 0x0080 // all types
FILE_WRITE_ATTRIBUTES 0x0100 // all types
FILE_ALL_ACCESS // All of the preceding +
STANDARD_RIGHTS_ALL
最后一個(gè)權(quán)限最大
這里面要注意的是范圍問題,有的值只適合目錄,有的只適合管道,有的只適合命名管道,有的同時(shí)適用,想下這個(gè)地方可以做什么文章

ObjectAttributes---指向下面這個(gè)結(jié)構(gòu)的一個(gè)變量,就是來表明文件對象的屬性的。
typedef struct _OBJECT_ATTRIBUTES {
ULONG Length;
HANDLE RootDirectory;
PUNICODE_STRING ObjectName;
ULONG Attributes;
PVOID SecurityDescriptor;       /* type SECURITY_DESCRIPTOR */
PVOID SecurityQualityOfService; /* type SECURITY_QUALITY_OF_SERVICE */
} OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES;
這個(gè)結(jié)構(gòu)是針對很多對象的,不光是針對文件對象的,所以O(shè)BJ_PERMANENT(永久), OBJ_EXCLUSIVE(互斥),
and OBJ_OPENLINK這三個(gè)實(shí)際上對于文件對象來說始終是無效的,為什么?
不能設(shè)置那三個(gè),那可以設(shè)置些什么呢?呼呼


AllocationSize---這是個(gè)可選的參數(shù),他是指定初始化文件需要的內(nèi)存字節(jié)數(shù)的,所以可向而知,他只有在真正的涉及到文件創(chuàng)建的時(shí)候才有意義,也就是說創(chuàng)建,重寫,替換這些操作的時(shí)候。指向一個(gè)LARGE_INTEGER:
typedef union _LARGE_INTEGER {
    _ANONYMOUS_STRUCT struct
    {
        ULONG LowPart;
        LONG HighPart;
    } DUMMYSTRUCTNAME;
    struct
    {
        ULONG LowPart;
        LONG HighPart;
    } u;
#endif //MIDL_PASS
    LONGLONG QuadPart;
} LARGE_INTEGER, *PLARGE_INTEGER;
這個(gè)結(jié)構(gòu)體在內(nèi)核結(jié)構(gòu)里面很常見,呼呼,,支持到64位,看情況設(shè)置。不過我至今沒有明白QuadPart這個(gè)是干嘛的!

FileAttributes---這個(gè)參數(shù)指定文件的屬性,剛才是文件對象的屬性。可以是以下的:
FILE_ATTRIBUTE_READONLY
FILE_ATTRIBUTE_HIDDEN
FILE_ATTRIBUTE_SYSTEM
FILE_ATTRIBUTE_DIRECTORY
FILE_ATTRIBUTE_ARCHIVE
FILE_ATTRIBUTE_NORMAL
FILE_ATTRIBUTE_TEMPORARY
FILE_ATTRIBUTE_SPARSE_FILE
FILE_ATTRIBUTE_REPARSE_POINT
FILE_ATTRIBUTE_COMPRESSED
FILE_ATTRIBUTE_OFFLINE
FILE_ATTRIBUTE_NOT_CONTENT_INDEXED
FILE_ATTRIBUTE_ENCRYPTED

ShareAccess---指定共享的權(quán)限,以下三種的組合:
FILE_SHARE_READ
FILE_SHARE_WRITE
FILE_SHARE_DELETE

CreateDisposition---這個(gè)參數(shù)指定要對文件干嘛,呼呼,可以是下面的值:
FILE_SUPERSEDE
FILE_OPEN
FILE_CREATE
FILE_OPEN_IF
FILE_OVERWRITE
FILE_OVERWRITE_IF


CreateOptions---這個(gè)參數(shù)指定創(chuàng)建或者打開文件的時(shí)候做的一些事情,可以是以下的組合:
FILE_DIRECTORY_FILE
FILE_WRITE_THROUGH
FILE_SEQUENTIAL_ONLY
FILE_NO_INTERMEDIATE_BUFFERING
FILE_SYNCHRONOUS_IO_ALERT
FILE_SYNCHRONOUS_IO_NONALERT
FILE_NON_DIRECTORY_FILE
FILE_CREATE_TREE_CONNECTION
FILE_COMPLETE_IF_OPLOCKED
FILE_NO_EA_KNOWLEDGE
FILE_OPEN_FOR_RECOVERY
FILE_RANDOM_ACCESS
FILE_DELETE_ON_CLOSE
FILE_OPEN_BY_FILE_ID
FILE_OPEN_FOR_BACKUP_INTENT
FILE_NO_COMPRESSION
FILE_RESERVE_OPFILTER
FILE_OPEN_REPARSE_POINT
FILE_OPEN_NO_RECALL
FILE_OPEN_FOR_FREE_SPACE_QUERY
這個(gè)我不太清楚,概念有點(diǎn)模糊

EaBuffer---這個(gè)是個(gè)可選的參數(shù),用來存放一些擴(kuò)展的屬性
EaLength---存放擴(kuò)展屬性的字節(jié)大小
有個(gè)疑問,這個(gè)擴(kuò)展屬性什么時(shí)候用呢?(TDI里面常用這個(gè))

更詳細(xì)的參數(shù)的理解參考
http://xiaomaier.bokee.com/3439967.html

返回值理解:
如果成功,返回STATUS_SUCCESS
如果失敗,返回
STATUS_ACCESS_DENIED,
STATUS_OBJECT_NAME_NOT_FOUND, STATUS_OBJECT_NAME_COLLISION,
STATUS_OBJECT_NAME_INVALID, STATUS_SHARING_VIOLATION, STATUS_NOT_A_DIRECTORY, or
STATUS_FILE_IS_A_DIRECTORY.

說明:
1.與這個(gè)native api相關(guān)的r3api是CreateFile
2.DDK里面對這個(gè)函數(shù)有詳細(xì)的說明


擴(kuò)展:
1.與CreateFile這個(gè)api的異同。
同:
(1)功能基本相同,都是可以打開或者創(chuàng)建一個(gè)文件對象,包括文件,磁盤,卷,管道,串口,油槽等
(2)都是返回一個(gè)文件句柄
異:
(1)在vista及以上的版本,CreateFile做了擴(kuò)展,加上了事務(wù)性文件系統(tǒng)
HANDLE WINAPI CreateFileTransacted(
__in          LPCTSTR lpFileName,
__in          DWORD dwDesiredAccess,
__in          DWORD dwShareMode,
__in_opt      LPSECURITY_ATTRIBUTES lpSecurityAttributes,
__in          DWORD dwCreationDisposition,
__in          DWORD dwFlagsAndAttributes,
__in_opt      HANDLE hTemplateFile,
__in          HANDLE hTransaction,
__in_opt      PUSHORT pusMiniVersion,
PVOID pExtendedParameter
);

但是ZwCreateFile還是那樣
(2)HANDLE WINAPI CreateFile(
__in          LPCTSTR lpFileName,
__in          DWORD dwDesiredAccess,
__in          DWORD dwShareMode,//////////////////////
__in          LPSECURITY_ATTRIBUTES lpSecurityAttributes,
__in          DWORD dwCreationDisposition,
__in          DWORD dwFlagsAndAttributes,
__in          HANDLE hTemplateFile
);
NTSYSAPI
NTSTATUS
NTAPI
ZwCreateFile(
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
);

2.內(nèi)核里與ZwCreateFile功能相似的還有一個(gè)函數(shù)IoCreateFile
NTSTATUS IoCreateFile
(   
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 Disposition,   
IN ULONG CreateOptions,   
IN PVOID EaBuffer OPTIONAL,    I
N ULONG EaLength,   
IN CREATE_FILE_TYPE CreateFileType,   
IN PVOID ExtraCreateParameters OPTIONAL,   
IN ULONG Options   
) ;
windbg看下,其實(shí)ZwCreateFile內(nèi)部調(diào)用了IoCreateFile

至于這兩個(gè)函數(shù)的區(qū)別可以參考combojiang的http://hi.baidu.com/combojiang/blog/item/cd6269de55ce235eccbf1adb.html

IoCreateFile內(nèi)部還調(diào)用了一個(gè)allmul函數(shù),這個(gè)函數(shù)是用來做int64的移位的,具體的參考
http://hi.baidu.com/combojiang/blog/item/29411c5c6841ae45fbf2c088.html

據(jù)說IoCreateFile函數(shù)更優(yōu)良一些,IceSword就調(diào)用了這個(gè)函數(shù)來打開ntoskrnl。exe的

3.hook ZwCreateFile是很簡單的,,hook SSDT就可以了!考慮個(gè)問題:
ZwCreateFile是創(chuàng)建文件的,那么如果我們hook之后比如函數(shù)變成了my_ZwCreateFile(),這個(gè)時(shí)候我們還想調(diào)用ZwCreateFile創(chuàng)建文件的話,就會(huì)出錯(cuò),還想再創(chuàng)建文件,怎么辦?
這個(gè)得做個(gè)線程模式的切換。
詳細(xì)的可以參考http://www.cnblogs.com/jokerfox/archive/2009/04/14/1435819.html

4.ZwCreateFile是運(yùn)行在PASSIVE_LEVEL上的。那么比如要調(diào)用這個(gè)函數(shù)的程序必須運(yùn)行在DISPATCH_LEVEL呢?怎么調(diào)用?
http://xuyingpin.blogbus.com/logs/10845127.html
http://xuyingpin.blogbus.com/logs/11152569.html


最簡單的使用方法:
BOOL testCreateFile(IN PUNICODE_STRING filename)
{
    HANDLE hFile=NULL;
    NTSTATUS status;
    IO_STATUS_BLOCK isb;
    OBJECT_ATTRIBUTES oa;
   
         InitializeObjectAttributes(&oa,filename,OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE,NULL,NULL);
   
    status=ZwCreateFile(&hFile,GENERIC_ALL,&oa,&isb,NULL,FILE_ATTRIBUTE_NORMAL,FILE_SHARE_READ,FILE_CREATE,FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT,NULL,0);
   
    if(NT_SUCCESS(status))
    {
    status=STATUS_SUCCESS;
    }
    else
    {
    status=isb.Status;
    }
   
    DbgPrint("hFile=%08X",hFile);
   
    if(hFile)
    {
    ZwClose(hFile);
    }
    return status;

hook ZwCreateFile的思路:
1.hook SSDT
NTSTATUS NewZwCreateFile(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 ntS = (NTSTATUS) NULL;
   
    DbgPrint("ZwCreateFile called\n");
   
   
    ntS = ((ZWCREATEFILE)(OldZwCreateFile)) (
        FileHandle,
        DesiredAccess,
        ObjectAttributes,
        IoStatusBlock,
        AllocationSize,
        FileAttributes,
        ShareAccess,
        CreateDisposition,
        CreateOptions,
        EaBuffer,
        EaLength);
    return(ntS);
}
http://dev.csdn.net/article/36/36751.shtm
http://www.zeroplace.cn/article.asp?id=138

2.通過調(diào)試寄存器hook
http://www.xfocus.net/articles/200709/950.html

3.inline hook
http://hackbase.com/tech/2009-05-11/52690.html系列


總結(jié):
我們站在一個(gè)稍微高的地方來看一些東西

任何用戶態(tài)或核心態(tài)的函數(shù)CreateFile或者內(nèi)核態(tài)的ZwCreateFile等都是為了獲得handle,為進(jìn)一步的訪問做準(zhǔn)備。而在獲得 handle的過程中,調(diào)用者需要提供DesiredAccess和ShareAccess等選項(xiàng)。如果文件已經(jīng)被另一個(gè)調(diào)用者以排他方式打開,這時(shí)候的 訪問就會(huì)失敗。

那么我們可以這么想一個(gè)問題,如果我們精通一種驗(yàn)證機(jī)制,或者說構(gòu)造一種驗(yàn)證機(jī)制的話,那么訪問不需要這么復(fù)雜就可以實(shí)現(xiàn),這就是邪惡的繞過技術(shù)!那么針對我剛才說的話,具體的可以參考這么幾種技術(shù):

搜索句柄表,關(guān)閉句柄
DKOM
區(qū)域映射
I/O

我還不清楚這里面的研究空間有多大,反正我見好多人都是怎么xx了,怎么繞過什么了,怎么投機(jī)了一下過了什么保護(hù)了,其實(shí)從個(gè)人需求來看,確實(shí)是一個(gè)突破,若從全局來看,根本是牽一發(fā)不動(dòng)全身的!

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
驅(qū)動(dòng)讀寫超時(shí)處理
驅(qū)動(dòng)程序中文件,定時(shí)器,IO
利用偽造內(nèi)核文件來繞過IceSword的檢測
Windows CE文件操作
CreateFile 函數(shù)詳解
CreateFile 函數(shù)說明
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服