amiralbenz

Socks5 proxy maker

Sep 7th, 2015
320
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.87 KB | None | 0 0
  1. #define WIN32_LEAN_AND_MEAN
  2. #include <winsock2.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5.  
  6. #define NO_AUTH 0x00
  7. #define GSSAPI 0x01
  8. #define UN_PW 0x02
  9. #define IANA_B 0x03
  10. #define IANA_E 0x7F
  11. #define PRIV_B 0x80
  12. #define PRIV_E 0xFE
  13. #define NO_USABLE 0xFF
  14.  
  15.  
  16. #define SUCCESS 0x00
  17. #define FAILURE 0x01
  18. #define RULESET 0x02
  19. #define N_URA 0x03
  20. #define H_URA 0x04
  21. #define REFUSED 0x05
  22. #define TTL_R 0x06
  23. #define N_SUP 0x07
  24. #define AN_SUP 0x08
  25.  
  26.  
  27. #define CONNECT 0x01
  28. #define BIND 0x02
  29. #define UDP 0x03
  30.  
  31.  
  32. #define IP4 0x01
  33. #define DOMAIN 0x03
  34. #define IP6 0x04
  35.  
  36. #define BUFF_SIZE 1024
  37.  
  38. typedef struct _TCPINIT {
  39. BYTE ver;
  40. BYTE nmethods;
  41. BYTE *methods;
  42. } TCPINIT;
  43.  
  44. typedef struct _TCPCLIENT {
  45. SOCKET sock;
  46.  
  47. HANDLE hOut;
  48.  
  49. char user[35];
  50. char pass[35];
  51. } TCPCLIENT;
  52.  
  53. typedef struct _UNPWAUTH {
  54. BYTE ver;
  55.  
  56. BYTE ulen;
  57. char *cname;
  58.  
  59. BYTE plen;
  60. char *pword;
  61. } UNPWAUTH;
  62.  
  63. typedef struct _TCPREQUEST {
  64. BYTE ver;
  65. BYTE cmd;
  66. BYTE reserved;
  67. BYTE atype;
  68. long addr;
  69. short port;
  70. } TCPREQUEST;
  71.  
  72. typedef struct _SOCKS5 {
  73. char cID[35];
  74. char cPass[35];
  75. USHORT uPort;
  76.  
  77. SOCKET sock;
  78. char cUser[34];
  79. sockaddr_in *remote;
  80. } SOCKS5;
  81.  
  82. unsigned long __stdcall fTcpServerThread(void *pInfo);
  83.  
  84. #define sendv(s,data,len) send(s,(char *)data,len,0)
  85. #ifdef DBG
  86. int output(HANDLE hOut,char *szFormat,...) {
  87. char cBuff[5*1024];
  88.  
  89. char *args;
  90. va_start(args,szFormat);
  91. vsprintf(cBuff,szFormat,args);
  92. va_end(args);
  93.  
  94. DWORD dwWritten;
  95. WriteFile(hOut,cBuff,strlen(cBuff)+1,&dwWritten,0);
  96.  
  97. return dwWritten;
  98. }
  99.  
  100.  
  101. char *host(DWORD dwIP) {
  102. in_addr a;
  103. a.S_un.S_addr = dwIP;
  104.  
  105. return inet_ntoa(a);
  106. }
  107.  
  108. unsigned long resolve(char *szHost) {
  109. unsigned long ulRet = inet_addr(szHost);
  110. if (ulRet != INADDR_NONE)
  111. return ulRet;
  112. PHOSTENT h = gethostbyname(szHost);
  113. return *(long int *)h->h_addr_list[0];
  114. }
  115.  
  116. #endif
  117.  
  118. int transmit(SOCKET s1,SOCKET s2,HANDLE hOut) {
  119. char *cBuff = new char[BUFF_SIZE];
  120.  
  121. fd_set fd;
  122. int iRecvLen;
  123.  
  124. while (1) {
  125. FD_ZERO(&fd);
  126.  
  127. FD_SET(s1,&fd);
  128. FD_SET(s2,&fd);
  129.  
  130. select(0,&fd,0,0,0);
  131.  
  132. if (FD_ISSET(s1,&fd)) {
  133. iRecvLen = recv(s1,cBuff,BUFF_SIZE,0);
  134. if (iRecvLen < 1)
  135. break;
  136. output(hOut,"<%d>%s",s1,cBuff);
  137. if (send(s2,cBuff,iRecvLen,0) < 1)
  138. break;
  139. }
  140.  
  141. if (FD_ISSET(s2,&fd)) {
  142. iRecvLen = recv(s2,cBuff,BUFF_SIZE,0);
  143. if (iRecvLen < 1)
  144. break;
  145. output(hOut,"<%d>%s",s2,cBuff);
  146. if (send(s1,cBuff,iRecvLen,0) < 1)
  147. break;
  148. }
  149. }
  150.  
  151. output(hOut,"connection closed\r\n");
  152. shutdown(s1,SD_BOTH);
  153. return shutdown(s2,SD_BOTH);
  154. }
  155.  
  156. int SocksUDP(SOCKET cSock,sockaddr_in *inaddr,HANDLE hOut,TCPREQUEST *req)
  157. {
  158. output(hOut,"UDP associate request\r\n");
  159.  
  160. sockaddr_in laddr;
  161. int iSize = sizeof(laddr);
  162. getsockname(cSock,(sockaddr *)&laddr,&iSize);
  163.  
  164. sockaddr_in raddr = (*(sockaddr_in *)inaddr);
  165.  
  166. SOCKET usock = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
  167.  
  168. char *cBuff = new char[BUFF_SIZE];
  169.  
  170. int iRecv;
  171. while (1)
  172. {
  173. iSize = sizeof(raddr);
  174. iRecv = recvfrom(usock,cBuff,BUFF_SIZE,0,(sockaddr *)&raddr,&iSize);
  175.  
  176. sendto(usock,cBuff,iRecv,0,(sockaddr *)&laddr,sizeof(laddr));
  177.  
  178. if (iRecv < 1)
  179. break;
  180.  
  181. iSize = sizeof(laddr);
  182.  
  183.  
  184. iRecv = recvfrom(usock,cBuff,BUFF_SIZE,0,(sockaddr *)&laddr,&iSize);
  185. if (iRecv < 1)
  186. break;
  187. sendto(usock,cBuff,iRecv,0,(sockaddr *)&raddr,sizeof(raddr));
  188. }
  189.  
  190. output(hOut,"connection closed\r\n");
  191. shutdown(usock,SD_BOTH);
  192. return closesocket(usock);
  193. }
  194.  
  195. int SocksBind(SOCKET cSock,sockaddr_in *inaddr,HANDLE hOut,TCPREQUEST *req) {
  196.  
  197. output(hOut,"bind request\r\n");
  198. SOCKET ssock = WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,0,0,0);
  199. SOCKET clsock;
  200.  
  201. sockaddr_in sbind = (*(sockaddr_in *)inaddr);
  202.  
  203. if (bind(ssock,(sockaddr *)&sbind,sizeof(sbind))) {
  204. req->cmd = FAILURE;
  205. sendv(cSock,req,sizeof(TCPREQUEST));
  206. return closesocket(cSock);
  207. }
  208. if (listen(ssock,1)) {
  209. req->cmd = FAILURE;
  210. sendv(cSock,req,sizeof(TCPREQUEST));
  211. return closesocket(cSock);
  212. }
  213.  
  214. clsock = accept(ssock,0,0);
  215. req->cmd = SUCCESS;
  216. sendv(cSock,req,sizeof(TCPREQUEST));
  217. transmit(clsock,cSock,hOut);
  218. return 0;
  219. }
  220.  
  221. int SocksConnect(SOCKET cSock,sockaddr_in *inaddr,HANDLE hOut,TCPREQUEST *req) {
  222. SOCKET rsock = WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,0,0,0);
  223.  
  224. if (connect(rsock,(sockaddr *)inaddr,sizeof(SOCKADDR_IN))) {
  225. #ifdef DBG
  226. output(hOut,"<%d> error connecting to %s:%d\r\n",cSock,host(req->addr),ntohs(req->port));
  227. #endif
  228. req->cmd = H_URA;
  229. sendv(cSock,req,sizeof(TCPREQUEST));
  230. return closesocket(cSock);
  231. }
  232.  
  233. sockaddr_in bindaddr;
  234. int iSize = sizeof(bindaddr);
  235. getpeername(rsock,(sockaddr *)&bindaddr,&iSize);
  236.  
  237. req->addr = bindaddr.sin_addr.S_un.S_addr;
  238. req->port = bindaddr.sin_port;
  239.  
  240. req->cmd = SUCCESS;
  241. int iLen = sendv(cSock,req,sizeof(TCPREQUEST));
  242. if (iLen < 1) {
  243. closesocket(cSock);
  244. return closesocket(rsock);
  245. }
  246.  
  247. output(hOut,"iLen = %d\r\nsizeof(req) = %d\r\n",iLen,sizeof(TCPREQUEST));
  248. #ifdef DBG
  249. output(hOut,"<%d> connected to %s:%d\r\nstarting transmit...\r\n",cSock,host(req->addr),ntohs(req->port));
  250. #endif
  251. transmit(cSock,rsock,hOut);
  252. #ifdef DBG
  253. CloseHandle(hOut);
  254. #endif
  255. closesocket(rsock);
  256. return closesocket(cSock);
  257. }
  258.  
  259. unsigned long __stdcall fTcpClientThread(void *pInfo) {
  260. TCPCLIENT client = (*(TCPCLIENT *)pInfo);
  261.  
  262. SOCKET sock = client.sock;
  263. HANDLE hOut = client.hOut;
  264.  
  265. char szUser[35];
  266. strcpy(szUser,client.user);
  267.  
  268. char szPass[35];
  269. strcpy(szPass,client.pass);
  270.  
  271. TCPINIT init;
  272.  
  273. if (recv(sock,(char *)&init,2,0) < 1)
  274. return closesocket(sock);
  275.  
  276. init.methods = new BYTE[init.nmethods];
  277. recv(sock,(char *)init.methods,init.nmethods,0);
  278. output(hOut,"<%d> recieved tcp init packet (%d,%d,%x)\r\n",sock,init.ver,init.nmethods,init.methods[init.nmethods]);
  279.  
  280. output(hOut,"<%d> checking version...\r\n",sock);
  281. if (init.ver != 5) {
  282. output(hOut,"not v5, closing\r\n",sock);
  283. return closesocket(sock);
  284. }
  285.  
  286. output(hOut,"<%d> checking 0x02 (USER/PASS) auth...\r\n",sock);
  287. bool bHasAuth = false;
  288. for (int i = 0;i < init.nmethods;i++) {
  289. if ((init.methods[i] == UN_PW)) {
  290. bHasAuth = true;
  291. break;
  292. }
  293. }
  294. if (!bHasAuth) {
  295. output(hOut,"<%d> no usable auth found, exiting\r\n",sock);
  296. init.nmethods = NO_USABLE;
  297. sendv(sock,&init,2);
  298. return closesocket(sock);
  299. }
  300.  
  301. init.nmethods = UN_PW;
  302. sendv(sock,&init,2);
  303.  
  304. UNPWAUTH auth;
  305.  
  306. output(hOut,"<%d> recieving authentication...\r\n",sock);
  307. recv(sock,(char *)&auth,sizeof(auth.ver)+sizeof(auth.ulen),0);
  308.  
  309. if (auth.ver != 0x01) {
  310. output(hOut,"<%d> auth.ver != 0x01,closing socket\r\n",sock);
  311. auth.ulen = NO_USABLE;
  312. sendv(sock,&auth,2);
  313. return closesocket(sock);
  314. }
  315. output(hOut,"username len = %d, allocating\r\n",auth.ulen);
  316. auth.cname = new char[auth.ulen+1];
  317. auth.cname[auth.ulen] = 0;
  318. recv(sock,auth.cname,auth.ulen,0);
  319.  
  320. recv(sock,(char *)&auth.plen,sizeof(auth.plen),0);
  321. output(hOut,"password len = %d, allocating\r\n",auth.plen);
  322.  
  323. auth.pword = new char[auth.plen+1];
  324. auth.pword[auth.plen] = 0;
  325. recv(sock,auth.pword,auth.plen,0);
  326.  
  327. output(hOut,"<%d> user authed (%s,%s)\r\n",sock,auth.cname,auth.pword);
  328. output(hOut,"<%d> add auth check later...\r\n",sock);
  329.  
  330. if ((!cmp(auth.cname,szUser)) || (!cmp(auth.pword,szPass)))
  331. {
  332. auth.ulen = FAILURE;
  333. sendv(sock,&auth,2);
  334. closesocket(sock);
  335. return 0;
  336. }
  337.  
  338. auth.ulen = SUCCESS;
  339. sendv(sock,&auth,2);
  340.  
  341. delete auth.cname;
  342. delete auth.pword;
  343.  
  344. TCPREQUEST req;
  345.  
  346. output(hOut,"<%d> recieving TCPREQUEST\r\n",sock);
  347.  
  348. recv(sock,(char *)&req,4,0);
  349.  
  350. if (req.ver != 0x05) {
  351. output(hOut,"<%d> ver != 0x05\r\n",sock);
  352. closesocket(sock);
  353. }
  354.  
  355. if ((req.atype != IP4) && (req.atype != DOMAIN)) {
  356. output(hOut,"<%d> req.atype != 0x01 or 0x03\r\n",sock);
  357. req.cmd = AN_SUP;
  358. sendv(sock,&req,sizeof(req));
  359. closesocket(sock);
  360. }
  361.  
  362. sockaddr_in local;
  363.  
  364. if (req.atype == IP4) {
  365. output(hOut,"atype = IPv4\r\n");
  366. recv(sock,(char *)&req+4,6,0);
  367. local.sin_addr.S_un.S_addr = req.addr;
  368. } else
  369. if (req.atype == DOMAIN) {
  370. output(hOut,"atype = domain\r\n");
  371. char cDomainSize = 0;
  372. recv(sock,&cDomainSize,sizeof(cDomainSize),0);
  373. char *szDomain = new char[cDomainSize+1];
  374.  
  375. szDomain[cDomainSize] = 0;
  376. recv(sock,szDomain,cDomainSize,0);
  377.  
  378. output(hOut,"domain = %s\r\n",szDomain);
  379.  
  380. recv(sock,(char *)&req.port,sizeof(req.port),0);
  381. PHOSTENT h = gethostbyname(szDomain);
  382. if (!h)
  383. return closesocket(sock);
  384. local.sin_addr.S_un.S_addr = (*(unsigned long *)h->h_addr_list[0]);
  385. #ifdef DBG
  386. output(hOut,"resolved to %s\r\n",host(local.sin_addr.S_un.S_addr));
  387. #endif
  388. req.atype = IP4;
  389. req.addr = local.sin_addr.S_un.S_addr;
  390.  
  391. h = 0;
  392.  
  393. delete szDomain;
  394. }
  395. local.sin_family = 2;
  396. local.sin_port = req.port;
  397.  
  398. switch (req.cmd) {
  399. case CONNECT:
  400. SocksConnect(sock,&local,hOut,&req);
  401. break;
  402. case BIND:
  403. SocksBind(sock,&local,hOut,&req);
  404. break;
  405. case UDP:
  406. SocksUDP(sock,&local,hOut,&req);
  407. break;
  408. }
  409. }
  410.  
  411. unsigned long __stdcall fTcpServerThread(void *pInfo) {
  412. SOCKS5 set = (*(SOCKS5 *)pInfo);
  413.  
  414. HANDLE hOut = 0;
  415.  
  416. output(hOut,"server thread started\r\n");
  417.  
  418. SOCKET ssock = WSASocket(2,1,6,0,0,0);
  419. sockaddr_in local;
  420.  
  421. local.sin_addr.S_un.S_addr = INADDR_ANY;
  422. local.sin_family = 2;
  423. local.sin_port = set.uPort;
  424.  
  425. if (bind(ssock,(sockaddr *)&local,sizeof(local)))
  426. {
  427. #ifdef DBG
  428. return output(hOut,"error on bind (%d)\r\n",WSAGetLastError());
  429. #else
  430. return 0;
  431. #endif
  432. }
  433.  
  434. if (listen(ssock,10))
  435. {
  436. #ifdef DBG
  437. return output(hOut,"error on listen (%d)\r\n",WSAGetLastError());
  438. #else
  439. return 0;
  440. #endif
  441. }
  442.  
  443. TCPCLIENT client;
  444. #ifdef DBG
  445. client.hOut = hOut;
  446. #endif
  447.  
  448. DWORD dwThreadID;
  449.  
  450. int iLen = sizeof(sockaddr_in);
  451. getsockname(ssock,(sockaddr *)&local,&iLen);
  452. *set.remote = local;
  453. #ifdef DBG
  454. TCPREQUEST tcp;
  455. output(hOut,"server listening on port %d\r\n",ntohs(local.sin_port));
  456. output(hOut,"sizeof's: \r\n"
  457. "TPCINIT:%d\r\n"
  458. "TCPCLINET:%d\r\n"
  459. "UNPWAUTH:%d\r\n"
  460. "TCPREQUEST:%d\r\ntest: %d\r\n\r\n",sizeof(TCPINIT),sizeof(TCPCLIENT),sizeof(UNPWAUTH),sizeof(TCPREQUEST),(sizeof(BYTE)*4)+sizeof(DWORD)+sizeof(WORD));
  461. output(hOut,"TCPCLIENT:%d\r\n%d\r\n%d\r\n%d\r\n%d\r\n%d\r\n",sizeof(tcp.ver),sizeof(tcp.cmd),sizeof(tcp.reserved),sizeof(tcp.atype),sizeof(tcp.addr),sizeof(tcp.port));
  462. #endif
  463.  
  464. int iSize = strlen(set.cID)+1;
  465. char *szUser = new char[iSize];
  466. strcpy(szUser,set.cID);
  467.  
  468. iSize = strlen(set.cPass)+1;
  469. char *szPass = new char[iSize];
  470. strcpy(szPass,set.cPass);
  471.  
  472. zerod(&client,sizeof(client));
  473.  
  474. strcpy(client.user,szUser);
  475. strcpy(client.pass,szPass);
  476. while (1) {
  477. client.sock = accept(ssock,0,0);
  478. if (client.sock == INVALID_SOCKET)
  479. break;
  480. CreateThread(0,0,fTcpClientThread,(void *)&client,0,&dwThreadID);
  481. output(hOut,"\r\ntcp client connected\r\n");
  482. }
  483.  
  484. output(hOut,"closing server socket\r\n");
  485. return closesocket(ssock);
  486. }
Advertisement
Add Comment
Please, Sign In to add comment