1
#include
<
windows.h
>
2
#include
<
stdio.h
>
3
4
//
挂钩指定模块hMod对MessageBoxA的调用
5
BOOL SetHook(HMODULE hMod);
6
//
定义MessageBoxA函数原型
7
typedef
int
(WINAPI
*
PFNMESSAGEBOX)(HWND, LPCSTR, LPCSTR, UINT uType);
8
//
保存MessageBoxA函数的真实地址
9
PROC g_orgProc
=
(PROC)MessageBoxA;
10
11
12
BOOL EnableDebugPrivilege()
13
{
14
BOOL fOk
=
FALSE;
15
HANDLE hToken;
16
17
if
(OpenProcessToken(GetCurrentProcess(),
18
TOKEN_ADJUST_PRIVILEGES,
&
hToken))
19
{
20
TOKEN_PRIVILEGES tp;
21
tp.PrivilegeCount
=
1
;
22
LookupPrivilegeValue(NULL, SE_DEBUG_NAME,
&
tp.Privileges[
0
].Luid);
23
tp.Privileges[
0
].Attributes
=
SE_PRIVILEGE_ENABLED;
24
AdjustTokenPrivileges(hToken, FALSE,
&
tp,
sizeof
(tp), NULL, NULL);
25
fOk
=
(GetLastError()
==
ERROR_SUCCESS);
26
CloseHandle(hToken);
27
}
28
return
fOk;
//
提升成功返回TRUE,失败返回FALSE
29
}
30
31
void
main()
32
{
33
if
(EnableDebugPrivilege())
34
{
35
//
调用原API函数
36
::MessageBox(NULL,
"
原函数
"
,
"
Hook Api
"
,
0
);
37
//
挂钩后再调用
38
SetHook(::GetModuleHandle(NULL));
39
::MessageBox(NULL,
"
原函数
"
,
"
Hook Api
"
,
0
);
40
}
41
42
}
43
44
//
用于替换MessageBoxA的自定义函数
45
int
WINAPI MyMessageBoxA(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType)
46
{
47
return
((PFNMESSAGEBOX)g_orgProc)(hWnd,
"
Hook API Sucess!
"
,
"
OK
"
, uType);
48
return
0
;
49
}
50
51
BOOL SetHook(HMODULE hMod)
52
{
53
IMAGE_DOS_HEADER
*
pDosHeader
=
(IMAGE_DOS_HEADER
*
)hMod;
54
IMAGE_OPTIONAL_HEADER
*
pOptHeader
=
55
(IMAGE_OPTIONAL_HEADER
*
)((BYTE
*
)hMod
+
pDosHeader
->
e_lfanew
+
24
);
56
57
IMAGE_IMPORT_DESCRIPTOR
*
pImportDesc
=
(IMAGE_IMPORT_DESCRIPTOR
*
)
58
((BYTE
*
)hMod
+
pOptHeader
->
DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
59
60
//
在导入表中查找user32.dll模块。因为MessageBoxA函数从user32.dll模块导出
61
while
(pImportDesc
->
FirstThunk)
62
{
63
char
*
pszDllName
=
(
char
*
)((BYTE
*
)hMod
+
pImportDesc
->
Name);
64
if
(lstrcmpiA(pszDllName,
"
user32.dll
"
)
==
0
)
65
{
66
break
;
67
}
68
pImportDesc
++
;
69
}
70
71
if
(pImportDesc
->
FirstThunk)
72
{
73
74
//
一个IMAGE_THUNK_DATA就是一个双字,它指定了一个导入函数
75
//
调入地址表其实是IMAGE_THUNK_DATA结构的数组,也就是DWORD数组
76
IMAGE_THUNK_DATA
*
pThunk
=
(IMAGE_THUNK_DATA
*
)
77
((BYTE
*
)hMod
+
pImportDesc
->
FirstThunk);
78
while
(pThunk
->
u1.Function)
79
{
80
//
lpAddr指向的内存保存了函数的地址
81
DWORD
*
lpAddr
=
(DWORD
*
)
&
(pThunk
->
u1.Function);
82
if
(
*
lpAddr
==
(DWORD)g_orgProc)
83
{
84
DWORD oldProc;
85
BOOL VirSu
=
VirtualProtect(lpAddr,
sizeof
(DWORD),PAGE_READWRITE,
&
oldProc);
86
if
(VirSu
==
TRUE)
87
{
88
//
修改IAT表项,使其指向我们自定义的函数,相当于“*lpAddr = (DWORD)MyMessageBoxA;”
89
DWORD
*
lpNewProc
=
(DWORD
*
)MyMessageBoxA;
90
::WriteProcessMemory(::GetCurrentProcess(),
91
lpAddr,
&
lpNewProc,
sizeof
(DWORD), NULL);
92
}
93
else
94
{
95
MessageBox(NULL,
"
Error!
"
,
"
a
"
,
0
);
96
}
97
return
TRUE;
98
}
99
pThunk
++
;
100
}
101
}
102
return
FALSE;
103
}
有个郁闷的问题,在2003sp1下,不管是提升进程权限还是修改内存包含属性都成功!debug版本能成功!release就他娘的死不成功!郁闷死,遍寻高手无着落,暂时等着先。。。
|
|
随笔:64
文章:15
评论:65
引用:0
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
---|
28 | 29 | 30 | 31 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
|
留言簿(14)
随笔分类
随笔档案
收藏夹
最新随笔
最新评论
阅读排行榜
|
|