最近在學習native api,做個筆記,以後可能用得上
首先要明白NATIVE api是什嗎?
我比較喜歡這樣理解:
native API 可以譯做“原生API”
比如您的應用程式調用Win32 API如ReadFile, 此時ReadFile會在底層調用ntdll.dll中匯出的NtReadFile,讀取檔案的實際工作就轉交給了NtReadFile常式了,這個NtReadFile即為Native API.
注意:這個NtReadFile是作業系統中未文檔化的常式,所以不適合在應用程式中直接調用。
其實native api功能非常強大,網上的牛人也給出了RING3下使用native api的方法。
調用方式一(一般方式):
第一步:聲明函數指標
比如我們需要調用NtCreateFile函數,那麼我們就需要根據NtCreateFile的定義來聲明一個相同類型的函數指標(這樣做會讓編譯器比較高興)
typedef NTSTATUS (* MyNtCreateFile) (
OUT PHANDLE FileHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
//OUT PIO_STATUS_BLOCK IoStatusBlock,
OUT PVOID 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
);
MyNtCreateFile MyNtCreateFileFun; 第二步: 擷取native api在natdll中的地址
MyNtCreateFileFun= (MyNtCreateFile)GetProcAddress (GetModuleHandle("ntdll.dll"), "NtCreateFile"); 第三步: 調用native api完成功能
HOOK native api和HOOK其他API函數是一樣的!就是那麼幾種HOOK方法,IAT HOOK,INLINE HOOK等
實現思路就是這樣:
這裡以ZwWriteFile函數為例,代碼如下,這裡用的是寫入程式碼,可以用detours hook的
7C92DF7E > B8 12010000 mov eax,112 ; ZwWriteFile
7C92DF83 BA 0003FE7F mov edx,7FFE0300
7C92DF88 FF12 call dword ptr ds:[edx] ; ntdll.KiFastSystemCall
7C92DF8A C2 2400 retn 24
hook的基本思路是:修改函數入口處的第5——12位元組,既是把
7C92DF83 BA 0003FE7F mov edx,7FFE0300
7C92DF88 FF12 call dword ptr ds:[edx] ; ntdll.KiFastSystemCall
修改成:
mov edx,[自訂的hook函數地址]
call edx
修改後的代碼如下:
7C92DF7E > B8 12010000 mov eax,112 ; ZwWriteFile
7C92DF83 BA 0003FE7F mov edx,xxxxxxxx ;xxxxx是hook函數的地址,定義在你的dll中
7C92DF88 FF12 call edx ;call到你的hook函數中
7C92DF8A C2 2400 retn 24
在自己的函數內要注意堆棧平衡!