乙個API HOOK的例子

2021-08-26 14:35:03 字數 3203 閱讀 1819

乙個api hook的例子

2023年07月20日

#include

#include /*執行緒操作api*/

hinstance hinst;/* 任務例項id */

hwnd mainfrmhwnd; /* 主視窗控制代碼 */

hfont globalfont; /* 字型 */

typedef struct remoteparam;

/* 視窗類名和標題的定義 */

#define mainfrm_class "myhookapi"

#define mainfrm_title "api hook demo"

atom myregisterclass(hinstance hinstance);

lresult callback wndproc(hwnd hwnd, uint message, wparam wparam, lparam lparam);

int apientry winmain(hinstance hinstance,

hinstance hprevinstance,

lpstr lpcmdline,

int ncmdshow)

/* 顯示視窗 */

showwindow(mainfrmhwnd, ncmdshow);

updatewindow(mainfrmhwnd);

while (getmessage(&msg, null, 0, 0))

}return msg.wparam;

}/* 註冊窗體類 */

atom myregisterclass(hinstance hinstance)

/* 通過任務名稱獲得任務id */

dword gettaskidbyname(char *targettaskname)

} while(process32next(hsnape, &procinfo) == true);

}closehandle(hsnape);

return 0;

}/* 建立傳遞給注入**的引數 */

void * createdatastruct(handle hproc, void *oldfunptr)

return premoteparam;

}/*提公升程序訪問許可權*/

bool enabledebugpriv()

if (!lookupprivilegevalue(null, se_debug_name, &sedebugnamevalue))

tkp.privilegecount = 1;

tkp.privileges[0].luid = sedebugnamevalue;

tkp.privileges[0].attributes = se_privilege_enabled;

if (!adjusttokenprivileges(htoken, false, &tkp, sizeof(tkp), null, null))

return true;

}/* 注入** */

handle winapi myopenprocess(dword dwdesiredaccess, bool binherithandle, dword dwprocessid)

return 0;

}/* 主函式,生成注入資訊 */

void protectself(char *targettaskname)

;unsigned char funcode[4096] = ;

/* 提公升訪問許可權 */

enabledebugpriv();

/* 獲得目標任務的pid */

tpid = gettaskidbyname(targettaskname);

if (tpid == 0)

/* 開啟目標任務 */

hproc = openprocess(process_all_access, false, tpid);

if (hproc == 0)

/** 獲得當前任務的要注入的api的位址,此位址是固定的,靜態對映的,所以當前任務的位址

* 等於目標任務的位址。

*/oldptr = getprocaddress(loadlibrary("kernel32"), "openprocess");

if (oldptr == null)

/** 申請兩塊位址,乙個是儲存注入**,也就是自己的myopenprocess,另一塊用於儲存被覆蓋的

* 系統的舊的openprocess的**(實際只有5位元組)

*/injectptr = virtualallocex(hproc, null, 4096, mem_commit | mem_reserve, page_execute_readwrite);

replaceptr = virtualallocex(hproc, null, 4096, mem_commit | mem_reserve, page_execute_readwrite);

if (injectptr == null || replaceptr == null)

/* 建立並儲存引數資訊 */

paramptr = createdatastruct(hproc, replaceptr);

if (paramptr == null)

memset(funcode, 0, 4096);

/* 讀出自身的這個函式到記憶體中 */

memcpy(funcode, &myopenprocess, 4096);

for (i = 0; i 記憶體空間並寫入**完成的,自己的

替換函式如果判斷此次呼叫的引數中,程序id不是要遮蔽的程序號,則呼叫

系統舊的api,因為舊的api的前5個位元組被替換成了long jmp,於是要把被

替換下來的內容儲存於乙個新的記憶體塊裡,並把這塊記憶體的最後再加上乙個

long jmp,跳轉到實際的api的第5位元組偏移處。

因為系統的呼叫都是採用stdcall方式,所以本程式需要編譯成stdcall的

方式,否則會導致呼叫棧混亂,同時因為注入**無法儲存任何本任務內的

全域性變數,所以需要專門開闢一段記憶體空間儲存這些引數資訊。注入**內

不可以包含任何庫、api函式呼叫,不能使用任何全域性變數。

為了執行正常的需要,建議把編譯引數裡的/gz去掉,否則此引數會產生

棧檢查,可能會導致一些錯誤的位址出現。

*/

又是乙個APIHOOK

又是乙個apihook 借用了海風月影的hookapi 0.5的一些思路 hookproc的函式型別和原來的api一樣,只是引數比原api多2個 dword winapi hookproc dword retaddr pfn x pfn x,引數比原始的api多2個引數 retaddr 呼叫api的...

乙個struts spring的例子

第乙個struts spring的例子 呵呵剛學spring 寫還望各位大蝦指教!配置struts就不用說了吧,如果用myeclipse直接add一下就可以了.接下來就來配置讓它支援spring 可 一,新建專案後,開啟struts confing.xml在後面加人下面 簡單吧!二然後就開始寫我們的...

乙個sql的例子

select dbo.userinfo.username,dbo.userinfo.usertruename,dbo.userinfo.useremail,dbo.userinfo.usermobile,dbo.userinfo.usertelephone,dbo.userinfo.usercar,...