64位內核第一講,和32位內核的區別


 

          64位內核第一講,和32位內核的區別

雙擊調試配置請查看 連接: https://www.cnblogs.com/aliflycoris/p/5877323.html

一丶編譯的區別.

首先,還是使用WDK7.1.7600編寫. 但是編譯的時候,要使用x64來編譯. 其代碼框架不變.

1.驅動加載

  驅動加載的程序還是使用普通的驅動加載即可.但是64位(win7),微軟推出了兩種新的方式.

1.DSE

2.KPP

  DSE: 這個機制是 驅動強制簽名,也就是說你編寫的驅動,都要進行簽名.才可以加載.

  KPP: 內核補丁保護, 比如我們說的SSDT表,(ring3 -> ring0 中專表)在XP下是可以HOOK的,現在,這些都被保護了,只要你更改了系統的核心源碼,直接藍屏.

2.去掉KPP保護.

在編寫的64為內核驅動, 如果我們的系統是安全模式啟動,則沒有DSE保護.也就是說不用簽名.

現在有工具可以直接去使用.

第一個選項是,點擊之后,你的系統啟動則是在安全模式啟動.

第二個選項是, 點擊之后,你的驅動可以添加一個測試簽名.

 

3.注意的問題

如果進行了上面來了兩個步驟,我們的驅動還是不能加載,那么這也是一個坑. 微軟說了,在PE文件中,你的驅動必須有簽名檢查.

正確的姿勢:

  首先,編寫驅動的source文件加上命令行選項.

  LINKER_FLAGS = /INTEGRITYCHECK

且必須放在最下面, 加了這個選項,那么你的驅動,可以使用微軟提供的HOOK函數了.

 

二丶64位GDT表

 

 

 首先,地址變大了,變成了48位的地址,其高位是FFFF,屬於是符號擴展.

IDT 也是變大了.

其內核中的結構體也變大了.

不光這個結構體,還有里面的,有興趣的自己解析一下查看.

三丶SSDT表的尋找,以及SSDT加密

我們知道 ring3 -> ring0 會通過SSDT表進行中專,

其EIP 會存放在 msr寄存器中.  xp下是174 175 176

現在查看AMD的CPU指令,會發現. 進0環會調用SystemCall命令.

其MSR寄存器是在 C0000081  C0000082 C0000083

其EIP會存放在82里面.

那么我們可以 使用指令.

rdmsr C0000082

讀取三環進0環的地址. 對其解析.

 

因符號文件沒有下載完全.所以還暫時沒有辦法解析.

SSDT加密算法是 模塊首地址 + 當前表中的地址>>4  .我們要計算地址的時候.只需要將SSDT表中的內容的函數地址<<4位加上模塊首地址即可.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM