Detour注意點及原理

2021-07-11 17:54:11 字數 4178 閱讀 9980

[cpp]view plain

copy

detourtransactionbegin();  

detourupdatethread(getcurrentthread());  

detourattach((pvoid

*)&g_ppresent, new_present);  

dword

nerr = detourtransactioncommit();  

[cpp]view plain

copy

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

這樣可能更清楚點:

[cpp]view plain

copy

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注意點及原理

detourtransactionbegin detourupdatethread getcurrentthread detourattach pvoid g ppresent,new present dword nerr detourtransactioncommit detourtransact...

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...