乙個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,...