在核心裡想要寫入「別人的」記憶體(一般指 ntos 等系統模組的記憶體空間),需要遵守乙個規則 : irql和記憶體保護。
一般來說,要寫入「別人的」核心記憶體,必須關閉記憶體寫保護,並把 irql提公升到 2 才行(絕大多數候時候 irql 都為 0 ,當irql=2時,會阻斷大部分執行緒執行,防止執行出錯)。
記憶體是否處於寫保護的狀態記錄在 cr0 暫存器上,因此直接修改cr0暫存器的值即可。而提公升或降低irql則使用keraiseirqltodpclevel和kelowerirql實現(win64的irql值記錄在cr8暫存器上,而win32的irql值記錄在kpcr上)。
// 需要 #include
// write protect off
kirql wpoffx64()
// write protect on
void
wponx64
(kirql irql)
x64驅動操作登錄檔
registry machine software testhandle create regedit dir unicode string registrypath initializeobjectattributes objectattributes,返回 object attributes 結...
x64內聯彙編
建立 asm,寫入測試彙編 code asmadd proc mov rax,rcx add rax,rdx retasmadd endp end整形引數順序 rcx,rdx,r8,r9,rsp 浮點引數順序 xmm1,xmm2,xmm3.混合引數順序 第乙個引數整形 rcx,第二個引數浮點 xmm...
X64呼叫規範
1.由於位址長度為64位,因此call指令把rsp 堆疊指標 暫存器的值減去8.2.第一批傳遞子程式的四個引數依次存放於暫存器rcx rdx r8 r9。因此,如果只傳遞乙個引數就會放到rcx暫存器中。如果還有第二引數就會將其放入rdx暫存器中,其他引數從右至左入棧。3.長度不足64位的引數不進行零...