内核添加系统调用

来源:互联网 发布:海康威视怎样连接网络 编辑:程序博客网 时间:2024/06/06 00:48

 

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替换原内核映像,

并用新内核启动系统。

 

下面说明用户态如何调用新添加的系统调用

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来调用添加的系统调用了。

原创粉丝点击