WSock32 Hook send and recv Functions

最近开始研究应用层的Hook,但是由于时间紧迫,所以也没什么深入的东西。这个程序是基于《Windows Via C/C++》的基础上改出来的。所以所有的技术都是作者的,原理呢,就是这个原理了,这里只是hook了send和recv函数,其他的函数hook方式是一样的。自己改一下就可以了。

由于Hook功能作者已经封装成了一个类,因而用起来十分方便,这里是源代码(全部代码猛击此处下载):

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
/******************************************************************************
Module:  Wsock32Hook.cpp
Notices: Hook wsock32 send and recv functions
******************************************************************************/
 
 
#include "..\..\CommonFiles\CmnHdr.h"
#include <windowsx .h>
#include <tchar .h>
#include <stdio .h>
#include "APIHook.h"
 
#define WSOCK32HOOKAPI extern "C" __declspec(dllexport)
#include "Wdll.h"
#include <strsafe .h>
 
 
///////////////////////////////////////////////////////////////////////////////
 
 
// Prototypes for the hooked functions
typedef int (WINAPI *PFNSEND)(SOCKET s, char *buf, int len, int flags);
 
typedef int (WINAPI *PFNRECV)(SOCKET s, char *buf, int len, int flags);
 
 
 
extern CAPIHook g_Send;
extern CAPIHook g_Recv;
 
 
///////////////////////////////////////////////////////////////////////////////
 
 
// This function sends the Send data to our main dialog box
void SendLastMsgInfo(BOOL bUnicode,char *buf) {
 
		// Get Send Datas
		wchar_t szProcessPathname[MAX_PATH];
		GetModuleFileNameW(NULL, szProcessPathname, MAX_PATH);
		wchar_t sz[2048];
		StringCchPrintfW(sz, _countof(sz), bUnicode 
			? L"Send data: %s\n"
			: L"Send data: %s\n",
			buf);
 
		// Send the string to the main dialog box
		COPYDATASTRUCT cds = { 0, ((DWORD)wcslen(sz) + 1) * sizeof(wchar_t), sz };
		FORWARD_WM_COPYDATA(FindWindow(NULL, TEXT("Wsock32hook by obaby")), 
			NULL, &cds, SendMessage);
}
 
// This function sends the Recv data to our main dialog box
void RecvLastMsgInfo(BOOL bUnicode,char *buf) {
 
	// Get the Recv Datas
	wchar_t szProcessPathname[MAX_PATH];
	GetModuleFileNameW(NULL, szProcessPathname, MAX_PATH);
	wchar_t sz[2048];
	StringCchPrintfW(sz, _countof(sz), bUnicode 
		? L"Recv data: %s\n"
		: L"Recv data: %s\n",
		buf);
 
	// Send the string to the main dialog box
	COPYDATASTRUCT cds = { 0, ((DWORD)wcslen(sz) + 1) * sizeof(wchar_t), sz };
	FORWARD_WM_COPYDATA(FindWindow(NULL, TEXT("Wsock32hook by obaby")), 
		NULL, &cds, SendMessage);
}
///////////////////////////////////////////////////////////////////////////////
 
 
// This is the send replacement function
int WINAPI Hook_Send(SOCKET s, char *buf, int len, int flags) 
{
 
		// Call the original send function
		int nResult = ((PFNSEND)(PROC) g_Send)
			(s, buf, len, flags);
 
		// Send the information to the main dialog box
		SendLastMsgInfo(FALSE, buf);
 
		// Return the result back to the caller
		return(nResult);
}
 
 
///////////////////////////////////////////////////////////////////////////////
 
 
// This is the recv replacement function
int WINAPI Hook_Recv(SOCKET s, char *buf, int len, int flags) {
 
		// Call the original recv function
		int nResult = ((PFNRECV)(PROC) g_Recv)
			(s, buf, len, flags);
 
		// Send the information to the main dialog box
		RecvLastMsgInfo(FALSE, buf);
 
		// Return the result back to the caller
		return(nResult);
}
 
 
///////////////////////////////////////////////////////////////////////////////
 
 
// Hook the send and recv functions
CAPIHook g_Send("wsock32.dll", "send", 
	(PROC) Hook_Send);
 
CAPIHook g_Recv("wsock32.dll", "recv", 
	(PROC) Hook_Recv);
 
HHOOK g_hhook = NULL;
 
 
///////////////////////////////////////////////////////////////////////////////
 
 
static LRESULT WINAPI GetMsgProc(int code, WPARAM wParam, LPARAM lParam) {
	return(CallNextHookEx(g_hhook, code, wParam, lParam));
}
 
 
///////////////////////////////////////////////////////////////////////////////
 
 
// Returns the HMODULE that contains the specified memory address
static HMODULE ModuleFromAddress(PVOID pv) {
 
	MEMORY_BASIC_INFORMATION mbi;
	return((VirtualQuery(pv, &mbi, sizeof(mbi)) != 0) 
		? (HMODULE) mbi.AllocationBase : NULL);
}
 
 
///////////////////////////////////////////////////////////////////////////////
 
 
BOOL WINAPI Wsock32_HookAllApps(BOOL bInstall, DWORD dwThreadId) {
 
	BOOL bOk;
 
	if (bInstall) {
 
		chASSERT(g_hhook == NULL); // Illegal to install twice in a row
 
		// Install the Windows' hook
		g_hhook = SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, 
			ModuleFromAddress(Wsock32_HookAllApps), dwThreadId);
 
		bOk = (g_hhook != NULL);
	} else {
 
		chASSERT(g_hhook != NULL); // Can't uninstall if not installed
		bOk = UnhookWindowsHookEx(g_hhook);
		g_hhook = NULL;
	}
 
	return(bOk);
}
 
 
//////////////////////////////// End of File //////////////////////////////////
</strsafe></stdio></tchar></windowsx>

原创文章,转载请注明: 转载自 obaby@mars

本文标题: 《WSock32 Hook send and recv Functions》

本文链接地址: http://h4ck.org.cn/2011/01/wsock32-hook-send-and-recv-functions/

You may also like

一条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注