论ntoskrnl.exe中的导出函数、非导出函数、公开函数、非公开函数

来源:互联网 发布:英语小说阅读软件 编辑:程序博客网 时间:2024/06/05 08:10

ntoskrnl.exe中定义的函数

导出函数:在ntoskrnl.exe导出表(EAT)里面出现的函数。导出函数的主要目的是供外部调用。

如果想知道ntoskrnl.exe是否导出了某个Zw*或Nt*函数,可以借用depends工具,或LoadPE之类的工具进行查看。


非导出函数:ntoskrnl.exe定义的函数中,除去导出的函数,剩余的即是未导出函数。此类函数仅供自己内部调用。一般情况下,开发者(如,MS)并不想让外部知道自己内部的具体实现细节,常常会将此种函数封装成接口,再供外部使用。


公开(文档化)函数:如,ntoskrnl.exe导出的函数中能在MSDN上找到的。此类函数拥有具体的函数原型、详细的参数说明和注意事项。


非公开(未文档化)函数:如,ntoskrnl.exe导出的函数中在MSDN上无法找到的。此类函数往往没有函数原型和详细的使用说明。微软经常会把一些参数可能会随时变化的函数,或者功能有点强大的,或不和谐的函数隐藏起来。


因此,ntoskrnl.exe中定义的函数,可以大致分为两类:导出函数和非导出函数。导出的函数又可以分为两类:公开(文档化)函数和非公开(未文档化)函数。而非导出函数则只能是非公开函数。同理,公开的函数肯定是导出函数,而非公开的函数则可以是导出函数,也可以是非导出函数。

如,ZwQueryInformationProcess函数在ntoskrnl.exe的EAT中能够找到,说明它是一个导出函数,但在MSDN上无法找到,说明它是一个未公开的函数,因此,ZwQueryInformationProcess是一个未公开的导出函数。

如,ZwProtectVirtualMemory函数在WRK中能找到,说明它是在ntoskrnl.exe中定义的(因为WRK是ntoskrnl.exe的部分实现),而在ntoskrnl.exe的EAT中无法找到,则说明它是一个未导出函数,同时在MSDN上无法找到,还说明它是一个未公开的函数(未导出的肯定是未公开的),因此,ZwProtectVirtualMemory是一个未公开的未导出函数,即未导出函数。


注意:在本地MSDN上找不到的函数,不一定是未文档化的函数,可能是本地MSDN版本过低。判断是否是公开的函数,最好到在线MSDN上查找。


补充:

未公开的导出函数,是不能直接使用的。

未文档化的导出函数,其使用方法如下:

1、在驱动层,在使用之前给出函数声明,即重新声明一下,就可使用了。

2、在驱动层,利用其函数原型定义函数指针,使用MmGetSystemRoutineAddress+函数名去获取函数的地址

2、在应用层,利用其函数原型定义函数指针,使用LoadLibrary和GetProcessAddress获取函数的地址


应用层调用未公开的API实例:

http://blog.titilima.com/show-29-1.html


未导出函数的使用方法:

未导出函数的使用比较麻烦,一般要先获取那个函数所在模块的基地址,然后再通过特征码去得到函数地址。

具体实例,可参考以下连接:

实例一:

http://blog.csdn.net/evi10r/article/details/6952277

实例二:

http://www.cnblogs.com/gussing/archive/2009/08/18/1548869.html


参考文献:

http://blog.csdn.net/jjjyu123/article/details/13616277


0 0
原创粉丝点击