程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> 用DETOURS庫獲取NT管理員權限

用DETOURS庫獲取NT管理員權限

編輯:.NET實例教程

用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,

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