INLINE HOOK过驱动保护的理论知识和大概思路
生活随笔
收集整理的這篇文章主要介紹了
INLINE HOOK过驱动保护的理论知识和大概思路
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
| INLINE?HOOK過驅(qū)動保護的理論知識和大概思路,簡單驅(qū)動保護就是簡單的HOOK掉內(nèi)核API的現(xiàn)象 找到被HOOK的函數(shù)的當前地址在此地址處先修改頁面保護屬性然后寫入5個字節(jié)。5個字節(jié)就是一個簡單的JMP指令。這里說一下JMP指令,如下: 001 JMP 002 這樣我們就會跳到 001 (在此地址寫入JMP指令)+ 002(我們要寫入的JMP操作數(shù)) +5(jmp指令的字節(jié)數(shù))這里、 就是說如果你要跳回NtOpenProcess的原地址,就應該向被HOOK后的地址處寫入這樣的指令? ?JMP ( NtOpenProcess的原地址-被HOOK后的地址 - 5 )? 為什么要減5呢? 這么考慮,原地址為0,現(xiàn)在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通過內(nèi)核API函數(shù)Memory Descriptor List(MDL)-正規(guī)做法? ? 通過它來描述某一塊內(nèi)存可讀或可寫 現(xiàn)在說一下寫入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個字節(jié)的內(nèi)容 Cur_ADDR = GetSSDT_Cur_ADDR();//獲取當前的SSDT中函數(shù)的地址 Old_ADDR = GetSSDT_Old_ADDR(); //獲取函數(shù)原地址 if (Cur_ADDR??!=??Old_ADDR)? ?//說明被HOOK了 { //先保存要替換的5個字節(jié)的內(nèi)容 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过驱动保护的理论知识和大概思路的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++静态多态(模版模拟多态)的讨论
- 下一篇: VC6.0蕉HOOK_timeGetTi