Detour注意點及原理

2021-06-09 04:36:28 字數 3965 閱讀 7545

detourtransactionbegin();

detourupdatethread(getcurrentthread());

detourattach((pvoid *)&g_ppresent, new_present);

dword nerr = detourtransactioncommit();

detourtransactionbegin();

detourupdatethread(getcurrentthread());

detourdetach((pvoid *)&g_ppresent, new_present);

dword nerr = detourtransactioncommit();

if (!nerr)

else

{

注意的是解除安裝時,必須加上這個detourtransactioncommit,這函式退出時才是hook真正被還原,我剛開始沒加這個,接著後面直接freelibrary,結果杯具了!直接崩掉在hook函式部分

好東西,

用detours庫獲取nt管理員許可權 

陳志敏 

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

push  eax

push  ebx

;跳回去繼續執行target函式

jmp  target_function+5

這樣可能更清楚點:

detourattach((pvoid *)&ppresent, new_present);

dword nerr = detourtransactioncommit();

ppresent傳入前的值為5d0a10c3,傳入後的值為5ce50060(detourtransactioncommit後)

0:000> u 5d0a10c3 //hook前函式彙編

d3d9!cbasedevice::present:

5d0a10c3 8bff mov edi,edi

5d0a10c5 55 push ebp

5d0a10c6 8bec mov ebp,esp

5d0a10c8 56 push esi

5d0a10c9 57 push edi

5d0a10ca 8b7d08 mov edi,dword ptr [ebp+8]

5d0a10cd 85ff test edi,edi

5d0a10cf 7444 je d3d9!cbasedevice::present+0x13 (5d0a1115)

d3d9!cbasedevice::present://hook後函式彙編

5d0a10c3 e9dc002fa3 jmp fpstool1!ilt+415(?new_presentygjpauidirect3ddevice9pbutagrect (003911a4) //5個位元組

5d0a10c8 56 push esi

5d0a10c9 57 push edi

5d0a10ca 8b7d08 mov edi,dword ptr [ebp+8]

5d0a10cd 85ff test edi,edi

5d0a10cf 7444 je d3d9!cbasedevice::present+0x13 (5d0a1115)

5d0a10d1 8d7704 lea esi,[edi+4]

5d0a10d4 837e1800 cmp dword ptr [esi+18h],0

0:000> u 5ce50060//hook後ppresent的值,我們可以看到是儲存了hook前函式彙編的前五個位元組,再跳轉回前面函式

5ce50060 8bff mov edi,edi

5ce50062 55 push ebp

5ce50063 8bec mov ebp,esp

5ce50065 e95e102500 jmp d3d9!cbasedevice::present+0x5 (5d0a10c8)

所以注意的是ppresent在hook前和hook後都是指向原函式的位址,只不過函式位址值不再相同了,hook後是把原函式被截掉的位元組先儲存到新位址,再jmp到原函式未改變的部分

Detour注意點及原理

cpp view plain copy detourtransactionbegin detourupdatethread getcurrentthread detourattach pvoid g ppresent,new present dword nerr detourtransactionc...

MyBatis原理 注意點

佔位符號,好處防止sql注入 sql拼接符號 動態 sql 是 mybatis 的強大特性之一,也是它優於其他 orm 框架的乙個重要原因。mybatis 在對 sql 語句進行預編譯之前,會對 sql 進行動態解析,解析為乙個 boundsql 物件,也是在此處對動態 sql 進行處理的。在動態 ...

Detour安裝及簡單使用例項

detours是微軟開發的乙個函式庫,可用於捕獲系統api。在用其進行程式開發之前,得做一些準備工作 來看幾個關鍵函式 在detours庫中,驅動detours執行的是函式 cpp view plain copy long detourattach pvoid pppointer,pvoid pde...