📄 sockspacket.cpp
字号:
switch( pPacket->socks5Req.bAtyp )
{
case ATYP_IPV4ADDR:
nLen += 4;
break;
case ATYP_IPV6ADDR:
nLen += 16;
break;
case ATYP_HOSTNAME:
nLen += ((BYTE)pPacket->socks5Req.pszDestAddr[0]);
nLen += 1;
break;
}
break;
}
return nLen;
}
/////////////////////////////////////////////////////////////////////////////////////
//
// 功能: 将数据包打包成字符串
// 参数:
// pszDest -- 字符串指针,用于保存打包数据(必须预先分配足够的内存空间)
// pPacket -- 数据包指针(待打包的数据包)
// nPacketType -- 包类型
// 返回:
// 0 --- 成功 (SOCKET_SUCCESS)
//
/////////////////////////////////////////////////////////////////////////////////////
int SOP_Pack(char *pszDest,PSOCKSREQPACKET pPacket,UINT nPacketType)
{
int n,nIndex=0;
WORD wData;
DWORD dwData;
switch( nPacketType )
{
case PACKET_SOCKS4REQ:
pszDest[nIndex++] = (char)pPacket->socks4Req.bVer;
pszDest[nIndex++] = (char)pPacket->socks4Req.bCmd;
// 端口
wData = htons(pPacket->socks4Req.wDestPort);
pszDest[nIndex++] = (char)( wData & 0x00ff );
pszDest[nIndex++] = (char)( (wData>>8) & 0x00ff);
// IP地址
dwData = htonl(pPacket->socks4Req.dwDestIP);
pszDest[nIndex++] = (char)( (dwData>>24) &0x000000ff);
pszDest[nIndex++] = (char)( (dwData>>16) &0x000000ff);
pszDest[nIndex++] = (char)( (dwData>>8 ) &0x000000ff);
pszDest[nIndex++] = (char)( dwData &0x000000ff);
// UserID
for( n = 0;n < (int)strlen(pPacket->socks4Req.pszUserID) ; n++ )
pszDest[nIndex++] = (pPacket->socks4Req.pszUserID)[n];
// NULL BYTE
pszDest[nIndex++] = (char)pPacket->socks4Req.bNULL;
pszDest[nIndex] = '\0';
break;
case PACKET_SOCKS4AREQ:
pszDest[nIndex++] = (char)pPacket->socks4aReq.bVer;
pszDest[nIndex++] = (char)pPacket->socks4aReq.bCmd;
wData = htons(pPacket->socks4aReq.wDestPort);
pszDest[nIndex++] = (char)( wData & 0x00ff );
pszDest[nIndex++] = (char)( (wData>>8) & 0x00ff);
dwData = htonl(pPacket->socks4aReq.dwDestIP);
pszDest[nIndex++] = (char)( (dwData>>24) &0x000000ff);
pszDest[nIndex++] = (char)( (dwData>>16) &0x000000ff);
pszDest[nIndex++] = (char)( (dwData>>8 ) &0x000000ff);
pszDest[nIndex++] = (char)( dwData &0x000000ff);
// UserID
for( n = 0;n < (int)strlen(pPacket->socks4aReq.pszUserID) ; n++ )
pszDest[nIndex++] = (pPacket->socks4aReq.pszUserID)[n];
// NULL1 BYTE
pszDest[nIndex++] = (char)pPacket->socks4aReq.bNULL1;
// DestHostName
for( n = 0;n < (int)strlen(pPacket->socks4aReq.pszDestHostName); n++ )
pszDest[nIndex++] = (pPacket->socks4aReq.pszDestHostName)[n];
// NULL2 BYTE
pszDest[nIndex++] = (char)pPacket->socks4aReq.bNULL2;
pszDest[nIndex] = '\0';
break;
case PACKET_SOCKS5AUTHREQ:
pszDest[nIndex++] = (char)pPacket->socks5AuthReq.bVer;
pszDest[nIndex++] = (char)pPacket->socks5AuthReq.bNAuth;
for( n = 0; n < pPacket->socks5AuthReq.bNAuth;n++ )
pszDest[nIndex++] = (pPacket->socks5AuthReq.pszAuth)[n];
pszDest[nIndex] = '\0';
break;
case PACKET_SOCKS5AUTHPASSWDREQ:
pszDest[nIndex++] = (char)pPacket->socks5AuthPasswdReq.bVer;
pszDest[nIndex++] = (char)pPacket->socks5AuthPasswdReq.bUserNameLen;
for( n = 0 ; n < (int)strlen( pPacket->socks5AuthPasswdReq.pszUserName ); n++ )
pszDest[nIndex++] = (pPacket->socks5AuthPasswdReq.pszUserName)[n];
pszDest[nIndex++] = (char)pPacket->socks5AuthPasswdReq.bPasswdLen;
for( n = 0; n < (int)strlen(pPacket->socks5AuthPasswdReq.pszPasswd); n++ )
pszDest[nIndex++] = (pPacket->socks5AuthPasswdReq.pszPasswd)[n];
pszDest[nIndex] = '\0';
break;
case PACKET_SOCKS5REQ:
pszDest[nIndex++] = (char)pPacket->socks5Req.bVer;
pszDest[nIndex++] = (char)pPacket->socks5Req.bCmd;
pszDest[nIndex++] = (char)pPacket->socks5Req.bRsv;
pszDest[nIndex++] = (char)pPacket->socks5Req.bAtyp;
int nAddrLen;
switch(pPacket->socks5Req.bAtyp)
{
case ATYP_IPV4ADDR:
nAddrLen = 4;
break;
case ATYP_IPV6ADDR:
nAddrLen = 16;
break;
case ATYP_HOSTNAME:
nAddrLen = 1;
nAddrLen += (BYTE) (pPacket->socks5Req.pszDestAddr[0]);
break;
default:
nAddrLen = (int)strlen(pPacket->socks5Req.pszDestAddr);
break;
}
for( n = 0; n <nAddrLen; n++ )
pszDest[nIndex++] = (pPacket->socks5Req.pszDestAddr)[n];
wData = htons(pPacket->socks5Req.wDestPort);
pszDest[nIndex++] = (char)( wData & 0x00ff );
pszDest[nIndex++] = (char)( (wData>>8) & 0x00ff);
pszDest[nIndex] = '\0';
break;
}
//打包成功
return (SOCKET_SUCCESS);
}
////////////////////////////////////////////////////////////////////
//
// 功能: 发送包
// 参数:
// hSocket -- SOCKET(通讯套接字)
// pPacket -- 数据包指针(发送数据包)
// nPacketType -- 数据包类型
// dwTimeout -- 发送超时(缺省为SOP_SEND_TIMEOUT)
// 返回:
// 0 --- 成功 (SOCKET_SUCCESS)
// -1 --- 失败 (SOCKET_ERROR)
//
////////////////////////////////////////////////////////////////////
int SOP_SendPacket(SOCKET hSocket,PSOCKSREQPACKET pPacket,UINT nPacketType,DWORD dwTimeout/* = SOP_SEND_TIMEOUT*/)
{
if( hSocket == INVALID_SOCKET )
return (SOCKET_ERROR);
// 计算包大小
int nSize = SOP_PacketSize(pPacket,nPacketType);
char* pSendBuf = (char *)malloc(nSize+1);
if(pSendBuf == NULL)
return (SOCKET_ERROR);
int nSend;
int nRet = SOCKET_ERROR;
// 打包并发送
if(SOP_Pack(pSendBuf,pPacket,nPacketType) == SOCKET_SUCCESS )
{
nSend = TE_Send(hSocket,pSendBuf,nSize,dwTimeout);
nRet = (nSend == nSize)? SOCKET_SUCCESS:SOCKET_ERROR;
}
free(pSendBuf);
return (nRet);
}
// 发送Socks4 Request
int SOP_SendSocks4Req(SOCKET hSocket,BYTE bCmd,WORD wDestPort,DWORD dwDestIP,const char * pszUserID /* = NULL */,DWORD dwTimeout /* = SOP_SEND_TIMEOUT */)
{
SOCKSREQPACKET pack;
pack.socks4Req.bVer = VER_SOCKS4;
pack.socks4Req.bCmd = bCmd;
pack.socks4Req.wDestPort = wDestPort;
pack.socks4Req.dwDestIP = dwDestIP;
pack.socks4Req.pszUserID = pszUserID;
pack.socks4Req.bNULL = BYTE_NULL;
return SOP_SendPacket(hSocket,&pack,PACKET_SOCKS4REQ,dwTimeout);
}
// 发送Socks4a Request
int SOP_SendSocks4aReq(SOCKET hSocket,BYTE bCmd,WORD wDestPort,const char* pszDestHostName,const char * pszUserID /* = NULL */,DWORD dwTimeout /* = SOP_SEND_TIMEOUT */)
{
SOCKSREQPACKET pack;
pack.socks4aReq.bVer = VER_SOCKS4A;
pack.socks4aReq.bCmd = bCmd;
pack.socks4aReq.wDestPort = wDestPort;
pack.socks4aReq.dwDestIP = UNKNOWN_IP;
pack.socks4aReq.pszUserID = pszUserID;
pack.socks4aReq.bNULL1 = BYTE_NULL;
pack.socks4aReq.pszDestHostName = pszDestHostName;
pack.socks4aReq.bNULL2 = BYTE_NULL;
return SOP_SendPacket(hSocket,&pack,PACKET_SOCKS4AREQ,dwTimeout);
}
// 发送SOCKS5 Auth-Request
int SOP_SendSocks5AuthReq(SOCKET hSocket,BYTE bNAuth,const char* pszAuth,DWORD dwTimeout /* = SOP_SEND_TIMEOUT */)
{
SOCKSREQPACKET pack;
pack.socks5AuthReq.bVer = VER_SOCKS5;
pack.socks5AuthReq.bNAuth = bNAuth;
pack.socks5AuthReq.pszAuth = pszAuth;
return SOP_SendPacket(hSocket,&pack,PACKET_SOCKS5AUTHREQ,dwTimeout);
}
// 发送SOCKS5 USERNAME/PASSWORD Auth-Request
int SOP_SendSocks5AuthPasswdReq(SOCKET hSocket,const char* pszUserName,const char * pszPassword,DWORD dwTimeout /* = SOP_SEND_TIMEOUT */)
{
SOCKSREQPACKET pack;
pack.socks5AuthPasswdReq.bVer = 0x01;
pack.socks5AuthPasswdReq.bUserNameLen = (BYTE)( (pszUserName == NULL)?0:strlen(pszUserName) );
pack.socks5AuthPasswdReq.pszUserName = pszUserName;
pack.socks5AuthPasswdReq.bPasswdLen = (BYTE)( (pszPassword == NULL)?0:strlen(pszPassword) );
pack.socks5AuthPasswdReq.pszPasswd = pszPassword;
return SOP_SendPacket(hSocket,&pack,PACKET_SOCKS5AUTHPASSWDREQ,dwTimeout);
}
// 发送SOCKS5 REQUEST
//
// 注意: 若bAtyp = ATYP_IPV4ADDR pszDestAddr = IPV4_Address (4 Octects)
// bAtyp = ATYP_IPV6ADDR pszDestAddr = IPV6_Address (16 Octects)
// bAtyp = ATYP_HOSTNAME pszDestAddr = [1BYTE:(HostName)Length]+[HostName]
//
int SOP_SendSocks5Req(SOCKET hSocket,BYTE bCmd,BYTE bAtyp,const char * pszDestAddr,WORD wDestPort,DWORD dwTimeout /* = SOP_SEND_TIMEOUT */)
{
SOCKSREQPACKET pack;
pack.socks5Req.bVer = VER_SOCKS5;
pack.socks5Req.bCmd = bCmd;
pack.socks5Req.bRsv = BYTE_NULL;
pack.socks5Req.bAtyp = bAtyp;
pack.socks5Req.pszDestAddr = pszDestAddr;
pack.socks5Req.wDestPort = wDestPort;
return SOP_SendPacket(hSocket,&pack,PACKET_SOCKS5REQ,dwTimeout);
}
// 检查SOCKS的返回值是否正确
BOOL SOP_IsSocksOK( PSOCKSREPPACKET pPacket,UINT nPacketType )
{
switch ( nPacketType )
{
case PACKET_SOCKS4REP:
return ( pPacket->socks4Rep.bRep == REP4_SUCCESS );
break;
case PACKET_SOCKS4AREP:
return ( pPacket->socks4aRep.bRep == REP4_SUCCESS );
break;
case PACKET_SOCKS5AUTHREP:
return ( pPacket->socks5AuthRep.bAuth == AUTH_NONE ||
pPacket->socks5AuthRep.bAuth == AUTH_GSSAPI ||
pPacket->socks5AuthRep.bAuth == AUTH_PASSWD ||
pPacket->socks5AuthRep.bAuth == AUTH_CHAP ) ;
break;
case PACKET_SOCKS5AUTHPASSWDREP:
return ( pPacket->socks5AuthPasswdRep.bStatus == AUTH_OK );
break;
case PACKET_SOCKS5REP:
return ( pPacket->socks5Rep.bRep == REP5_SUCCESS );
break;
default:
return FALSE;
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -