WIN95中程式碼不用VXD獲得0級特權的方法(轉載) (2千字)

看雪資料發表於2001-10-28

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檔案就是)。

相關文章