在Windows下添加系統調用不像Linux那樣容易,Windows系統調用與用戶程序之間還有Ntdll.dll層,而這一層微軟沒有提供源代碼,但是我們從系統調用的實現機制出發,不管是在linux還是Windows系統調用的實現都是通過中斷來實現的,可以利用中斷的方式調用新添加的系統調用。 下面以本實驗添加的系統調用爲例詳細介紹添加和使用方法。
下面是添加系統調用的基本過程,添加的系統調用名爲My_sysall:
1) 修改文件ntos/ke/i386/systable.asm:
① 在第392行插入語句:TABLE_ENTRY My_sysall,1,3
② 將下面緊挨着的一條語句改爲:TABLE_END 296
這裏296說明當前系統共實現296個系統調用,而新添加的系統調用號就是296(128H),用戶態可以通過往EAX寄存器存放128E,然後執行int 2EH 即可執行新添加的系統調用。
2) 修改文件public/sdk/inc/Ntexapi.h:
從第2766行開始插入語句(其實只是一個函數聲明):
NTSYSCALLAPI LONG NTAPI
NtMy_sysall(_ _in LONG input, _ _out PLONG output,_ _out PLONG page);
3) 修改文件ntos/ps/Creat.c,主要對進程相關結構操作,所以考慮在這裏添加系統調用。
第43行插入如下代碼:
#pragma alloc_text(PAGE, NtMy_sysall) |
文件的最後插入該函數的實現:
LONG NtMy_sysall (__in LONG input, __out PLONG output,__out PLONG page) { Add your code here. } |
4) 修改文件ntos/init/ntoskrnl.src:
在第912行插入字符串:NtMy_sysall
5) 使用cd /wrk-v1.2/base/ntos和nmake x86= 編譯內核,將新生成的內核映像文件wrkx86.exe替換原內核映像,
並用新內核啓動系統。
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
下面說明用戶態如何調用新添加的系統調用
在VC中建立應用程序,添加如下代碼:
LONG __stdcall add_syscall(IN LONG input, OUT PLONG output,OUT PLONG page) { char* stackFrame = (char*)&input;//參數指針 __asm { mov eax, 128H; //新添加系統調用的序號 mov edx, stackFrame;//參數的指針,後面的參數會自動傳到內核 int 2EH;//系統調用中斷 } } |
之後就可以通過add_syscall來調用添加的系統調用了。