64位内核第一讲,和32位内核的区别
?
64位內(nèi)核第一講,和32位內(nèi)核的區(qū)別
雙擊調(diào)試配置請查看?連接:?https://www.cnblogs.com/aliflycoris/p/5877323.html
一丶編譯的區(qū)別.
首先,還是使用WDK7.1.7600編寫.?但是編譯的時候,要使用x64來編譯.?其代碼框架不變.
1.驅(qū)動加載
驅(qū)動加載的程序還是使用普通的驅(qū)動加載即可.但是64位(win7),微軟推出了兩種新的方式.
1.DSE
2.KPP
DSE:?這個機制是?驅(qū)動強制簽名,也就是說你編寫的驅(qū)動,都要進行簽名.才可以加載.
KPP:?內(nèi)核補丁保護,?比如我們說的SSDT表,(ring3 -> ring0?中專表)在XP下是可以HOOK的,現(xiàn)在,這些都被保護了,只要你更改了系統(tǒng)的核心源碼,直接藍屏.
2.去掉KPP保護.
在編寫的64為內(nèi)核驅(qū)動,?如果我們的系統(tǒng)是安全模式啟動,則沒有DSE保護.也就是說不用簽名.
現(xiàn)在有工具可以直接去使用.
第一個選項是,點擊之后,你的系統(tǒng)啟動則是在安全模式啟動.
第二個選項是,?點擊之后,你的驅(qū)動可以添加一個測試簽名.
?
3.注意的問題
如果進行了上面來了兩個步驟,我們的驅(qū)動還是不能加載,那么這也是一個坑.?微軟說了,在PE文件中,你的驅(qū)動必須有簽名檢查.
正確的姿勢:
首先,編寫驅(qū)動的source文件加上命令行選項.
LINKER_FLAGS = /INTEGRITYCHECK
且必須放在最下面,?加了這個選項,那么你的驅(qū)動,可以使用微軟提供的HOOK函數(shù)了.
?
二丶64位GDT表
?
?
?首先,地址變大了,變成了48位的地址,其高位是FFFF,屬于是符號擴展.
IDT?也是變大了.
其內(nèi)核中的結(jié)構(gòu)體也變大了.
不光這個結(jié)構(gòu)體,還有里面的,有興趣的自己解析一下查看.
三丶SSDT表的尋找,以及SSDT加密
我們知道?ring3 -> ring0?會通過SSDT表進行中專,
其EIP?會存放在?msr寄存器中.? xp下是174 175 176
現(xiàn)在查看AMD的CPU指令,會發(fā)現(xiàn).?進0環(huán)會調(diào)用SystemCall命令.
其MSR寄存器是在 C0000081? C0000082 C0000083
其EIP會存放在82里面.
那么我們可以?使用指令.
rdmsr C0000082讀取三環(huán)進0環(huán)的地址.?對其解析.
?
因符號文件沒有下載完全.所以還暫時沒有辦法解析.
SSDT加密算法是?模塊首地址 +?當(dāng)前表中的地址>>4? .我們要計算地址的時候.只需要將SSDT表中的內(nèi)容的函數(shù)地址<<4位加上模塊首地址即可.
?
轉(zhuǎn)載于:https://www.cnblogs.com/iBinary/p/8395870.html
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的64位内核第一讲,和32位内核的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python函数 一
- 下一篇: ajax请求锁屏功能