Detours使用說明

2021-06-13 21:53:10 字數 3133 閱讀 5280

源自:

目錄(?)

[-]

介紹detours api hook

hook dll 中的函式

hook自定義c 函式

hook類成員函式

detourcreateprocesswithdll

detouring by address

api hook包括兩部分:api呼叫的擷取和api函式的重定向。通過api hook可以修改函式的引數和返回值。關於原理的詳細內容參見《windows核心程式設計》第19章和第22章。

在detours庫中,驅動detours執行的是函式 detourattach(…).

long detourattach(

pvoid * pppointer,

pvoid pdetour

);這個函式的職責是掛接目標api,函式的第乙個引數是乙個指向將要被掛接函式位址的函式指標,第二個引數是指向實際執行的函式的指標,一般來說是我們定義的替代函式的位址。但是,在掛接開始之前,還有以下幾件事需要完成:

這些可以呼叫以下函式很容的做到:

在這兩件事做完以後,detour函式才是真正地附著到目標函式上。在此之後,呼叫detourtransactioncommit()是detour函式起作用並檢查函式的返回值判斷是正確還是錯誤。

在這個例子中,將要hook winsock中的函式 send(…)和recv(…).在這些函式中,我將會在真正呼叫send或者recv函式前,把真正說要傳送或者接收的訊息寫到乙個日誌檔案中去。注意:我們自定義的替代函式一定要與被hook的函式具有相同的引數和返回值。例如,send函式的定義是這樣的:

int send(

__in  socket s,

__in  const char *buf,

__in  int len,

__in  int flags

);因此,指向這個函式的指標看起來應該是這樣的:

int (winapi *psend)(socket, const char*, int, int) = send;

把函式指標初始化成真正的函式位址是ok的;另外還有一種方式是把函式指標初始化為null,然後用函式detourfindfunction(…) 指向真正的函式位址.把send(…) 和 recv(…)初始化:

int (winapi *psend)(socket s, const char* buf, int len, int flags) = send;

int winapi mysend(socket s, const char* buf, int len, int flags);

int (winapi *precv)(socket s, char* buf, int len, int flags) = recv;

int winapi myrecv(socket s, char* buf, int len, int flags);

現在,需要hook的函式和重定向到的函式已經定義好了。這裡使用 winapi 是因為這些函式是用 __stdcall 返回值的匯出函式,現在開始hook:

int apientry dllmain(hmodule hdll, dword reason, lpvoid reserved)

int winapi myrecv(socket s, char* buf, int len, int flags)

舉例來說明,假如有乙個函式,其原型為

int runcmd(const char* cmd);

如果要hook這個函式,可以按照以下幾步來做:

a)     include 宣告這個函式的標頭檔案

b)     定義指向這個函式的函式指標,int (* realruncmd)(const char*) = runcmd;

c)     定義detour函式,例如: int detourruncmd(const char*);

d)     實現detour函式,如:

int detourruncmd(const char* cmd)

//extend the function,add what you want :)

return realruncme(cmd);

這樣就完成了hook runcmd函式的定義,所需要的就是呼叫detourattack

detourtransactionbegin();

detourupdatethread(getcurrentthread());

detourattach(&(pvoid&)realruncmd, detourruncmd);

if(detourtransactioncommit() == no_error)

#undef unicode
#include
#include
#include
typedef void (winapi *pfunc)(dword);
void winapi myfunc(dword);
pfunc functodetour = (pfunc)(0x0100347c); //set it at address to detour in
//the process
int apientry dllmain(hmodule hdll, dword reason, lpvoid reserved)
break;
case dll_process_detach:
detourtransactionbegin();
detourupdatethread(getcurrentthread());
detourdetach(&(pvoid&)functodetour, myfunc);
detourtransactioncommit();
break;
case dll_thread_attach:
case dll_thread_detach:
break;
}
return true;
}
void winapi myfunc(dword someparameter)

使用說明 附註工具使用說明

附註工具使用說明 附註工具用途 附註工具主要用於更新利用word附註應用程式生成的帶域 的附註,該工具在word右鍵 更新鏈結 的基礎上進行了優化,故在使用時,不能再利用word右鍵 更新鏈結 而要用本工具的 更新當前鏈結 或 更新所有鏈結 使用說明 一 更換路徑 當利用word附註應用程式生成帶域...

使用說明 農用遮光網使用說明

農用遮光網使用說明 建築防塵網購買方 建築施工企業 在購買建築防塵網時,應該對 作出比較,可以分辨品牌 型號,且購買時應該在一定程度上了解信譽良莠。建築防塵網購買方 市場售賣方 在選購建築防塵網時,可以把 作為基礎,好的 可以用來彌補信譽不足,而差的 則需要按照你的服務收費。農用遮光網使用說明 用途...

Hibernate tools 使用說明

05年的8月份第一次接觸hibernate tools,使用起來感覺還不錯,但也沒有深入研究,後來由於一直在做乙個專案,再後來用了一陣myeclipse,現在換了公司,使用wtp all in one eclipse的乙個版本 生成domain的時候使用了hibernate tools,發現都不知怎...