Advertisement
Guest User

Untitled

a guest
Jul 29th, 2015
207
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.10 KB | None | 0 0
  1. #ifndef __supersocks__socks__
  2. #define __supersocks__socks__
  3.  
  4. #include <iostream>
  5. #include <stdint.h>
  6. #include <netdb.h>
  7. #include <unistd.h>
  8. #include <sys/socket.h>
  9. #include <sys/types.h>
  10. #include <fcntl.h>
  11. #include <sys/uio.h>
  12. #include <arpa/inet.h>
  13. #include <list>
  14. #include <string>
  15. #include <sys/select.h>
  16.  
  17.  
  18. #define MAX_BUFFER 10*1024
  19. /*basic structure */
  20.  
  21. struct supported_auth{
  22. bool no_auth = 0;
  23. bool user_password = 0;
  24. };
  25. enum conditions{
  26. accepted = 0,
  27. handshaked = 1,
  28. connected =3
  29. };
  30.  
  31. struct remote{
  32. std::list<struct client>::iterator local;
  33. int sock;
  34. };
  35.  
  36. struct client{
  37. std::list<struct remote>::iterator remote;
  38. int sock;
  39. enum conditions cond;
  40. };
  41.  
  42. /*class define */
  43. class Server{
  44. public:
  45. int main_sock;
  46. bool encrption;
  47. std::list<struct remote> rmt;
  48. std::list<struct client> clnt;
  49. char *buffer;
  50.  
  51. Server(const char* lcl_port){
  52. this->buffer = (char*)operator new(MAX_BUFFER);
  53. addrinfo *addr;
  54. getaddrinfo(NULL, lcl_port, NULL, &addr);
  55. addr->ai_family = AF_UNSPEC;
  56. addr->ai_socktype = SOCK_STREAM;
  57. addr->ai_protocol = 0;
  58. set_init();
  59.  
  60. main_sock = create_main_socket(addr);
  61. if(main_sock < 0) std::cerr<<"error on creating main socket"<<std::endl;
  62.  
  63. if(bind(main_sock, addr->ai_addr, addr->ai_addrlen)< 0 ) std::cerr<<"error on binding"<<std::endl;
  64. if(listen(main_sock, backlog) < 0) std::cerr<<"error on listening"<<std::endl;
  65. }
  66.  
  67. void wipe_buffer(ssize_t s){
  68. memset(buffer, 0 , s);
  69. }
  70.  
  71. bool is_ready(int sock){
  72. if(FD_ISSET(sock, &set_var)) return true;
  73. else return false;
  74. }
  75.  
  76. inline void select_block(){
  77. set_var = set_org;
  78. int rc = select(maxfd+1, &set_var, NULL, NULL, NULL);
  79. if(rc < 0 ) std::cerr<<"error on select function"<<std::endl;
  80. }
  81. inline void set_add(int sock){
  82. FD_SET(sock, &set_org);
  83. if(sock > maxfd) maxfd = sock;
  84. }
  85. inline void set_del(int sock){
  86. FD_CLR(sock, &set_org);
  87. }
  88. private:
  89. char *local_port;
  90.  
  91. const int backlog = 20;
  92.  
  93. fd_set set_org;
  94. fd_set set_var;
  95.  
  96. int maxfd = 0;
  97.  
  98. int create_main_socket(addrinfo *addr){
  99. int sock;
  100. sock = socket(AF_INET, SOCK_STREAM, 0);
  101. if(sock <0) {
  102. return -1;
  103. }
  104. /*auto close socket when start a new process*/
  105. int rc = fcntl(sock, F_SETFD, FD_CLOEXEC);
  106. if(rc != 0){
  107. close(sock);
  108. return -1;
  109. }
  110. /*multiuse of addresss*/
  111. int flags = fcntl(sock, F_GETFL, 0);
  112. if(flags < 0){
  113. close(sock);
  114. return -1;
  115. }
  116. if(fcntl(sock, F_SETFL, flags | O_NONBLOCK) < 0){
  117. close(sock);
  118. return -1;
  119. }
  120. set_add(main_sock);
  121. return sock;
  122. }
  123.  
  124.  
  125. inline void set_init(){
  126. FD_ZERO(&set_org);
  127. FD_ZERO(&set_var);
  128. }
  129.  
  130. };
  131. #endif /* defined(__supersocks__socks__) */
  132.  
  133. #include <iostream>
  134. #include "socks.h"
  135. bool decison_making_for_local_packet(std::list<struct client>::iterator it, Server ss);
  136.  
  137. bool connect(std::list<struct client>::iterator it, Server ss);
  138. bool handshake(std::list<struct client>::iterator it, Server ss);
  139. bool client_forward(std::list<struct client>::iterator it, Server ss);
  140.  
  141. bool remote_forward(std::list<struct remote>::iterator it, Server ss);
  142.  
  143. static inline void set_port(sockaddr *addr, uint16_t port){
  144. ((sockaddr_in*)addr)->sin_port = port;
  145. }
  146.  
  147. int main(int argc, const char * argv[]) {
  148. // insert code here...
  149. if(argc != 2) {
  150. std::cerr<<"error on argument you take"<<std::endl;
  151. return -1;
  152. }
  153. Server ss (argv[1]);
  154.  
  155. while(1){
  156. ss.select_block();
  157. /*acception of client*/
  158. if(ss.is_ready(ss.main_sock)){
  159. struct client clnt;
  160. clnt.sock = accept(ss.main_sock, NULL, NULL);
  161. if(clnt.sock < 0){
  162. std::cerr<<"error on local client acception"<<std::endl;
  163. /*dont't close the socket when is below 0*/
  164. }
  165. else{
  166. /*flags control */
  167. std::cerr<<"accepted"<<std::endl;
  168. int flags = fcntl(clnt.sock, F_GETFL, 0);
  169. if(flags < 0){
  170. close(clnt.sock);
  171. std::cerr<<"error on set local client flags"<<std::endl;
  172. }
  173. else if(fcntl(clnt.sock, F_SETFL, flags | O_NONBLOCK) < 0){
  174. std::cerr<<"error on set local client flags"<<std::endl;
  175. close(clnt.sock);
  176. }
  177. clnt.cond = accepted;
  178. ss.set_add(clnt.sock);
  179. ss.clnt.push_back(clnt);
  180. }
  181. }
  182.  
  183. /*when no client online*/
  184. if(ss.clnt.size() == 0) continue;
  185.  
  186. /*client handshake/connect/forward */
  187. bool dele_client = false;
  188. decltype(ss.clnt.begin()) del_client;
  189. auto it_clnt = ss.clnt.begin();
  190. for(int i = 0; i < ss.clnt.size(); i++){
  191. if(ss.is_ready(it_clnt->sock)){
  192. if(!decison_making_for_local_packet(it_clnt, ss)){
  193. dele_client = true;
  194. del_client = it_clnt;
  195. }
  196. }
  197. if(it_clnt != ss.clnt.end()) it_clnt++;
  198. }
  199. if(dele_client){
  200. if(del_client->cond != connected){
  201. close(del_client->sock);
  202. ss.clnt.erase(del_client);
  203. }
  204. else{
  205. std::cerr<<"error 1"<<std::endl;
  206. close(del_client->sock);
  207. close(del_client->remote->sock);
  208. ss.rmt.erase(del_client->remote);
  209. ss.clnt.erase(del_client);
  210. }
  211. }
  212.  
  213. /*remote forward*/
  214. bool dele_remote = false;
  215. decltype(ss.rmt.begin()) del_remote;
  216. auto it_rmt = ss.rmt.begin();
  217. for(int i = 0; i < ss.rmt.size();i++){
  218. if(ss.is_ready(it_rmt->sock)){
  219. if(!remote_forward(it_rmt, ss)){
  220. dele_remote = true;
  221. del_remote = it_rmt;
  222. }
  223. }
  224. if(it_rmt != ss.rmt.end()) it_rmt++;
  225. }
  226. if(dele_remote){
  227. std::cerr<<"error 2"<<std::endl;
  228. close(del_remote->sock);
  229. close(del_remote->local->sock);
  230. ss.clnt.erase(del_remote->local);
  231. ss.rmt.erase(del_remote);
  232. }
  233.  
  234. }
  235. return 0;
  236. }
  237.  
  238. bool decison_making_for_local_packet(std::list<struct client>::iterator it, Server ss){
  239. if(it->cond == accepted) return handshake(it, ss);
  240. else if(it->cond == handshaked) return connect(it, ss);
  241. else if(it->cond == connected) return client_forward(it, ss);
  242. return false;
  243. }
  244.  
  245. bool handshake(std::list<struct client>::iterator it, Server ss){
  246. std::cerr<<"handshake"<<std::endl;
  247. ss.wipe_buffer(10*sizeof(uint8_t));
  248. auto rc = recv(it->sock, ss.buffer, 10*sizeof(uint8_t), NULL);
  249. if(rc < 3) return false;
  250. struct supported_auth auth;
  251. uint8_t *version = reinterpret_cast<uint8_t*>( ss.buffer );
  252. uint8_t *auth_type_length = reinterpret_cast<uint8_t*>(ss.buffer+1);
  253. uint8_t *auth_beginning = reinterpret_cast<uint8_t*>(ss.buffer+2);
  254. if(*version != 0x05) return false;
  255. for(int i = 0; i < static_cast<int>(*auth_type_length); i++){
  256. switch (*(auth_beginning+i)) {
  257. case 0x00:
  258. auth.no_auth = true;
  259. break;
  260. case 0x02:
  261. auth.user_password = true;
  262. default:
  263. break;
  264. }
  265. }
  266. /*more auth support*/
  267. if(auth.no_auth){
  268. uint8_t response[2];
  269. response[0] = 0x05;
  270. response[1] = 0x00;
  271. rc = send(it->sock, response, 2*sizeof(uint8_t), NULL);
  272. if(rc != 2) return false;
  273. else{
  274. it->cond = handshaked;
  275. return true;
  276. }
  277. }
  278. else return false;
  279. }
  280.  
  281. bool client_forward(std::list<struct client>::iterator it, Server ss){
  282. auto rc = recv(it->sock, ss.buffer, MAX_BUFFER,NULL);
  283. if(rc <= 0) return false;
  284. auto sd = send(it->remote->sock, ss.buffer, rc, NULL);
  285. if(sd <= 0) return false;
  286.  
  287. return true;
  288. }
  289.  
  290. bool connect(std::list<struct client>::iterator it, Server ss){
  291. ss.wipe_buffer(50*sizeof(uint8_t));
  292. auto rc = recv(it->sock, ss.buffer, 50*sizeof(uint8_t), NULL);
  293. addrinfo *addr;
  294. if(rc < 10) return false;
  295. if((uint8_t)(*ss.buffer) != 0x05 || (uint8_t)(*(ss.buffer+2)) != 0x00) return false;
  296.  
  297. int flags;
  298. int sock;
  299. struct remote rmt;
  300. ssize_t length;
  301. char *domain_buffer = (char *) operator new(50*sizeof(char));
  302.  
  303. switch (*((uint8_t*)(ss.buffer+3))) {
  304. case 0x01:
  305. //ipv4
  306. getaddrinfo(NULL, NULL, NULL, &addr);
  307. addr->ai_family = AF_INET;
  308. addr->ai_socktype = SOCK_STREAM;
  309. addr->ai_protocol = 0;
  310. memcpy(addr->ai_addr->sa_data, ss.buffer+4, 4*sizeof(uint8_t));
  311. addr->ai_addrlen = 4;
  312. addr->ai_addr->sa_len = 4;
  313. addr->ai_addr->sa_family = AF_INET;
  314. set_port(addr->ai_addr, *((uint16_t*)(ss.buffer+8)));
  315.  
  316. sock = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol);
  317. if(sock < 0){
  318. *(ss.buffer+1) = 0x01;
  319. send(sock, ss.buffer, rc, NULL);
  320.  
  321. return false;
  322. }
  323. flags = fcntl(it->sock, F_GETFL, 0);
  324. if(flags < 0){
  325.  
  326. *(ss.buffer+1) = 0x01;
  327. send(sock, ss.buffer, rc, NULL);
  328. close(sock);
  329. return false;
  330. }
  331. if(fcntl(sock, F_SETFL, flags | O_NONBLOCK) < 0){
  332.  
  333. *(ss.buffer+1) = 0x01;
  334. send(it->sock, ss.buffer, rc, NULL);
  335. close(sock);
  336. return false;
  337. }
  338. freeaddrinfo(addr);
  339.  
  340. *(ss.buffer+1) = 0x00;
  341. send(it->sock, ss.buffer, rc, NULL);
  342. rmt.sock = sock;
  343. rmt.local = it;
  344. ss.rmt.push_back(rmt);
  345. it->cond =connected;
  346.  
  347. return true;
  348.  
  349. break;
  350. case 0x03:
  351. //domain
  352. length = *(ss.buffer+4);
  353. if(length > 50) return false;
  354.  
  355. memcpy(domain_buffer, ss.buffer+5, length);
  356.  
  357. getaddrinfo(domain_buffer, NULL, NULL, &addr);
  358.  
  359. addr->ai_socktype = SOCK_STREAM;
  360. addr->ai_protocol = 0;
  361.  
  362. set_port(addr->ai_addr, *((uint16_t*)(ss.buffer+4+length)));
  363.  
  364. sock = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol);
  365.  
  366. if(sock < 0){
  367. *(ss.buffer+1) = 0x01;
  368. send(sock, ss.buffer, rc, NULL);
  369.  
  370. return false;
  371. }
  372. flags = fcntl(it->sock, F_GETFL, 0);
  373. if(flags < 0){
  374.  
  375. *(ss.buffer+1) = 0x01;
  376. send(sock, ss.buffer, rc, NULL);
  377. close(sock);
  378. return false;
  379. }
  380. if(fcntl(sock, F_SETFL, flags | O_NONBLOCK) < 0){
  381.  
  382. *(ss.buffer+1) = 0x01;
  383. send(it->sock, ss.buffer, rc, NULL);
  384. close(sock);
  385. return false;
  386. }
  387.  
  388. freeaddrinfo(addr);
  389.  
  390. *(ss.buffer+1) = 0x00;
  391. send(it->sock, ss.buffer, rc, NULL);
  392. rmt.sock = sock;
  393. rmt.local = it;
  394. it->cond =connected;
  395. ss.rmt.push_back(rmt);
  396.  
  397. return true;
  398. break;
  399. case 0x04:
  400. //ipv6
  401. getaddrinfo(NULL, NULL, NULL, &addr);
  402.  
  403. addr->ai_family = AF_INET6;
  404. addr->ai_socktype = SOCK_STREAM;
  405. addr->ai_protocol = 0;
  406. memcpy(addr->ai_addr->sa_data, ss.buffer+4, 16*sizeof(uint8_t));
  407. addr->ai_addrlen = 4;
  408. addr->ai_addr->sa_len = 4;
  409. addr->ai_addr->sa_family = AF_INET6;
  410. set_port(addr->ai_addr, *((uint16_t*)(ss.buffer+20)));
  411.  
  412. sock = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol);
  413.  
  414. if(sock < 0){
  415. *(ss.buffer+1) = 0x01;
  416. send(sock, ss.buffer, rc, NULL);
  417.  
  418. return false;
  419. }
  420. flags = fcntl(it->sock, F_GETFL, 0);
  421. if(flags < 0){
  422.  
  423. *(ss.buffer+1) = 0x01;
  424. send(sock, ss.buffer, rc, NULL);
  425. close(sock);
  426. return false;
  427. }
  428. if(fcntl(sock, F_SETFL, flags | O_NONBLOCK) < 0){
  429.  
  430. *(ss.buffer+1) = 0x01;
  431. send(it->sock, ss.buffer, rc, NULL);
  432. close(sock);
  433. return false;
  434. }
  435.  
  436. freeaddrinfo(addr);
  437.  
  438. *(ss.buffer+1) = 0x00;
  439. send(it->sock, ss.buffer, rc, NULL);
  440. rmt.sock = sock;
  441. rmt.local = it;
  442. ss.rmt.push_back(rmt);
  443. it->cond =connected;
  444.  
  445. return true;
  446.  
  447. break;
  448. default:
  449. return false;
  450. break;
  451. }
  452. }
  453.  
  454. bool remote_forward(std::list<struct remote>::iterator it, Server ss){
  455. auto rc = recv(it->sock, ss.buffer, MAX_BUFFER,NULL);
  456. if(rc <= 0) return false;
  457. auto sd = send(it->local->sock, ss.buffer, rc, NULL);
  458. if(sd <= 0) return false;
  459. return true;
  460. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement