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

📄 tcpipdog.cpp

📁 verilog spi file with testbench
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/*——————————————————————————————————————

	文件:		TcpIpDog.cpp

	说明:
	——————————————————————————
		Winsock 钩子,用来截获 Winsock 调用从而拦截
	TCP/IP封包,并做相应处理。这里将发送接收的封包
	作为调试信息输出
	——————————————————————————

	工程:		PacketCapture
	作者:		朱雁辉,朱雁冰
	创建日期:	2001/08/21
	网址:		http://www.xfilt.com
	电子邮件:	xstudio@xfilt.com
	版权所有 (c) 2001-2002 X 工作室

	警告:
	——————————————————————————
		本电脑程序受著作权法的保护。未经授权,不能使用
	和修改本软件全部或部分源代码。凡擅自复制、盗用或散
	布此程序或部分程序或者有其它任何越权行为,将遭到民
	事赔偿及刑事的处罚,并将依法以最高刑罚进行追诉。
	
		凡通过合法途径购买本软件源代码的用户被默认授权
	可以在自己的程序中使用本软件的部分代码,但作者不对
	代码产生的任何后果负责。
	
		使用了本软件代码的程序只能以可执行文件形式发布,
	未经特别许可,不能将含有本软件源代码的源程序以任何
	形式发布。
	——————————————————————————	
*/
//——————————————————————————————————————
// include header file and global variables

#include<stdio.h> 

#include "stdafx.h"
#include "overlapped.h"

//
// 进程间全局变量
//
#pragma data_seg(".inidata")
	int				m_iDllCount		= 0;
#pragma data_seg()

//
// 进程内全局变量
//
CRITICAL_SECTION	gCriticalSection;			// 代码段保护变量
WSPPROC_TABLE		NextProcTable   ;			// 保存30个服务提供者指针
TCHAR				m_sProcessName[MAX_PATH];	// 保存当前进程名称
COverlapped			m_Overlapped;				// 保存重叠操作相关信息的类

//
// 自定义注册表分支用来保存系统基础服务提供者的路径
//
#define REG_INSTALL_KEY		\
	_T("SYSTEM\\CurrentControlSet\\Services\\WinSock2\\Xstudio_Packet_Capture")

//——————————————————————————————————————
// 私有函数

void ShutdownSocket( SOCKET s )
{
	int iError;
	if( NextProcTable.lpWSPShutdown( s, SD_BOTH, &iError ) != 0 )
		WSASetLastError( iError );
}

void PrintSocket(SOCKET s, DWORD bytes, TCHAR *sExt)
{
	SOCKADDR_IN local_addr, remote_addr;
	int local_addr_len	= sizeof(local_addr);
	int remote_addr_len = sizeof(remote_addr);
	getsockname(s, (SOCKADDR*)&local_addr, &local_addr_len);

	getpeername(s, (SOCKADDR*)&remote_addr, &remote_addr_len);

	CString sTemp;
	sTemp.Format("    Socket %u %s\n", s, sExt);
	OutputDebugString(sTemp);
	sTemp.Format("    %u.%u.%u.%u:%u -> %u.%u.%u.%u:%u transfered %u bytes\n"
		, local_addr.sin_addr.S_un.S_un_b.s_b1
		, local_addr.sin_addr.S_un.S_un_b.s_b2
		, local_addr.sin_addr.S_un.S_un_b.s_b3
		, local_addr.sin_addr.S_un.S_un_b.s_b4
		, ntohs(local_addr.sin_port)
		, remote_addr.sin_addr.S_un.S_un_b.s_b1
		, remote_addr.sin_addr.S_un.S_un_b.s_b2
		, remote_addr.sin_addr.S_un.S_un_b.s_b3
		, remote_addr.sin_addr.S_un.S_un_b.s_b4
		, ntohs(remote_addr.sin_port)
		, bytes
		);
	OutputDebugString(sTemp);
}

void PrintReturnCode(int iReturnCode, LPINT lpErrno)
{
	CString sOutput , sTemp, sTemp1;
	switch(iReturnCode)
	{
	case SOCKET_ERROR:
		sTemp = "SOCKET_ERROR";
		break;
	case 0:
		sTemp = "SOCKET_SUCCESS";
		break;
	default:
		sTemp = "OTHER";
		break;
	}
	switch(*lpErrno)
	{
	case WSA_IO_PENDING:
		sTemp1 = "WSA_IO_PENDING";
		break;
	default:
		sTemp1 = "OTHER";
		break;
	}
	sOutput.Format("    ReturnCode: %s(%d); *lpErrno: %s(%d)\n"
		, sTemp, iReturnCode, sTemp1, *lpErrno);
	OutputDebugString(sOutput);
}

void PrintProtocolInfo(
	IN	WSAPROTOCOL_INFOW	*pProtocolInfo, 
	IN	TCHAR				*sPathName
)
{
	OutputDebugString("  ProtocolInfo:\n");
	CString sTemp, sOutput;
	sTemp.Format("    LibraryPath: %s\n", sPathName);
	OutputDebugString(sTemp);

	sTemp.Format("    dwServiceFlags1: 0x%08X; %d\n"
		, pProtocolInfo->dwServiceFlags1
		, pProtocolInfo->dwServiceFlags1
		);
	OutputDebugString(sTemp);

	sTemp.Format("    dwServiceFlags2: 0x%08X; %d\n"
		, pProtocolInfo->dwServiceFlags2
		, pProtocolInfo->dwServiceFlags2
		);
	OutputDebugString(sTemp);

	sTemp.Format("    dwServiceFlags3: 0x%08X; %d\n"
		, pProtocolInfo->dwServiceFlags3
		, pProtocolInfo->dwServiceFlags3
		);
	OutputDebugString(sTemp);

	sTemp.Format("    dwServiceFlags4: 0x%08X; %d\n"
		, pProtocolInfo->dwServiceFlags4
		, pProtocolInfo->dwServiceFlags4
		);
	OutputDebugString(sTemp);

	sTemp.Format("    dwProviderFlags: 0x%08X; %d\n"
		, pProtocolInfo->dwProviderFlags
		, pProtocolInfo->dwProviderFlags
		);
	OutputDebugString(sTemp);

	sTemp.Format("    ProviderId: %08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X\n"
		, pProtocolInfo->ProviderId.Data1
		, pProtocolInfo->ProviderId.Data2
		, pProtocolInfo->ProviderId.Data3
		, pProtocolInfo->ProviderId.Data4[0]
		, pProtocolInfo->ProviderId.Data4[1]
		, pProtocolInfo->ProviderId.Data4[2]
		, pProtocolInfo->ProviderId.Data4[3]
		, pProtocolInfo->ProviderId.Data4[4]
		, pProtocolInfo->ProviderId.Data4[5]
		, pProtocolInfo->ProviderId.Data4[6]
		, pProtocolInfo->ProviderId.Data4[7]
		);
	OutputDebugString(sTemp);

	sTemp.Format("    dwCatalogEntryId: 0x%08X; %d\n"
		, pProtocolInfo->dwCatalogEntryId
		, pProtocolInfo->dwCatalogEntryId
		);
	OutputDebugString(sTemp);

	sTemp.Format("    ProtocolChain.ChainLen: 0x%08X; %d\n"
		, pProtocolInfo->ProtocolChain.ChainLen
		, pProtocolInfo->ProtocolChain.ChainLen
		);
	OutputDebugString(sTemp);

	sTemp.Empty();
	OutputDebugString("    ProtocolChain.ChainEntries: ");
	for(int i = 0; i < MAX_PROTOCOL_CHAIN; i++)
	{
		CString s = "";
		if(i == MAX_PROTOCOL_CHAIN - 1)
			s.Format("0x%08X\n", pProtocolInfo->ProtocolChain.ChainEntries[i]);
		else
			s.Format("0x%08X->", pProtocolInfo->ProtocolChain.ChainEntries[i]);
		sTemp += s;
	}
	OutputDebugString(sTemp);

	sTemp.Format("    iVersion: 0x%08X; %d\n"
		, pProtocolInfo->iVersion
		, pProtocolInfo->iVersion
		);
	OutputDebugString(sTemp);

	sTemp.Format("    iAddressFamily: 0x%08X; %d\n"
		, pProtocolInfo->iAddressFamily
		, pProtocolInfo->iAddressFamily
		);
	OutputDebugString(sTemp);

	sTemp.Format("    iMaxSockAddr: 0x%08X; %d\n"
		, pProtocolInfo->iMaxSockAddr
		, pProtocolInfo->iMaxSockAddr
		);
	OutputDebugString(sTemp);

	sTemp.Format("    iMinSockAddr: 0x%08X; %d\n"
		, pProtocolInfo->iMinSockAddr
		, pProtocolInfo->iMinSockAddr
		);
	OutputDebugString(sTemp);

	sTemp.Format("    iSocketType: 0x%08X; %d\n"
		, pProtocolInfo->iSocketType
		, pProtocolInfo->iSocketType
		);
	OutputDebugString(sTemp);

	sTemp.Format("    iProtocol: 0x%08X; %d\n"
		, pProtocolInfo->iProtocol
		, pProtocolInfo->iProtocol
		);
	OutputDebugString(sTemp);

	sTemp.Format("    iProtocolMaxOffset: 0x%08X; %d\n"
		, pProtocolInfo->iProtocolMaxOffset
		, pProtocolInfo->iProtocolMaxOffset
		);
	OutputDebugString(sTemp);

	sTemp.Format("    iNetworkByteOrder: 0x%08X; %d\n"
		, pProtocolInfo->iNetworkByteOrder
		, pProtocolInfo->iNetworkByteOrder
		);
	OutputDebugString(sTemp);

	sTemp.Format("    iSecurityScheme: 0x%08X; %d\n"
		, pProtocolInfo->iSecurityScheme
		, pProtocolInfo->iSecurityScheme
		);
	OutputDebugString(sTemp);

	sTemp.Format("    dwMessageSize: 0x%08X; %d\n"
		, pProtocolInfo->dwMessageSize
		, pProtocolInfo->dwMessageSize
		);
	OutputDebugString(sTemp);

	sTemp.Format("    dwProviderReserved: 0x%08X; %d\n"
		, pProtocolInfo->dwProviderReserved
		, pProtocolInfo->dwProviderReserved
		);
	OutputDebugString(sTemp);

	sTemp = pProtocolInfo->szProtocol;
	OutputDebugString("    szProtocol: ");
	OutputDebugString(sTemp);
	OutputDebugString("\n");
}

void GetRightEntryIdItem(
	IN	WSAPROTOCOL_INFOW	*pProtocolInfo, 
	OUT	TCHAR				*sItem
)
{
	if(pProtocolInfo->ProtocolChain.ChainLen <= 1)
		_stprintf(sItem, _T("%u"), pProtocolInfo->dwCatalogEntryId);
	else
		_stprintf(sItem, _T("%u"), pProtocolInfo->ProtocolChain
			.ChainEntries[pProtocolInfo->ProtocolChain.ChainLen - 1]);
}

BOOL GetHookProvider(
	IN	WSAPROTOCOL_INFOW	*pProtocolInfo, 
	OUT	TCHAR				*sPathName
)
{
	TCHAR sItem[21];
	GetRightEntryIdItem(pProtocolInfo, sItem);

	HKEY	hSubkey;
	DWORD	ulDateLenth	= MAX_PATH;
	TCHAR	sTemp[MAX_PATH];

	if (RegOpenKeyEx(HKEY_LOCAL_MACHINE
		, REG_INSTALL_KEY, 0, KEY_ALL_ACCESS, &hSubkey) != ERROR_SUCCESS)
		return FALSE;
	if (RegQueryValueEx(hSubkey, sItem, 0, NULL, (BYTE*)sTemp, &ulDateLenth)
		|| ExpandEnvironmentStrings(sTemp, sPathName, ulDateLenth) == 0)
		return FALSE;
	if(sPathName[0] == '\0' && sTemp[0] != '\0')
		_tcscpy(sPathName, sTemp);
	RegCloseKey(hSubkey);

	return TRUE;
}

//——————————————————————————————————————
// Winsock 2 服务提供者钩子函数

void CALLBACK CompletionRoutine (
	IN    DWORD				dwError, 
	IN    DWORD				cbTransferred, 
	IN    LPWSAOVERLAPPED	lpOverlapped, 
	IN    DWORD				dwFlags 
)
{
	ODS(_T("CompletionRoutine ..."));

	int iIndex = m_Overlapped.FindOverlapped(lpOverlapped);
	if(iIndex < 0)
		return;

	CString sTemp;
	if(m_Overlapped.m_OverlappedRecorder[iIndex].FunctionType == 1)//WSPRecvFrom
	{
		PrintSocket(m_Overlapped.m_OverlappedRecorder[iIndex].s
			, cbTransferred, "WSPRecvFrom");
		OutputDebugString("    <==WSPRecvFrom WSA_IO_PENDING\n");
	}
	else if(m_Overlapped.m_OverlappedRecorder[iIndex].FunctionType == 0) //WSPRecv
	{
		PrintSocket(m_Overlapped.m_OverlappedRecorder[iIndex].s
			, cbTransferred, "WSPRecv");
		OutputDebugString("    <==WSPRecv WSA_IO_PENDING\n");
	}
	
	if(m_Overlapped.m_OverlappedRecorder[iIndex].lpCompletionRoutine != NULL)
	{
		m_Overlapped.m_OverlappedRecorder[iIndex].lpCompletionRoutine(dwError
			, cbTransferred, lpOverlapped, dwFlags);
	}

	m_Overlapped.DeleteOverlapped(iIndex);
}

SOCKET WSPAPI WSPSocket(
	int			af,                               
	int			type,                             
	int			protocol,                         
	LPWSAPROTOCOL_INFOW lpProtocolInfo,   
	GROUP		g,                              
	DWORD		dwFlags,                        
	LPINT		lpErrno
)
{
	ODS(_T("WSPSocket ..."));
	return NextProcTable.lpWSPSocket(af, type
		, protocol, lpProtocolInfo, g, dwFlags, lpErrno);
}

int WSPAPI WSPCloseSocket(
	SOCKET		s,
	LPINT		lpErrno
)
{
	ODS(_T("WSPCloseSocket ..."));
	return NextProcTable.lpWSPCloseSocket(s, lpErrno);
}

int WSPAPI WSPConnect(
	SOCKET			s,
	const struct	sockaddr FAR * name,
	int				namelen,
	LPWSABUF		lpCallerData,
	LPWSABUF		lpCalleeData,
	LPQOS			lpSQOS,
	LPQOS			lpGQOS,
	LPINT			lpErrno
)
{
	ODS(_T("WSPConnect ..."));
	return NextProcTable.lpWSPConnect(s, name, namelen, lpCallerData
		, lpCalleeData, lpSQOS, lpGQOS, lpErrno);
}

SOCKET WSPAPI WSPAccept(
	SOCKET			s,
	struct sockaddr FAR *addr,
	LPINT			addrlen,
	LPCONDITIONPROC	lpfnCondition,
	DWORD			dwCallbackData,
	LPINT			lpErrno
)
{
	ODS(_T("WSPAccept ..."));
	return NextProcTable.lpWSPAccept(s, addr, addrlen, lpfnCondition
		, dwCallbackData, lpErrno);
}

