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位加上模塊首地址即可.
?
轉載于:https://www.cnblogs.com/iBinary/p/8395870.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的64位内核第一讲,和32位内核的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python函数 一
- 下一篇: ajax请求锁屏功能