又是乙個apihook
借用了海風月影的hookapi 0.5的一些思路;
hookproc的函式型別和原來的api一樣,只是引數比原api多2個
dword winapi hookproc(dword retaddr ,__pfn***x pfn***x, ...);
//引數比原始的api多2個引數
retaddr
//呼叫api的返回位址
pfn***
//型別為__pfn***x,待hook的api的宣告型別,用於呼叫未被hook的api
做成了乙個類,構造物件的時候自動hook,析構的時候unhook,注意一下例項的生存期就可以實現臨時hook和全域性hook。
使用例子,注意黃色部分:
1typedef
int(winapi
*__pfnmessageboxw)(hwnd hwnd, lpcwstr lptext, lpcwstr lpcaption, uint utype);23
intwinapi mymessageboxw(
dword retaddr, __pfnmessageboxw pfnloadlibrarya,
hwnd hwnd, lpcwstr lptext,
4lpcwstr lpcaption, uint utype)58
9void
test()
1015
messageboxw(
this
->
m_hwnd,l
"標題應該沒有被修改了",l
"標題",mb_ok);
16}
apihook.h 1
#pragma once
2typedef
int(winapi
*__pfnmessageboxw)( hwnd hwnd, lpcwstr lptext, lpcwstr lpcaption, uint utype);
3class
capihook4;
15 apihook.cpp 1
#include
"apihook.h"2
#include
"libdasm.h"3
#pragma comment( lib,
"libdasmd.lib")
45//00 ff3424 push dword ptr [esp]6//
03 ff3424 push dword ptr [esp]7//
06 50 push eax8//
07 e8 00000000 call 0c9//
0c 58 pop eax
10//
0d 83c0 0e add eax, 0e
11//
10 894424 0c mov dword ptr [esp+c], eax
12//
14 58 pop eax
13//
15 e9 00000000 jmp 1a <== modify
1415
const
byte stub_temp=16
;2324#define
jmp_my_offset (0x15)
25#define
org_head_offset (0x1a)
26#define
stub_length (0x30)
27capihook::capihook(lpctstr lplibname,lpctstr lpprocname,lpvoid lphookproc)
28:m_bhooked(
false)29
,m_stub(null)
30,m_replacecodesize(0)
3137
if(hmod
==null)
3841
lpvoid pfnapi;
42pfnapi
=getprocaddress(hmod,lpprocname);
43if
(pfnapi
==null)
4447
instruction inst;
48int
ireplacecodesize=0
,il;
49dword retsize=0
;50while
(ireplacecodesize
<5)
5157}58
if(ireplacecodesize
>16)
5962
m_stub
=(pbyte)virtualalloc(null,stub_length,mem_commit,page_execute_readwrite);
63if
(m_stub
==null)
6467
__try
6874
dword dwdelta;
75//
set my jump
76dwdelta
=(dword)lphookproc
-(dword)
&m_stub[jmp_my_offset+5
];77
*(dword*)
&m_stub[jmp_my_offset+1
]=dwdelta;
78//
set org jmp
79m_stub[org_head_offset
+ireplacecodesize]
=0xe9;80
dwdelta
=((dword)pfnapi
+ireplacecodesize)
-(dword)
&m_stub[org_head_offset
+ireplacecodesize+5
];81
*(dword*)
&m_stub[org_head_offset
+ireplacecodesize+1
]=dwdelta;
8283
//modify api entry
84byte buf[8];
85dwdelta
=(dword)
&m_stub[0]
-((dword)pfnapi+5
);86
*(dword*)
&buf[1]
=dwdelta;
87buf[0]
=0xe9;88
if(writeprocessmemory(getcurrentprocess(),pfnapi,buf,5,
&retsize)==0
)8992m_bhooked
=true;93
m_pfnapi
=pfnapi;
94m_replacecodesize
=ireplacecodesize;95}
96__finally
97103
}104
}105
106capihook::
~capihook(
void
)107
114}
115116
bool
capihook::hooked()
117
乙個API HOOK的例子
乙個api hook的例子 2010年07月20日 include include 執行緒操作api hinstance hinst 任務例項id hwnd mainfrmhwnd 主視窗控制代碼 hfont globalfont 字型 typedef struct remoteparam 視窗類名...
又是乙個51
記得去年的這個時候還和小崔,小魏他們在漓江邊燒烤呢,呵呵,晚上漓江邊真的很不錯,靜靜的,大家坐在一起聊天,說說未來的打算,談談自己的感受,回憶一下在學校裡的美好時光,桂林的夜景很漂亮,去留不住我的心。51的時候大夥合計著去了躺八角寨,時間真的過得很快,轉眼間感覺大學四年真的很快,而我感覺這一年過得更...
又是乙個51
記得去年的這個時候還和小崔,小魏他們在漓江邊燒烤呢,呵呵,晚上漓江邊真的很不錯,靜靜的,大家坐在一起聊天,說說未來的打算,談談自己的感受,回憶一下在學校裡的美好時光,桂林的夜景很漂亮,去留不住我的心。51的時候大夥合計著去了躺八角寨,時間真的過得很快,轉眼間感覺大學四年真的很快,而我感覺這一年過得更...