int WSPAPI WSPSend(
	SOCKET			s,
	LPWSABUF		lpBuffers,
	DWORD			dwBufferCount,
	LPDWORD			lpNumberOfBytesSent,
	DWORD			dwFlags,
	LPWSAOVERLAPPED	lpOverlapped,
	LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
	LPWSATHREADID	lpThreadId,
	LPINT			lpErrno
)
{
	ODS(_T("WSPSend ..."));

	PrintSocket(s, *lpNumberOfBytesSent, "WSPSend");

	return NextProcTable.lpWSPSend(s, lpBuffers, dwBufferCount
		, lpNumberOfBytesSent, dwFlags, lpOverlapped
		, lpCompletionRoutine, lpThreadId, lpErrno);

}

int WSPAPI WSPSendTo(
	SOCKET			s,
	LPWSABUF		lpBuffers,
	DWORD			dwBufferCount,
	LPDWORD			lpNumberOfBytesSent,
	DWORD			dwFlags,
	const struct sockaddr FAR * lpTo,
	int				iTolen,
	LPWSAOVERLAPPED	lpOverlapped,
	LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
	LPWSATHREADID	lpThreadId,
	LPINT			lpErrno
)
{
	ODS(_T("WSPSendTo ..."));

	PrintSocket(s, *lpNumberOfBytesSent, "WSPSendTo");

	return NextProcTable.lpWSPSendTo(s, lpBuffers, dwBufferCount
		, lpNumberOfBytesSent, dwFlags, lpTo, iTolen, lpOverlapped
		, lpCompletionRoutine, lpThreadId, lpErrno);

}

int WSPAPI WSPRecv(
	SOCKET			s,
	LPWSABUF		lpBuffers,
	DWORD			dwBufferCount,
	LPDWORD			lpNumberOfBytesRecvd,
	LPDWORD			lpFlags,
	LPWSAOVERLAPPED	lpOverlapped,
	LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
	LPWSATHREADID	lpThreadId,
	LPINT			lpErrno
)
{
	return SOCKET_ERROR;
	/*
	FILE * fp;
	int i;
	char cOutputDebugString_Buf [80];
	int n_len_to_cmp;

	ODS(_T("WSPRecv ..."));

	BOOL IsSetCompletionRoutine = FALSE;

	///////////////////////////////////////////////////////////////
	sockaddr_in local_name = {0};
	sockaddr_in remote_name = {0};
	u_short us_local_port, us_remote_port;

	int namelen = sizeof(sockaddr_in); 
	getsockname( s, (sockaddr*)&local_name, &namelen );
	getpeername( s, (sockaddr*)&remote_name, &namelen );

	us_local_port = ntohs( local_name.sin_port );
	us_remote_port = ntohs( remote_name.sin_port );

	char cTemp [20];
	sprintf( cTemp, "local_port : %u  <==>  remote_port : %u\n", us_local_port, us_remote_port );

	fp = fopen( "d:\\temp\\WSPRecv_Buf.txt", "a+" ); 
	if ( fp != NULL )
	{
		fwrite( cTemp, 1, strlen( cTemp ), fp );
		fclose(fp);
	}
	else
		OutputDebugString( _T("fp == NULL !\n") );
	///////////////////////////////////////////////////////////////


	/////////////////////////////////////////////////////////////////////
	fp = fopen( "d:\\temp\\WSPRecv_Buf.txt", "a+" ); 
	if ( fp != NULL )
	{
		fwrite( "**********************WSPRecv1***********************\n", 1, strlen("*************************WSPRecv1********************\n"), fp );
		if ( IsSetCompletionRoutine )
			fwrite( "WSPRecv --- IsSetCompletionRoutine !\n", 1, strlen("WSPRecv --- IsSetCompletionRoutine !\n"), fp );;
		fwrite( lpBuffers[0].buf, 1, (lpBuffers[0].len < 250) ? lpBuffers[0].len : 250, fp );
		fwrite( "\n", 1, 1, fp );

⌨️ 快捷键说明

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