作者:陆麟
转载请征得作者同意.
1999.7.19
1999.8.23 PATCH
NT下隐藏了一套API,那是WIN32用来和真正的OS进行沟通的界面.由此,网络上有很多讨论NATIVE
API的文章,但是由于NATIVE API的文档实在太少,在DDK里也仅介绍了几十个,相比OS本身提供的数百个API真乃天瓤之别.本人水平有限,也只能写到一点算一点.
首先需要介绍的是NATIVE API是怎么回事.
一个WIN32 API调用,通过调用,在很多情况下被转化为一系列的NATIVE API调用.例如,一个打开注册表项的操作,最终转化到ZwOpenKey调用.这个ZwOpenKey就是NATIVE
API的一个.它被公开在DDK里.
NATIVE API全部是有NTDLL.DLL提供的.由于NTDLL.DLL是个USER MODE的DLL.所以,我们可以在W32应用程序
里进行操纵.目前使用NATIVE API有3个方法:
1.写DRIVER.
2.写NATIVE APPLICATION.
3.直接调用未公开的NATIVE API.
本文不想教如何写上述的东西,但是NATIVE API如何运作到是需要写几句.
大多数NATIVE API最终的运作如下:
PUSH INDEX_FOR_FUNC
LEA EDX,[CALLER_STACK]
INT 2EH
RET PARAMETER_COUNT
NT下,INT 2E为系统调用的保留中断.多数的NATIVE API的真正服务程序在INT
2E后被调用. 系统里有个未公开的,被输出的变量:KeServiceDescriptorTable. 这变量是个地址,指向所有的系统服务的例程地址.
例如:
ZwOpenKey的服务例程地址如下可获得(在PNT4SP4下证实的):
MOV ECX,_KeServiceDescriptorTable
MOV EAX,[ECX]
MOV EDX,51H
SHL EDX,2
ADD EDX
现在[EAX]里存在的就是ZwOpenKey的服务地址.51H是ZwOpenKey的INDEX.
当然,不是所有的NATIVE API都这样可以查到服务例程地址.有某些NATIVE API仅仅返回当前进程里的关键数据,有些NATIVE
API则用LPC调用,返回WIN32子系统的数据.
好了.现在暂停写下去,手酸了.