資源簡介
win sockket全局代理驅動(c++ spi)
通過spi驅動實現在的全局代理模塊,支持socks4,5,http代理協議。
同時支持ip filter功能, 可用于IE等瀏覽器。
代碼片段和文件信息
#include?“StdAfx.h“
//
//?進程間全局變量
//
#pragma?data_seg(“.inidata“)
int m_iDllCount =?0;
#pragma?data_seg()
//
//?進程內全局變量
//
CRITICAL_SECTION gCriticalSection?gOutput; //?代碼段保護變量
WSPPROC_TABLE NextProcTable???; //?保存30個服務提供者指針
TCHAR m_sProcessName[MAX_PATH]; //?保存當前進程名稱
CLog?g_log;
//
//?自定義注冊表分支用來保存系統基礎服務提供者的路徑
//
#define?REG_INSTALL_KEY _T(“SYSTEM\\CurrentControlSet\\Services\\WinSock2\\anyx_socks_proxy“)
//#define?CONFIG_FILE?_T(“C:\\SocksProxy.ini“)
//——————————————————————————————————————
//?私有函數
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;
}
//代理類型常量
#define?VER_SOCKS5?5
#define?VER_SOCKS4?4
//socks?proxy?info;
bool?b_direct?=?true;
char?szSocksHost[MAX_PATH]?=?{0};
int?szSocksPort?=?1080;
char?szUser[MAX_PATH]?=?{0};
char?szPass[MAX_PATH]?=?{0};
int?szVer=VER_SOCKS5;
//igrone?ip;
char?szIgnore[1024]={0};
HANDLE?hLogFile;?//?日志文件句柄
//SOCKET信息結構
typedef?struct?_SOCKET_INFO?{
????int?nProxySocket;???//代理SOCKET
????int?nNomalSocket;???//正常SOCKET
????int?nVer;??????????//SOCKET(Ver4/Ver5)
bool?bDirect;//
}?SOCKET_INFO;
static?SOCKET_INFO?g_SocketList[1024]?=?{0};????//SOCKET信息列表
static?int?g_nIndex?=?0;????????????????????????//SOCKET信息列表索引
//向列表中插入SOCKET信息
VOID?ins_list(const?SOCKET_INFO?socket_info)
{
????int?i?=?0;
????if?(g_nIndex?>=?1024)
g_nIndex?=?0;
????for?(i=0;?i ????????if?(memcmp(&socket_info?&g_SocketList[i]?sizeof(SOCKET_INFO))?==?0)
{
????????????return;????//已經在list中了
}
????}
????memcpy(&g_SocketList[g_nIndex]?&socket_info?sizeof(SOCKET_INFO));
????g_nIndex++;
//InterlockedIncrement(&g_nIndex);
}
//從列表中刪除SOCKET信息
VOID?del_list(const?int?nSocket)
{
????int?i?=?0;
????SOCKET_INFO?*socket_info?=?NULL;
????for?(i=0;?i ????????socket_info?=?&g_SocketList[i];
????????if?(socket_info->nProxySocket?==?nSocket?)?
{
int?Errno;
????????????//NextProcTable.lpWSPCloseSocket(socket_info->nProxySocket&Errno);
????????????NextProcTable.lpWSPCloseSocket(socket_info-
- 上一篇:南京大學C語言課件
- 下一篇:VxWorks串口編程代碼
評論
共有 條評論