2016-02-29 111 views
-1

我使用的是最新版本的EasyHook的勾一些內核函數。 我做安裝調試成功的重要一個Windows 8.1的64位基於虛擬機上,我測試了,沒有任何問題,在內核模式下在用戶模式和NtQuerySystemInformation掛鉤都NtQuerydirectoryFile和NtQuerySystemInformation的。從內核調用掛鉤崩潰NtQuerydirectoryFile內核

我現在的問題是使用我用於用戶模式掛鉤相同的代碼掛鉤NtQuerydirectoryFile,但是當我調用原始的功能給我一個訪問衝突錯誤失敗。我使用下面的代碼爲內核模式鉤:

NTSTATUS NtQueryDirectoryFile_Hook(
    __in HANDLE FileHandle, 
    __in_opt HANDLE Event, 
    __in_opt PIO_APC_ROUTINE ApcRoutine, 
    __in_opt PVOID ApcContext, 
    __out PIO_STATUS_BLOCK IoStatusBlock, 
    __out_bcount(Length) PVOID FileInformation, 
    __in ULONG Length, 
    __in FILE_INFORMATION_CLASS FileInformationClass, 
    __in BOOLEAN ReturnSingleEntry, 
    __in PUNICODE_STRING FileName OPTIONAL, 
    __in BOOLEAN RestartScan 
    ) 
{ 
    NTSTATUS status; 
    status = NtQueryDirectoryFile(FileHandle, Event, ApcRoutine, ApcContext, IoStatusBlock, FileInformation, Length, FileInformationClass, ReturnSingleEntry, FileName, RestartScan); 
    return status; 
} 
+0

這裏是轉儲: http://pastebin.com/Y29dsRUQ – FiFo

+0

它看起來像BuildQueryDirectoryIrp函數期望RAX寄存器中的某種參數,並且由於實現了蹦牀跳轉的方式,RAX寄存器數據丟失了! 所以我代替它: '48 B8 00 00 00 00 00 00 00 00 MOV RAX,爲0x0 FF E0 JMP rax' 本: '50 \t \t \t \t \t \t \t推RAX 48 B8 00 00 00 00 00 00 00 00 MOV RAX,爲0x0 48 87 04 24 XCHG QWORD PTR [RSP],RAX C3 \t \t ret' – FiFo

回答

0

正如我前面提到的,原來蹦牀跳修改RAX寄存器,所以我用另一個蹦牀替代它:

50        push rax 
48 b8 00 00 00 00 00 00 00 00 mov rax, 0x0 
48 87 04 24     xchg QWORD PTR [rsp],rax 
c3        ret 

在除了固定依靠在蹦牀上跳碼的硬編碼的大小,因爲新版本是更大的功能。現在它工作沒有任何問題。