日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

INLINE HOOK过驱动保护的理论知识和大概思路

發布時間:2024/4/11 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 INLINE HOOK过驱动保护的理论知识和大概思路 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
INLINE?HOOK過驅動保護的理論知識和大概思路,簡單驅動保護就是簡單的HOOK掉內核API的現象

找到被HOOK的函數的當前地址在此地址處先修改頁面保護屬性然后寫入5個字節。5個字節就是一個簡單的JMP指令。這里說一下JMP指令,如下:

001 JMP 002 這樣我們就會跳到

001 (在此地址寫入JMP指令)+ 002(我們要寫入的JMP操作數) +5(jmp指令的字節數)這里、

就是說如果你要跳回NtOpenProcess的原地址,就應該向被HOOK后的地址處寫入這樣的指令? ?JMP ( NtOpenProcess的原地址-被HOOK后的地址 - 5 )?

為什么要減5呢?

這么考慮,原地址為0,現在HOOK后為10,當你在HOOK的地址處寫處JMP 0后,IP到15到了,所以要減5? ?? ?? ?? ?? ?? ?? ?? ?? ??

不是很亂思路清晰一些就明白了:



這里有一個修改頁面保護屬性的過程。這里有以下幾種方法:



1??修改注冊表相應的鍵值這樣改

HKLM\SYSTEM\CurrentControlset\Control\SessionManger\MemoryManagement\

EnforceWriteProtection=0



HKLM\SYSTEM\CurrentControlset\Control\SessionManger\MemoryManagement\

DisablePagingExecutive=1

2 一個寄存器cr0,32位寄存器、

它的第17位(WP位)如果為1、表示開啟頁面保護0則是去掉頁面保護、

__asm? ? //去掉頁保護

? ?? ?? ?? ???{

? ?? ?? ?? ?? ?? ?? ?Cli??//表示將處理器標志寄存器的中斷標志位清0,不允許中斷

? ?? ?? ?? ?? ?? ?? ?mov eax,cr0

? ?? ?? ?? ?? ?? ?? ?and eax,not 10000h //and eax,0FFFEFFFFh

? ?? ?? ?? ?? ?? ?? ?mov cr0,eax



? ?? ?? ?? ???}



__asm? ? //恢復頁保護

? ?? ?? ?? ?? ?{

? ?? ?? ?? ?? ?? ?? ?mov eax,cr0

? ?? ?? ?? ?? ?? ?? ?or??eax,10000h //or eax,not 0FFFEFFFFh

? ?? ?? ?? ?? ?? ?? ?mov cr0,eax

? ?? ?? ?? ?? ?? ?? ?sti

? ?? ?? ?? ?? ?}

3通過內核API函數Memory Descriptor List(MDL)-正規做法? ? 通過它來描述某一塊內存可讀或可寫



現在說一下寫入JMP指令注意的知識點、、、

1??匯編寫入

2??指針寫入??將其定義成一個結構體如下

??typedef struct _JMPCODE

{

? ?BYTE??Jmp_Code;

? ?ULONG??Jmp_Addr;? ??

}JMPCODE,*PJMPCODE;

(這里就需要 修改對齊方式? ?#pragma pack(1)? ???......??恢復#pragma pack())

對齊標志改為1??本來是4,如果是4偏移就要加8,本來我們是加5的。

部分代碼如下

PJMPCODE Real_Jmp;//將要寫的jmp xxx指令

JMPCODE? ?Save_Jmp;//保護改成之前的5個字節的內容

Cur_ADDR = GetSSDT_Cur_ADDR();//獲取當前的SSDT中函數的地址

Old_ADDR = GetSSDT_Old_ADDR(); //獲取函數原地址



if (Cur_ADDR??!=??Old_ADDR)? ?//說明被HOOK了

{

//先保存要替換的5個字節的內容

Real_Jmp = (PJMPCODE) Cur_ADDR;??

Save_Jmp. Jmp_Code??=??Real_Jmp -> Jmp_Code;

Save_Jmp. Jmp_Addr??=??Real_Jmp -> Jmp_Addr;



__asm? ? //去掉頁保護

? ?? ?? ?? ???{

? ?? ?? ?? ?? ?? ?? ?Cli??//表示將處理器標志寄存器的中斷標志位清0,不允許中斷

? ?? ?? ?? ?? ?? ?? ?mov eax,cr0

? ?? ?? ?? ?? ?? ?? ?and eax,not 10000h //and eax,0FFFEFFFFh

? ?? ?? ?? ?? ?? ?? ?mov cr0,eax



? ?? ?? ?? ???}

Real_Jmp-> Jmp_Code =E9;//E9就是jmp的機器碼

Real_Jmp-> Jmp_Addr = Old_ADDR - Cur_ADDR -5;??//這兩條代碼就是INLINE??HOOK的核心代碼

__asm? ? //恢復頁保護

? ?? ?? ?? ?? ?{

? ?? ?? ?? ?? ?? ?? ?mov eax,cr0

? ?? ?? ?? ?? ?? ?? ?or??eax,10000h

? ?? ?? ?? ?? ?? ?? ?mov cr0,eax

? ?? ?? ?? ?? ?? ?? ?sti

? ?? ?? ?? ?? ?}

}

在Unload里恢復如下也需要更改頁面保護

然后反寫之前保護時的語句即可

Real_Jmp-> Jmp_Code = Save_Jmp. Jmp_Code;

Real_Jmp-> Jmp_Addr = Save_Jmp. Jmp_Addr; //恢復原地址處的指令

思路大致這樣,不是很難理解。

總結

以上是生活随笔為你收集整理的INLINE HOOK过驱动保护的理论知识和大概思路的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。