转自
众所周知,ntdll作为UserMode通向KernelMode的入口,承担着最频繁的系统调用任务,可以说10年来,从2k到win7,从nt架构诞生以来,ntdll那些内核函数的中转代码基本上没有变化,一直如下图那样:
首先win8开始不调用KiFastSystemCall了,全部转到函数偏移下面直接有一段跟KiFastSystemCall代码一样sysenter代码,直接进入内核,所有系统服务都这样了。。。
猎奇吧。。。win8下给KiFastSystemCall下断,一个都毛命中。。。
当然KiFastSystemCall的入口还是存在,并没有从ntdll的导出表消失。
KiFastSystemCallRet之类的没啥变化
不过好在函数开头那句MOV EAX,***没改,当时我看到MOV EDI,EDI的时候差点吓死了,后来才发现这句是在函数尾,替代了原来的NOP。如果函数头变了,那很多程序会挂,毕竟有N多软件都对ntdll这里下有手脚。
这样改是为了达到最大效率,虽然增大了ntdll文件的体积,不过短跳比原来的取址再远跳效率高,占用CPU的执行周期也少些。
不过这样改还是影响到了一些软件,比如我的软件就被影响到了,首先这些中转服务代码长度变了,win8前的系统是0xF字节,win8上是0x12字节。再之就是有些sb的程序,比如Hook KiFastSystemCall之类的。。。
gdi32和user32的sysenter没看,应该也一样是改了。。
众所周知,ntdll作为UserMode通向KernelMode的入口,承担着最频繁的系统调用任务,可以说10年来,从2k到win7,从nt架构诞生以来,ntdll那些内核函数的中转代码基本上没有变化,一直如下图那样:
首先win8开始不调用KiFastSystemCall了,全部转到函数偏移下面直接有一段跟KiFastSystemCall代码一样sysenter代码,直接进入内核,所有系统服务都这样了。。。
猎奇吧。。。win8下给KiFastSystemCall下断,一个都毛命中。。。
当然KiFastSystemCall的入口还是存在,并没有从ntdll的导出表消失。
KiFastSystemCallRet之类的没啥变化
不过好在函数开头那句MOV EAX,***没改,当时我看到MOV EDI,EDI的时候差点吓死了,后来才发现这句是在函数尾,替代了原来的NOP。如果函数头变了,那很多程序会挂,毕竟有N多软件都对ntdll这里下有手脚。
这样改是为了达到最大效率,虽然增大了ntdll文件的体积,不过短跳比原来的取址再远跳效率高,占用CPU的执行周期也少些。
不过这样改还是影响到了一些软件,比如我的软件就被影响到了,首先这些中转服务代码长度变了,win8前的系统是0xF字节,win8上是0x12字节。再之就是有些sb的程序,比如Hook KiFastSystemCall之类的。。。
gdi32和user32的sysenter没看,应该也一样是改了。。