⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ippacklib.cpp

📁 《windows程序设计》王艳平版的书籍源代码
💻 CPP
字号:
///////////////////////////////////////////
// IPHookLib.cpp文件


#include <Winsock2.h>
#include "ShareMemory.h"
#include "ULHook.h"
#include "IPPackLib.h"

#pragma comment(lib, "WS2_32")

// 共享数据区
#pragma data_seg("YCIShared")
HWND g_hWndCaller = NULL;	
HHOOK g_hHook = NULL;
#pragma data_seg()


extern CULHook g_send;
extern CULHook g_sendto;
extern CULHook g_recv;
extern CULHook g_recvfrom;

int WINAPI hook_send(SOCKET s, const char FAR *buf, int len, int flags)
{
	// 申请指定长度的共享内存空间
	CShareMemory sm("IPPACK_SEND", sizeof(CMessageData) + len, TRUE);
	// 取得指向共享内存的指针
	CMessageData *pData = (CMessageData*)sm.GetBuffer();

	// 设置参数
	pData->dwThreadId = ::GetCurrentThreadId();
	pData->socket = s;
	pData->nDataLength = len;
	memcpy(pData->data(), buf, pData->nDataLength);

	// 通知主窗口,进行过滤
	::SendMessage(g_hWndCaller, HM_SEND, 0, 0);

	// 调用原来的函数,发送数据
	g_send.Unhook();
	int nRet = ::send(pData->socket, pData->data(), pData->nDataLength, flags);
	g_send.Rehook();

	return nRet;
}

int WINAPI hook_sendto(SOCKET s, const char* buf,
		int len, int flags, const struct sockaddr* to, int tolen)
{
	// 申请指定长度的共享内存空间
	CShareMemory sm("IPPACK_SEND", sizeof(CMessageData) + len, TRUE);
	// 取得指向共享内存的指针
	CMessageData *pData = (CMessageData*)sm.GetBuffer();

	// 设置参数
	pData->dwThreadId = ::GetCurrentThreadId();
	pData->socket = s;
	pData->nDataLength = len;
	memcpy(pData->data(), buf, len);

	// 通知主窗口,进行过滤
	::SendMessage(g_hWndCaller, HM_SEND, 0, 0);

	// 调用原来的函数,发送数据
	g_sendto.Unhook();
	int nRet = ::sendto(pData->socket, pData->data(), pData->nDataLength, flags, to, tolen);
	g_sendto.Rehook();
	return nRet;
}


int WINAPI hook_recv(SOCKET s, char FAR *buf, int len, int flags)
{
	CShareMemory sm("IPPACK_RECEIVE", sizeof(CMessageData) + len, TRUE);
	CMessageData *pData = (CMessageData*)sm.GetBuffer();

	// 调用原来的函数,接受数据,设置参数
	g_recv.Unhook();
	int nRet = ::recv(s, pData->data(), len, flags);
	g_recv.Rehook();

	pData->dwThreadId = ::GetCurrentThreadId();
	pData->socket = s;
	pData->nDataLength = nRet;

	// 通知主窗口,进行过滤
	::SendMessage(g_hWndCaller, HM_RECEIVE, 0, 0);

	// 返回数据
	memcpy(buf, pData->data(), pData->nDataLength);

	return nRet;
}


int WINAPI hook_recvfrom(SOCKET s, char* buf, int len, int flags, struct sockaddr* from, int* fromlen)
{
	CShareMemory sm("IPPACK_RECEIVE", sizeof(CMessageData) + len, TRUE);
	CMessageData *pData = (CMessageData*)sm.GetBuffer();

	// 调用原来的函数,接受数据,设置参数
	g_recvfrom.Unhook();
	int nRet = ::recvfrom(s, pData->data(), len, flags, from, fromlen);
	g_recvfrom.Rehook();

	pData->dwThreadId = ::GetCurrentThreadId();
	pData->socket = s;
	pData->nDataLength = nRet;

	// 通知主窗口,进行过滤
	::SendMessage(g_hWndCaller, HM_RECEIVE, 0, 0);

	// 返回数据
	memcpy(buf, pData->data(), pData->nDataLength);

	return nRet;
}

// HOOK相关API函数
CULHook g_send("Ws2_32.dll", "send", (PROC)hook_send);
CULHook g_sendto("Ws2_32.dll", "sendto", (PROC)hook_sendto);

CULHook g_recv("Ws2_32.dll", "recv", (PROC)hook_recv);
CULHook g_recvfrom("Ws2_32.dll", "recvfrom", (PROC)hook_recvfrom);



////////////////////////////////////////////

static HMODULE ModuleFromAddress(PVOID pv) 
{
	MEMORY_BASIC_INFORMATION mbi;
	if(::VirtualQuery(pv, &mbi, sizeof(mbi)) != 0)
	{
		return (HMODULE)mbi.AllocationBase;
	}
	else
	{
		return NULL;
	}
}

static LRESULT WINAPI GetMsgProc(int code, WPARAM wParam, LPARAM lParam) 
{
	return ::CallNextHookEx(g_hHook, code, wParam, lParam);
}

BOOL WINAPI SetHook(BOOL bInstall, DWORD dwThreadId, HWND hWndCaller)
{
	BOOL bOk;
	g_hWndCaller = hWndCaller;

	if(bInstall)
	{
		g_hHook = ::SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, 
						ModuleFromAddress(GetMsgProc), dwThreadId);
		bOk = (g_hHook != NULL);
	} 
	else 
	{
		bOk = ::UnhookWindowsHookEx(g_hHook);
		g_hHook = NULL;
	}
	return bOk;
}




///////////////////////////////////////////////////////////////////////
///


extern CULHook g_WSARecv;
extern CULHook g_WSARecvFrom;



int WINAPI hook_WSARecv(
  SOCKET s,                                               
  LPWSABUF lpBuffers,                                     
  DWORD dwBufferCount,                                    
  LPDWORD lpNumberOfBytesRecvd,                           
  LPDWORD lpFlags,                                        
  LPWSAOVERLAPPED lpOverlapped,                           
  LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine  
)
{
	CShareMemory sm("IPPACK_RECEIVE", sizeof(CMessageData) + lpBuffers->len, TRUE);
	CMessageData *pData = (CMessageData*)sm.GetBuffer();

	// 保存原来接受数据的缓冲区
	char *pOrg = lpBuffers->buf;
	lpBuffers->buf = pData->data();

	// 调用原来的函数,接受数据,设置参数
	g_WSARecv.Unhook();
	int nRet = ::WSARecv(s, lpBuffers, 
		dwBufferCount, lpNumberOfBytesRecvd, lpFlags, lpOverlapped, lpCompletionRoutine);
	g_WSARecv.Rehook();

	pData->dwThreadId = ::GetCurrentThreadId();
	pData->socket = s;
	pData->nDataLength = lpBuffers->len;

	// 通知主窗口,进行过滤
	::SendMessage(g_hWndCaller, HM_RECEIVE, 0, 0);

	// 返回数据
	lpBuffers->buf = pOrg;
	memcpy(pOrg, pData->data(), pData->nDataLength);

	return nRet;
}

int WINAPI hook_WSARecvFrom(
  SOCKET s,                                               
  LPWSABUF lpBuffers,                                     
  DWORD dwBufferCount,                                    
  LPDWORD lpNumberOfBytesRecvd,                           
  LPDWORD lpFlags,                                        
  struct sockaddr FAR *lpFrom,                            
  LPINT lpFromlen,                                        
  LPWSAOVERLAPPED lpOverlapped,                           
  LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine  
)
{
	CShareMemory sm("IPPACK_RECEIVE", sizeof(CMessageData) + lpBuffers->len, TRUE);
	CMessageData *pData = (CMessageData*)sm.GetBuffer();

	// 保存原来接受数据的缓冲区
	char *pOrg = lpBuffers->buf;
	lpBuffers->buf = pData->data();

	// 调用原来的函数,接受数据,设置参数
	g_WSARecvFrom.Unhook();
	int nRet = ::WSARecvFrom(s, lpBuffers, dwBufferCount, 
		lpNumberOfBytesRecvd, lpFlags, lpFrom, lpFromlen, lpOverlapped, lpCompletionRoutine);
	g_WSARecvFrom.Rehook();

	pData->dwThreadId = ::GetCurrentThreadId();
	pData->socket = s;
	pData->nDataLength = lpBuffers->len;

	// 通知主窗口,进行过滤
	::SendMessage(g_hWndCaller, HM_RECEIVE, 0, 0);

	// 返回数据
	lpBuffers->buf = pOrg;
	memcpy(pOrg, pData->data(), pData->nDataLength);

	return nRet;
}


CULHook g_WSARecv("Ws2_32.dll", "WSARecv", (PROC)hook_WSARecv);
CULHook g_WSARecvFrom("Ws2_32.dll", "WSARecvFrom", (PROC)hook_WSARecvFrom);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -