程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 通過修改CR0寄存器繞過SSDT驅動保護

通過修改CR0寄存器繞過SSDT驅動保護

編輯:C++入門知識

  為了安全起見,Windows XP及其以後的系統將一些重要的內存頁設置為只讀屬性,這樣就算有權力訪問該表也不能隨意對其修改,例如SSDT、IDT等。但這種方法很容易被繞過,我們只要將這些部分修改為可寫屬性就可以了,不過當我們的事情做完後記得把它們恢復為只讀屬性,不然會造成一些很難預料到的後果。

  cr0是系統內的控制寄存器之一。控制寄存器是一些特殊的寄存器,它們可以控制CPU的一些重要特性。

  控制寄存器最初出現於低級的286處理器中,以前稱之為機器狀態字(machine status word),在386以後它們被重命名為控制寄存器(control register)。

  cr0寄存器直到486的處理器版本才被加入了“寫保護”(Write Protect,WP)位,WP位控制是否允許處理器向標記為只讀屬性的內存頁寫入數據。

  WP位0:禁用寫保護的功能

  WP位1:開啟寫保護的功能

cr0的第16位是WP位,只要將這一位置0就可以禁用寫保護,置1則可將其恢復。

禁用寫保護的操作步驟:

啟用寫保護的操作步驟:

__asm
{
    cli ;//將處理器標志寄存器的中斷標志位清0,不允許中斷
    mov eax, cr0
    and  eax, ~0x10000
    mov cr0, eax
}

__asm
{
    mov  eax, cr0
    or     eax, 0x10000
    mov  cr0, eax
    sti ;//將處理器標志寄存器的中斷標志置1,允許中斷
}

PJMPCODE pCurAddr;
JMPCODE oleCode;
 INITCODE
 
    DbgPrint(== (curAddr!=
        pCurAddr=(PJMPCODE)curAddr;
        oleCode.jmpStyle=pCurAddr->jmpStyle;
        oleCode.jmpAddr=pCurAddr->jmpAddr;
= ;
        jmpCode.jmpAddr = oldAddr-curAddr-

~->jmpStyle=;
        pCurAddr->jmpAddr=jmpCode.jmpAddr;


    pDriverObject->DriverUnload =


~->jmpStyle=oleCode.jmpStyle;
    pCurAddr->jmpAddr=oleCode.jmpAddr;


    DbgPrint(

原創文章,轉載請注明出處:http://www.cnblogs.com/hongfei/

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved