Guest User

Untitled

a guest
Nov 20th, 2024
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.99 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <netinet/in.h>
  4. #include <arpa/inet.h>
  5. #include <pthread.h>
  6. #include <unistd.h>
  7. #include <sys/socket.h>
  8. #include <sys/un.h>
  9. #include <stdarg.h>
  10. #include <netinet/tcp.h>
  11. #include <errno.h>
  12. class Init
  13. {
  14. public:
  15. int oldfd;
  16. Init(std::string inip, int port)
  17. {
  18. oldfd = -1;
  19. size_t pos = inip.find(':');
  20. if (pos != std::string::npos)
  21. {
  22. struct sockaddr_in6 serveraddr6;
  23. oldfd = socket(AF_INET6, SOCK_STREAM, 0);
  24. memset(&serveraddr6, 0, sizeof(serveraddr6));
  25. serveraddr6.sin6_family = AF_INET6;
  26. inet_pton(AF_INET6, inip.c_str(), &(serveraddr6.sin6_addr));
  27. serveraddr6.sin6_port = htons(port);
  28. int optval = 1;
  29. if (setsockopt(oldfd, SOL_TCP, TCP_DEFER_ACCEPT, &optval, sizeof(optval)) < 0)
  30. {
  31. exit(-1);
  32. }
  33. if (setsockopt(oldfd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) < 0)
  34. {
  35. exit(-1);
  36. }
  37. if (bind(oldfd, (struct sockaddr *)&serveraddr6, sizeof(serveraddr6)) < 0)
  38. {
  39. std::cerr << "Error: Can't Bind address on " << inip << ":" << port << std::endl;
  40. close(oldfd);
  41. exit(-1);
  42. }
  43. }
  44. else
  45. {
  46. struct sockaddr_in serveraddr;
  47. oldfd = socket(AF_INET, SOCK_STREAM, 0);
  48. memset(&serveraddr, 0, sizeof(serveraddr));
  49. serveraddr.sin_family = AF_INET;
  50. inet_aton(inip.c_str(), &(serveraddr.sin_addr));
  51. serveraddr.sin_port = htons(port);
  52. int optval = 1;
  53. if (setsockopt(oldfd, SOL_TCP, TCP_DEFER_ACCEPT, &optval, sizeof(optval)) < 0)
  54. {
  55. exit(-1);
  56. }
  57. if (setsockopt(oldfd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) < 0)
  58. {
  59. exit(-1);
  60. }
  61. if (bind(oldfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)) < 0)
  62. {
  63.  
  64. std::cerr << "Error: Can't Bind address on " << inip << ":" << port << std::endl;
  65. close(oldfd);
  66. exit(-1);
  67. }
  68. }
  69. if (listen(oldfd, 5) < 0)
  70. {
  71. std::cerr << "Error: Can't listening address with " << inip << ":" << port << std::endl;
  72. close(oldfd);
  73. exit(-1);
  74. }
  75. }
  76. ~Init() { exit(-1); }
  77. };
  78. pthread_t net_threadpool[4096];
  79. int net_threadindex = 0;
  80. char net_threadbuffer[4096];
  81. class init
  82. {
  83. public:
  84. static void *Void(void *null)
  85. {
  86. int netfd, remote, shemale;
  87. char *fdbuf = new char[2048];
  88. memcpy(&netfd, null, 4);
  89. memcpy(&remote, ((int *)(null) + 1), 4);
  90. memcpy(&shemale, ((int *)(null) + 2), 4);
  91. free(null);
  92. while (1)
  93. {
  94. int Null = recv(netfd, fdbuf, 2048, 0);
  95. pthread_testcancel();
  96. if (Null <= 0)
  97. {
  98. delete[] fdbuf;
  99. close(netfd);
  100. pthread_cancel(net_threadpool[shemale]);
  101. net_threadbuffer[shemale] = 0;
  102. close(remote);
  103. pthread_exit(0);
  104. return (void *)0;
  105. }
  106. send(remote, fdbuf, Null, 0);
  107. }
  108. return (void *)0;
  109. }
  110. void Copy(int &src, int &dec)
  111. {
  112. int *null = (int *)malloc(12);
  113. null[0] = src;
  114. null[1] = dec;
  115. int *thread = (int *)malloc(12);
  116. thread[0] = dec;
  117. thread[1] = src;
  118. while (net_threadbuffer[net_threadindex] > 3)
  119. {
  120. net_threadindex++;
  121. }
  122. net_threadbuffer[net_threadindex] = sizeof(net_threadindex);
  123. null[2] = net_threadindex;
  124. pthread_create(&net_threadpool[net_threadindex], NULL, Void, null);
  125. net_threadindex++;
  126. while (net_threadbuffer[net_threadindex] > 3)
  127. {
  128. net_threadindex++;
  129. }
  130. net_threadbuffer[net_threadindex] = sizeof(net_threadindex);
  131. thread[2] = net_threadindex;
  132. pthread_create(&net_threadpool[net_threadindex], NULL, Void, thread);
  133. net_threadindex++;
  134. net_threadindex &= 4095;
  135. }
  136. };
  137. class import
  138. {
  139. public:
  140. void Println(std::string log, std::string path = "")
  141. {
  142. std::cout << log << " " << path << std::endl;
  143. }
  144. void Printf(char *log, ...)
  145. {
  146. va_list args;
  147. va_start(args, log);
  148. vprintf(log, args);
  149. va_end(args);
  150. }
  151. };
  152. struct timeval to;
  153. bool flink = true;
  154. class Connect
  155. {
  156. public:
  157. int route;
  158. int check()
  159. {
  160. import log;
  161. char SOCKET_P[23] = {47, 114, 117, 110, 47, 111, 108, 100, 47, 120, 114, 97, 121, 46, 102, 114, 105, 101, 110, 100, 0, 0};
  162. struct sockaddr_un server_addr;
  163. if ((route = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)
  164. {
  165. log.Println("Error: Can't init socket");
  166. return -1;
  167. }
  168. memset(&server_addr, 0, sizeof(struct sockaddr_un));
  169. server_addr.sun_family = AF_UNIX;
  170. strncpy(server_addr.sun_path, SOCKET_P, sizeof(server_addr.sun_path) - 1);
  171. if (connect(route, (struct sockaddr *)&server_addr, sizeof(struct sockaddr_un)) == -1)
  172. {
  173. log.Println("Error: Can't connect socket");
  174. return -1;
  175. }
  176. return 0;
  177. }
  178. };
  179. class var
  180. {
  181. private:
  182. struct sockaddr_in clientaddr;
  183. struct sockaddr_in6 clientaddr6;
  184. socklen_t sizeofaddr;
  185.  
  186. public:
  187. int Listen;
  188. char *RemoteAddr;
  189. var()
  190. {
  191. RemoteAddr = new char[42];
  192. sizeofaddr = sizeof(clientaddr6);
  193. }
  194. int Accept(int net)
  195. {
  196. import log;
  197. Listen = -1;
  198. memset(&clientaddr6, 0, sizeofaddr);
  199. if (Listen = accept(net, (struct sockaddr *)&clientaddr6, &sizeofaddr) < 0)
  200. {
  201. perror("Error accept");
  202. return -1;
  203. }
  204. if (flink)
  205. {
  206. // 别动,运行一段时间会出现大量close_wait。
  207. // 只要关掉第4个通道,突然就好了。我也不知道为什么。
  208. sleep(1);
  209. close(4);
  210. flink = !flink;
  211. }
  212. inet_ntop(AF_INET6, &(clientaddr6.sin6_addr), RemoteAddr, 40);
  213. if (!strcmp(RemoteAddr, "::"))
  214. {
  215. memcpy(&clientaddr, &clientaddr6, 16);
  216. strcpy(RemoteAddr, inet_ntoa(clientaddr.sin_addr));
  217. }
  218. if (strlen(RemoteAddr) > 8)
  219. {
  220. if (strncmp(RemoteAddr, "::ffff", 6) == 0)
  221. {
  222. char *sb = new char[16];
  223. memcpy(sb, RemoteAddr + 7, 16);
  224. strcpy(RemoteAddr, sb);
  225. delete[] sb;
  226. }
  227. }
  228. return 0;
  229. }
  230. int Write(int &net, char *conn, int &netl)
  231. {
  232. int recv = send(net, conn, netl, 0);
  233. if (recv > 0)
  234. {
  235. return 0;
  236. }
  237. else
  238. {
  239. return -1;
  240. }
  241. }
  242. };
  243. class tls
  244. {
  245. public:
  246. char sn[132];
  247. char snlen;
  248. int charlen;
  249. char *readedbyte;
  250. int check(int net_Conn)
  251. {
  252. import log;
  253. if (net_Conn < 0)
  254. {
  255. close(net_Conn);
  256. return 2;
  257. }
  258. readedbyte = new char[768];
  259. int err = recv(net_Conn, readedbyte, 767, 0);
  260. if (err < 0)
  261. {
  262. perror("Error occurred");
  263. delete[] readedbyte;
  264. readedbyte = NULL;
  265. close(net_Conn);
  266. return 1;
  267. }
  268. if (err < 43)
  269. {
  270. return -1;
  271. }
  272. if (readedbyte[0] != 0x16)
  273. {
  274. log.Println("Not tls\n");
  275. return -2;
  276. }
  277. if ((readedbyte[1] < 3) || ((readedbyte[1] == 3) && (readedbyte[2] < 1)))
  278. {
  279. log.Println("ERR: SSL < 3.1, it's still not sni");
  280. return -3;
  281. }
  282. if (readedbyte[5] != 0x1)
  283. {
  284. log.Println("err: Not a ClientHello");
  285. return -4;
  286. }
  287. bool Ture = false;
  288. for (int i = 32; i < err; i++)
  289. {
  290. if (sn[0] == readedbyte[i])
  291. {
  292. if (sn[1] == readedbyte[i + 1])
  293. {
  294. if (sn[2] == readedbyte[i + 2] && sn[3] == readedbyte[i + 3])
  295. {
  296. if (snlen == 4)
  297. {
  298. Ture = true;
  299. break;
  300. }
  301. if (strncmp(readedbyte + i, sn, snlen) == 0)
  302. {
  303. Ture = true;
  304. break;
  305. }
  306. }
  307. }
  308. }
  309. }
  310. if (Ture)
  311. {
  312. charlen = err;
  313. return 0;
  314. }
  315. else
  316. {
  317. printf("sni not match\n");
  318. return -5;
  319. }
  320. }
  321. void Close()
  322. {
  323. delete[] readedbyte;
  324. readedbyte = NULL;
  325. }
  326. };
  327. int main(int argc, char *argv[])
  328. {
  329. if (argc <= 5)
  330. {
  331. std::cout << "usage:" << std::endl;
  332. std::cout << argv[0] << " -listen [0.0.0.0] [443] -sni [www.example.com]" << std::endl;
  333. return -1;
  334. }
  335. if (strcmp(argv[1], "-listen") || strcmp(argv[4], "-sni"))
  336. {
  337. std::cout << "usage:" << std::endl;
  338. std::cout << argv[0] << " -listen [0.0.0.0] [443] -sni [www.example.com]" << std::endl;
  339. return -1;
  340. }
  341. std::string ip;
  342. int port, nil = 0;
  343. ip = argv[2];
  344. port = atoi(argv[3]);
  345. init io;
  346. Init Net(ip, port);
  347. tls sni;
  348. memcpy(sni.sn, argv[5], 127);
  349. to.tv_sec = 60;
  350. to.tv_usec = 0;
  351. sni.snlen = strlen(sni.sn);
  352. setsockopt(Net.oldfd, SOL_SOCKET, SO_RCVTIMEO, (const char *)&to, sizeof(to));
  353. var net;
  354. import fmt;
  355. if (sni.snlen < 4)
  356. {
  357. fmt.Println("ERR: domain must more than 4 length");
  358. return -1;
  359. }
  360. int err;
  361. while (1)
  362. {
  363. err = net.Accept(Net.oldfd);
  364. if (err != nil)
  365. {
  366. fmt.Println("err client:", net.RemoteAddr);
  367. continue;
  368. }
  369. fmt.Println("new client:", net.RemoteAddr);
  370. if ((err = sni.check(net.Listen)) < nil)
  371. {
  372. sni.Close();
  373. close(net.Listen);
  374. continue;
  375. }
  376. if (err != nil)
  377. {
  378. continue;
  379. }
  380. Connect conn;
  381. if (conn.check())
  382. {
  383. sni.Close();
  384. close(net.Listen);
  385. continue;
  386. }
  387. err = net.Write(conn.route, sni.readedbyte, sni.charlen);
  388. sni.Close();
  389. if (err != nil)
  390. {
  391. fmt.Println("connect local err");
  392. close(net.Listen);
  393. continue;
  394. }
  395. io.Copy(conn.route, net.Listen);
  396. }
  397. return 0;
  398. }
Add Comment
Please, Sign In to add comment