用DETOURS庫獲取NT管理員權限
陳志敏
---- Detours是微軟開發的一個函數庫(源代碼可在http://research.microsoft.com/sn/detours 免費獲得), 用於修改運行中的程序在內存中的影像,從而即使沒有源代碼也能改變程序的行為。具體用途是:
攔截WIN32 API調用,將其引導到自己的子程序,從而實現WIN32 API的定制。
為一個已在運行的進程創建一新線程,裝入自己的代碼並運行。
---- 本文將簡介Detours的原理,Detours庫函數的用法, 並利用Detours庫函數在Windows NT上編寫了一個程序,該程序能使有“調試程序”的用戶權限的用戶成為系統管理員,附錄利用Detours庫函數修改該程序使普通用戶即可成為系統管理員(在NT4 SP3上)。
一. Detours的原理
---- 1. WIN32進程的內存管理
---- 總所周知,Windows NT實現了虛擬存儲器,每一WIN32進程擁有4GB的虛存空間, 關於WIN32進程的虛存結構及其操作的具體細節請參閱WIN32 API手冊, 以下僅指出與Detours相關的幾點:
---- (1) 進程要執行的指令也放在虛存空間中
---- (2) 可以使用QueryProtectEx函數把存放指令的頁面的權限更改為可讀可寫可執行,再改寫其內容,從而修改正在運行的程序
---- (3) 可以使用VirtualAllocEx從一個進程為另一正運行的進程分配虛存,再使用 QueryProtectEx函數把頁面的權限更改為可讀可寫可執行,並把要執行的指令以二進制機器碼的形式寫入,從而為一個正在運行的進程注入任意的代碼
---- 2. 攔截WIN32 API的原理
---- Detours定義了三個概念:
---- (1) Target函數:要攔截的函數,通常為Windows的API。
---- (2) Trampoline函數:Target函數的復制品。因為Detours將會改寫Target函數,所以先把Target函數復制保存好,一方面仍然保存Target函數的過程調用語義,另一方面便於以後的恢復。
---- (3) Detour 函數:用來替代Target函數的函數。
---- Detours在Target函數的開頭加入JMP Address_of_ Detour_ Function指令(共5個字節)把對Target函數的調用引導到自己的Detour函數, 把Target函數的開頭的5個字節加上JMP Address_of_ Target _ Function+5作為Trampoline函數。例子如下:
攔截前:Target _ Function:
;Target函數入口,以下為假想的常見的子程序入口代碼
push ebp
mov ebp, esp
push eax
push ebx
Trampoline:
;以下是Target函數的繼續部分
……
攔截後: Target _ Function:
jmp Detour_Function
Trampoline:
;以下是Target函數的繼續部分
……
Trampoline_Function:
; Trampoline函數入口, 開頭的5個字節與Target函數相同
push ebp
mov ebp,