Программа работает в двух режимах.
Первый, с параметром - файла-списка, запуск (пример): CheckProxy MyProxy.txt
Во-втором режиме, запуск - без параметров, предполагается - нахождение в папке с программой, текстового файла "Proxy.txt".
Формат списка "Proxy.txt":
- Код: Выделить всё
127.0.0.1:8080
127.0.0.2:1080
127.0.0.3:8485
Сборка программы осуществляется двумя средами разработки, это Borland C++ и Visual Studio.
- Код: Выделить всё
// Main.h
#pragma once
enum COLORS {
BLACK,
BLUE,
GREEN,
CYAN,
RED,
MAGENTA,
BROWN,
LIGHTGRAY,
DARKGRAY,
LIGHTBLUE,
LIGHTGREEN,
LIGHTCYAN,
LIGHTRED,
LIGHTMAGENTA,
YELLOW,
WHITE
};
void mb(char* s);
char* appBaseDir();
char* StampDateTime(void);
char* NameDateTime(void);
/* Default "bRewrite = TRUE" rewrite file,
* "dwNumberOfBytesToWrite = 0" write char.
*/
void log(char* svFilename, char* svStr,
BOOL bRewrite=FALSE,
DWORD dwNumberOfBytesToWrite=0);
char* BreakString(char* svLines, char* svTok);
u_long GetAdr(char* svHostname);
void setcolor(WORD color);
void gotoxy(SHORT x, SHORT y);
WORD savecolor(void);
void restorecolor(WORD wAttributes);
- Код: Выделить всё
// CheckProxy.cpp
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <winsock2.h>
#include "Main.h"
#include "Socks.h"
char* GAppname = "Check Proxy";
#define SERVER_QUERY "google.com"
#define SERVER_QUERY_PORT 443
#define SERVER_QUERY_DELAY 2000
int main(int argc, char *argv[])
{
WORD wAttributes;
SetConsoleTitle(GAppname);
char svFilename[MAX_PATH];
if (2!=argc)
lstrcpy(svFilename, "Proxy.txt");
else
lstrcpy(svFilename, argv[1]);
char svBuff[1024];
FILE* stream = fopen(svFilename, "r");
if (!stream) {
wsprintf(svBuff,
"Failed open\n\"%s\"", svFilename);
mb(svBuff);
}
/* Make filename for log. */
char svFilename_Log[MAX_PATH];
char* svFolderName;
svFolderName = NameDateTime();
wsprintf(svFilename_Log,"%sProxy_%s.txt",
appBaseDir(), svFolderName);
/* Show prompt. */
setcolor(LIGHTGRAY);
printf("%s -- 1.0 (c) by Anonymous\n", GAppname);
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2,2),&wsaData))
{
fclose(stream);
mb("Failed WSAStartup.");
}
u_long uDestadr = GetAdr(SERVER_QUERY);
if (uDestadr<0)
{
wsprintf(svBuff,
"Failed resolve \"%s\"", SERVER_QUERY);
mb(svBuff);
}
char svProxyName[16];
char svPort[6];
int sock;
while (fgets(svBuff, sizeof(svBuff), stream))
{
if (' '!=svBuff[0] /* Skip commentary... */
&& '\t'!=svBuff[0]
&& ';'!=svBuff[0]
&& '/'!=svBuff[0])
{
if (svBuff[0])
{
if (strstr(svBuff, ":"))
{
char* ptr = BreakString(svBuff, ":");
if (ptr)
{
if (*ptr==' ')
++ptr;
if (strchr(ptr,' '))
*strchr(ptr,' ')=0;
if (strchr(ptr,'\r'))
*strchr(ptr,'\r')=0;
if (strchr(ptr,'\n'))
*strchr(ptr,'\n')=0;
if (!*ptr && !*svBuff)
continue;
lstrcpy(svPort, ptr);
lstrcpy(svProxyName, svBuff);
/* Resolve proxy name... */
u_long uProxyadr = GetAdr(svProxyName);
if (uProxyadr<0)
{
wAttributes = savecolor();
setcolor(LIGHTRED);
printf("Could not resolve \"%s\"\n", svProxyName);
/* Restore attributes console. */
restorecolor(wAttributes);
continue;
}
/* Send info. */
setcolor(LIGHTGREEN);
printf("%s Query server %s:%s\n",
StampDateTime(),
svProxyName,
svPort);
setcolor(LIGHTCYAN);
printf("\tCheck SOCKS5...\n");
if (SOCKS5_SUCCESS == Socks5Connect(
&sock,
uProxyadr,
atoi(svPort),
uDestadr,
SERVER_QUERY_PORT,
SERVER_QUERY_DELAY))
{
setcolor(LIGHTGREEN);
printf("\t\tIs up -- PA6OTAET! --\n");
shutdown(sock, SD_BOTH);
/* Write to log. */
wsprintf(svBuff,
"; SOCKS5\r\n"
"%s\r\n%s\r\n\r\n",
svProxyName,
svPort);
log(svFilename_Log, svBuff);
}
else
{
setcolor(LIGHTGRAY);
printf("\t\tIs down (B OTCTOE).\n");
}
/* Send info. */
setcolor(LIGHTCYAN);
printf("\tCheck SOCKS4...\n");
if (SOCKS4_SUCCESS == Socks4Connect(
&sock,
uProxyadr,
atoi(svPort),
uDestadr,
SERVER_QUERY_PORT,
SERVER_QUERY_DELAY * 2))
{
/* Send info. */
setcolor(LIGHTGREEN);
printf("\t\tIs up -- PA6OTAET! --\n");
shutdown(sock, SD_BOTH);
/* Write to log. */
wsprintf(svBuff,
"; SOCKS4\r\n"
"%s\r\n%s\r\n\r\n",
svProxyName,
svPort);
log(svFilename_Log, svBuff);
}
else
{
setcolor(LIGHTGRAY);
printf("\t\tIs down (B OTCTOE).\n");
}
} /* End "if(svPort)" */
} /* End "if (strstr(svBuff, ":"))" */
} /* End "if(svBuff[0])" */
} /* End "if(';')" */
} /* End "while" */
fclose(stream);
setcolor(YELLOW);
printf("--[Done]--\n");
system("pause>nul");
return 0;
}
void mb(char* s)
{
UINT uType=MB_OK | MB_ICONINFORMATION |
MB_SETFOREGROUND | MB_SYSTEMMODAL;
int n=0;
if (strstr(s,"Failed") || strstr(s,"Error"))
++n;
if (n) {
uType &=~MB_ICONINFORMATION;
uType |=MB_ICONWARNING;
} MessageBox(GetActiveWindow(),s,GAppname,uType);
if (n)
ExitProcess(n);
}
char* appBaseDir()
{
static char svBuff[MAX_PATH];
if (!svBuff[0]) {
GetModuleFileName(GetModuleHandle(NULL),svBuff,MAX_PATH);
int i;
for (i=lstrlen(svBuff)-1;i>0;--i) {
if ('\\'==svBuff[i-1] || '/'==svBuff[i-1])
break;
}
svBuff[i]=0;
}
return svBuff;
}
char* StampDateTime(void)
{
/* Output "29 Jun 2024 19:05:52" */
static char svResult[64];
time_t tTime;
struct tm* ptm;
tTime = time(NULL);
ptm = localtime(&tTime);
strftime(svResult, 64,
"%d %b %Y %H:%M:%S",// 29 Jun 2024 19:05:52
//"%a, %d %b %Y %H:%M:%S",// Sat, 29 Jun 2024 19:05:52
ptm);
return svResult;
}
char* NameDateTime(void)
{
/* Output "06-08-2024_11-37-37" */
static char svBuff[256];
char svDate[128];
char svTime[128];
GetDateFormat(LOCALE_SYSTEM_DEFAULT,0,NULL,"dd-MM-yyyy",svDate,128);
GetTimeFormat(LOCALE_SYSTEM_DEFAULT,TIME_FORCE24HOURFORMAT,NULL,"hh'-'mm'-'ss",svTime,128);
wsprintf(svBuff,"%.100s_%.100s",svDate,svTime);
return svBuff;
}
void log(char* svFilename, char* svStr, BOOL bRewrite,
DWORD dwNumberOfBytesToWrite)
{
/*
* Default "bRewrite = TRUE" - rewrite file,
* "dwNumberOfBytesToWrite = 0" - write char.
*/
DWORD dwCreationDistribution, dwBytesWritten;
dwCreationDistribution=OPEN_ALWAYS;
if (!*svFilename)
{
mb("log() - empty filename!");
return;
}
if (bRewrite)
dwCreationDistribution=CREATE_ALWAYS;
HANDLE hFile;
hFile=CreateFile(svFilename,GENERIC_WRITE,
0,NULL,dwCreationDistribution,
FILE_ATTRIBUTE_NORMAL,NULL);
if (INVALID_HANDLE_VALUE==hFile)
{
char svBuff[512];
wsprintf(svBuff,
"Could not create file log()\n\n\"%s\"\n",
svFilename);
mb(svBuff);
}
else
{
SetFilePointer(hFile,0,NULL,FILE_END);
if (!dwNumberOfBytesToWrite)
dwNumberOfBytesToWrite=lstrlen(svStr);
WriteFile(hFile,svStr,
dwNumberOfBytesToWrite,&dwBytesWritten,NULL);
CloseHandle(hFile);
}
}
char* BreakString(char* svLines, char* svTok)
{
char *tok, *s;
char* p=svLines;
if (*p)
{
while (*p)
{
for (s=p,tok=svTok;(*s)&&(*tok);++s,++tok)
{
if (*s!=*tok)
break;
}
if (!*tok)
{
*p=0;
return p+lstrlen(svTok);
}
++p;
}
}
return NULL;
}
u_long GetAdr(char* svHostname)
{
u_long Addr = inet_addr(svHostname);
if (INADDR_NONE==Addr) {
struct hostent* h;
h = gethostbyname(svHostname);
if (h)
Addr = *(u_long*)h->h_addr;
}
return Addr;
}
void setcolor(WORD color)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),color);
}
void gotoxy(SHORT x, SHORT y)
{
COORD coord;
coord.X=x;
coord.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);
}
WORD savecolor(void)
{
CONSOLE_SCREEN_BUFFER_INFO csbi;
WORD wAttributes = LIGHTGRAY;
if (GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi))
wAttributes = csbi.wAttributes;
return wAttributes;
}
void restorecolor(WORD wAttributes)
{
/* Set the attribute to the original. */
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
wAttributes);
}
- Код: Выделить всё
// Socks.h
#pragma once
#pragma comment(lib, "ws2_32.lib")
#include <winsock2.h>
#define SOCKS_VERSION_4 4
#define SOCKS_VERSION_5 5
#define SOCKS_CONNECT 1
#define SOCKS_BIND 2
#define SOCKS_UDP_ASSOCIATE 3
#define SOCKS_IPV4 1
#define SOCKS_IPV6 4
#define SOCKS_DOMAINNAME 3
enum SOCKS5_ERROR {
SOCKS5_SUCCESS,
SOCKS5_SERVER_FAILURE,
SOCKS5_CONNECTION_DISALLOWED,
SOCKS5_NETWORK_UNREACHABLE,
SOCKS5_HOST_UNREACHABLE,
SOCKS5_CONNECTION_REFUSED,
SOCKS5_TTL_EXPIRED,
SOCKS5_INVALID_COMMAND,
SOCKS5_INVALID_ADDRESS,
SOCKS5_OTHER
};
enum SOCKS4_ERROR {
SOCKS4_SUCCESS = 0x5A,
SOCKS4_REJECTED = 0x5B,
SOCKS4_NETWORK_UNREACHABLE = 0x5C,
SOCKS4_INVALID_USERID = 0x5D
};
typedef struct _SOCKS5_REQUEST {
BYTE Version;
BYTE Command;
BYTE Reserved;
BYTE AddressType;
DWORD DestAddress;
WORD DestPort;
} SOCKS5_REQUEST, *PSOCKS5_REQUEST;
typedef struct _SOCKS5_REPLY {
BYTE Version;
BYTE Reply;
BYTE Reserved;
BYTE AddressType;
DWORD RemoteAddress;
WORD RemotePort;
} SOCKS5_REPLY, *PSOCKS5_REPLY;
typedef struct _SOCKS4_REQUEST {
BYTE Version;
BYTE Command;
WORD DestPort;
DWORD DestAddress;
BYTE UserId;
} SOCKS4_REQUEST, *PSOCKS4_REQUEST;
typedef struct _SOCKS4_REPLY {
BYTE Reserved;
BYTE Status;
WORD Reserved1;
DWORD Reserved2;
} SOCKS4_REPLY, *PSOCKS4_REPLY;
typedef struct _PROXY {
_PROXY *Next;
PCHAR Address;
PCHAR Port;
BYTE Version;
} PROXY, *PPROXY;
BYTE Socks4Connect(int* sock,
u_long uProxyadr, WORD wProxyPort,
u_long uDestadr, WORD wDestPort,
int nTimeout);
BYTE Socks5Connect(int* sock,
u_long uProxyadr, WORD wProxyPort,
u_long uDestadr, WORD wDestPort,
int nTimeout);
- Код: Выделить всё
// Socks.cpp
#include <winsock2.h>
#include "Socks.h"
BYTE Socks4Connect(int* sock,
u_long uProxyadr,
WORD wProxyPort,
u_long uDestadr,
WORD wDestPort,
int nTimeout)
{
SOCKS4_REPLY SocksReply;
SocksReply.Reserved = 0;
SocksReply.Status = 0xFF;
*sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (*sock<0)
return SocksReply.Status;
SOCKADDR_IN proxyaddr;
memset(&proxyaddr, 0, sizeof(proxyaddr));
proxyaddr.sin_family = AF_INET;
proxyaddr.sin_addr.s_addr = uProxyadr;
proxyaddr.sin_port = htons(wProxyPort);
if (setsockopt(*sock, SOL_SOCKET,
SO_RCVTIMEO, (char*)&nTimeout, sizeof(int))<0)
{
return SocksReply.Status;
}
if (connect(*sock, (LPSOCKADDR)&proxyaddr,
sizeof(proxyaddr))<0)
{
return SocksReply.Status;
}
SOCKS4_REQUEST SocksRequest;
SocksRequest.Version = SOCKS_VERSION_4;
SocksRequest.Command = SOCKS_CONNECT;
SocksRequest.DestPort = htons(wDestPort);
SocksRequest.DestAddress = uDestadr;
if (send(*sock, (char*)&SocksRequest,
sizeof(SocksRequest), 0)<0)
{
return SocksReply.Status;
}
recv(*sock, (char*)&SocksReply, sizeof(SocksReply), 0);
return SocksReply.Status;
}
BYTE Socks5Connect(int* sock,
u_long uProxyadr,
WORD wProxyPort,
u_long uDestadr,
WORD wDestPort,
int nTimeout)
{
SOCKS5_REPLY SocksReply;
SocksReply.Reserved = 0;
SocksReply.Reply = 0xFF;
*sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (*sock<0)
return SocksReply.Reply;
SOCKADDR_IN proxyaddr;
memset(&proxyaddr, 0, sizeof(proxyaddr));
proxyaddr.sin_family = AF_INET;
proxyaddr.sin_addr.s_addr = uProxyadr;
proxyaddr.sin_port = htons(wProxyPort);
if (setsockopt(*sock, SOL_SOCKET,
SO_RCVTIMEO, (char*)&nTimeout, sizeof(int))<0)
{
return SocksReply.Reply;
}
if (connect(*sock, (LPSOCKADDR)&proxyaddr,
sizeof(proxyaddr))<0)
{
return SocksReply.Reply;
}
SOCKS5_REQUEST SocksRequest;
SocksRequest.Version = SOCKS_VERSION_5;
SocksRequest.Command = SOCKS_CONNECT;
SocksRequest.AddressType = SOCKS_IPV4;
SocksRequest.DestAddress = uDestadr;
SocksRequest.DestPort = htons(wDestPort);
for (int i=0; i<2; ++i)
{
if (send(*sock, (char*)&SocksRequest,
sizeof(SocksRequest), 0)<0)
{
/* Failed send to socks proxy. */
continue;
}
if (recv(*sock, (char*)&SocksReply,
sizeof(SocksReply), 0)<0)
{
continue;
}
if (SocksReply.Reply)
break;
}
return SocksReply.Reply;
}
