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