• 标 题:WIN95中代码不用VXD获得0级特权的方法(转载) (2千字)
  • 时 间:2001-10-28 10:55:03
  • 链 接:http://bbs.pediy.com

WIN95中代码不用VXD获得0级特权的方法
                                                袁哥
  作过WIN95的程序的程序员可能都知道WIN95提供了VXD驱动接口,以方便第三方软件
人员编写驱动程序,WIN95把他们(VXD)放在CPU的0级特权下执行,可以直接访问硬件,
还有执行一些特权指令。而我们往往就需要程序能直接访问硬件或者执行特权指令,但
又不方便再增加一个文件(VXD与程序文件是分开的),还有一个原因是VXD的编写不熟,
那就希望在自己的程序里能获得CPU0级的特权。WIN95是没给应用程序这特权的,应用程
序是在CPU3级下执行.怎么办呢?
    让我们想一想CPU硬件上到底是怎样区分代码是在几级执行的?原来是段描述符里,
那我们自然想到自己能不能修改段描述符呢?段描述符是放在GDT,LDT(应用程序的一
般是放在LDT里)。关键就得找到LDT,看怎样想办法能获得改写他的权利。那LDT在哪里
呢?我们再想一想,WIN95肯定得访问他吧。分配段什么的,就得在上面建立段描述符。
我们来找一找WIN95的API里有这样的函数吗?
    很高兴找到了AllocDstoCsAlias等。那我们来看一看这API怎么访问的。我们编一
小程序调用这API,再用TDW调试软件跟踪。真高兴,这API是在CPU3级执行,但这处理
过程完全在里面,原来WIN95的LDT本声有一个3级的数据段指向他,还可写的呢。3级,
那不我也可以读写了吗,我也可以自己建立段描述符了呀,还有调用门呀,可以给自己
开几个后门呀。
下面就是用16位的BORLAND C编写的获得这数据段的程序段:

        LPSTR LibFileName="krnl386.exe\0";
    LPSTR FunName="AllocCStoDSAlias\0";
    FARPROC FunAddress;
    HANDLE LibHandle;
    WORD segFun ;
    
    LibHandle=LoadLibrary(LibFileName);
    FunAddress=GetProcAddress(LibHandle,FunName);
    segFun=HIWORD(FunAddress);
    _DX=segFun;
    asm {
      push ds
          mov ds,dx       
      mov dx,word ptr [0x6]  //指向windows95的局部描述符的数据段,
                                    // window3.2 mov ds,word ptr [0x32]
                                    //你可以分析各个版本的不同,加上版本等。
      pop ds
        } 
现在的DX就是这数据段,你可以在这上面建立0级代码段还有调用门,你最好是先用API
分配一个段描述符,再在上面修改,用完后释放,要不你建立的系统再改写那就完了。
相信现在你可以自由发挥了。什么打狗棒呀,端口读写的拦截,磁盘解密呀都轻轻松松
了!还有你可以访问系统本生,象动态翻译软件的显示API的拦截你可以在系统内部做到,
避免在显示API的开始用JMP的弊病。还有你编程得小心了,要不系统会死翘翘的哟!
    WINNT的处理是通过中断门进入了0级,所以指向LDT的数据段是0级的,但大家也可
以去分析分析WINNT,想想别的办法(相应WIN95里的VXD,在WINNT里有SYS,一般在目录
%SYSTEM%\system32\drivers\里的.SYS文件就是)。