內核添加系統調用

 

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個系統調用,而新添加的系統調用號就是296128H),用戶態可以通過往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來調用添加的系統調用了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章