1. 程式人生 > >Windows驅動學習(八)-- 通過InlineHook實現變速齒輪

Windows驅動學習(八)-- 通過InlineHook實現變速齒輪

教程參考自:https://www.bilibili.com/video/av26193169/?p=9
程式碼地址:https://github.com/G4rb3n/Windows-Driver/tree/master/MT_InlineHook

1. 概述

之前的章節我們介紹了FSD Hook技術,這章我們來講解一下更底層一點的Inline Hook技術。

2. 原理介紹

Inline Hook直接修改記憶體中任意函式的程式碼,將其劫持至Hook API。它的目標是系統函式,如下,第一張圖是Hook之前的狀態,procexp.exe程序呼叫ZwQuerySystemInformation()函式時,ZwQuerySystemInformation()的程式碼是正常的程式碼。第二張圖是Hook後的狀態,注意紅框中的程式碼,ZwQuerySystemInformation()函式開頭5個位元組已被修改,變成了jmp 0x10001120,也就是我們惡意程式碼的地址,之後便可以開始我們的自定義操作。0x1000116A我們先進行unhook操作(脫鉤),目的是將ZwQuerySystemInformation()的程式碼恢復。大家可能有疑惑,為什麼剛修改完又要恢復回來,原因很簡單,Hook的目的是當呼叫某個函式時,我們能劫持程序的執行流。現在我們已經劫持了程序的執行流,便可以恢復ZwQuerySystemInformation()的程式碼,以便我們的惡意程式碼可以正常呼叫ZwQuerySystemInformation()。執行完惡意程式碼後,再次掛鉤,監控該函式。

1

2

3. 驅動編寫

3.1 驅動入口函式

程式碼的原理很簡單,首先獲取KeUpdateSystemTime和KeQueryPerformanceCounter的地址,然後將前5個位元組替換成“jmp [hook addr]”的位元組碼,值得注意的是,這裡的hook addr應該是hook函式和被hook函式的地址差值。
3

因為執行完hook函式後還要跳回執行原函式(KeUpdateSystemTime、KeQueryPerformanceCounter),所以在修改位元組碼前要先儲存原函式的位元組碼,到底要儲存幾個位元組碼呢?這就要看函式的開頭了,不過至少要大於5個,因為那樣我們的“jmp [hook addr]”位元組碼才放得下。

使用VS除錯驅動,檢視原函式的結構,來決定要儲存幾個位元組碼。但在這之前,我發現一個奇怪的現象,使用MmGetSystemRoutineAddress(“KeUpdateSystemTime”)獲取到的函式地址居然是KeUpdateSystemTimeAssist函式的地址,我也不知道這是什麼原因,只有微軟才知道。。那我們就將錯就錯,獲取KeUpdateSystemTimeAssist函式的結構唄。
4

該函式的開頭是連著的7個位元組,所以我們應該儲存它的7個位元組。
5

同理除錯KeQueryPerformanceCounter,檢視其函式結構。
6

這個函式我們應該替換前5位元組。
7

後面,將儲存的位元組碼寫入跳轉函式(updatetimeOriginCode、querycounterOriginCode)就行了。

3.2 fakeupdatetimeAddr函式

fakeupdatetimeAddr函式是KeUpdateSystemTime的hook函式,它先修改KeUpdateSystemTime的速度引數,然後呼叫原函式“KeUpdateSystemTime”。
8

3.3 updatetimeOriginCode函式

前面的nop是用來被替換為原函式的7個位元組的,執行完該7個位元組後跳轉回KeUpdateSystemTime函式執行剩下的位元組碼。
9

3.4 fakequerycounterAddr函式

fakequerycounterAddr函式是KeQueryPerformanceCounter的hook函式,跟fakeupdatetimeAddr不一樣,它是先呼叫原函式“KeQueryPerformanceCounter”,然後修改其返回值,實現變速。
10

3.5 querycounterOriginCode函式

前面的nop是用來被替換為原函式的5個位元組的,執行完該5個位元組後跳轉回KeQueryPerformanceCounter函式執行剩下的位元組碼。
11

3.6 WPOFF函式

cr0暫存器是用來儲存當前程序的記憶體屬性的,這裡的程式碼功能為從cr0獲取記憶體屬性值,修改,然後賦值回去。
12

3.7 WPON函式

WPON的程式碼功能則跟WPOFF相反。
13

3.8 解除安裝函式

14

4. 驅動測試

載入該驅動後,系統時鐘變快了。
15