WS-Proxy.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. /*
  2. * Proxy Bridge
  3. * Copyright PANCHO7532 - P7COMUnications LLC (c) 2021
  4. * Dedicated to Emanuel Miranda, for giving me the idea to make this :v
  5. */
  6. const net = require('net');
  7. const stream = require('stream');
  8. const util = require('util');
  9. var dhost = "127.0.0.1";
  10. var dport = "8080";
  11. var mainPort = "8888";
  12. var outputFile = "outputFile.txt";
  13. var packetsToSkip = 0;
  14. var gcwarn = true;
  15. for(c = 0; c < process.argv.length; c++) {
  16. switch(process.argv[c]) {
  17. case "-skip":
  18. packetsToSkip = process.argv[c + 1];
  19. break;
  20. case "-dhost":
  21. dhost = process.argv[c + 1];
  22. break;
  23. case "-dport":
  24. dport = process.argv[c + 1];
  25. break;
  26. case "-mport":
  27. mainPort = process.argv[c + 1];
  28. break;
  29. case "-o":
  30. outputFile = process.argv[c + 1];
  31. break;
  32. }
  33. }
  34. function gcollector() {
  35. if(!global.gc && gcwarn) {
  36. console.log("[WARNING] - Garbage Collector isn't enabled! Memory leaks may occur.");
  37. gcwarn = false;
  38. return;
  39. } else if(global.gc) {
  40. global.gc();
  41. return;
  42. } else {
  43. return;
  44. }
  45. }
  46. function parseRemoteAddr(raddr) {
  47. if(raddr.toString().indexOf("ffff") != -1) {
  48. //is IPV4 address
  49. return raddr.substring(7, raddr.length);
  50. } else {
  51. return raddr;
  52. }
  53. }
  54. setInterval(gcollector, 1000);
  55. const server = net.createServer();
  56. server.on('connection', function(socket) {
  57. var packetCount = 0;
  58. //var handshakeMade = false;
  59. socket.write("HTTP/1.1 101 Switching Protocols\r\nContent-Length: 1048576000000\r\n\r\n");
  60. console.log("[INFO] - Connection received from " + socket.remoteAddress + ":" + socket.remotePort);
  61. var conn = net.createConnection({host: dhost, port: dport});
  62. socket.on('data', function(data) {
  63. //pipe sucks
  64. if(packetCount < packetsToSkip) {
  65. //console.log("---c1");
  66. packetCount++;
  67. } else if(packetCount == packetsToSkip) {
  68. //console.log("---c2");
  69. conn.write(data);
  70. }
  71. if(packetCount > packetsToSkip) {
  72. //console.log("---c3");
  73. packetCount = packetsToSkip;
  74. }
  75. //conn.write(data);
  76. });
  77. conn.on('data', function(data) {
  78. //pipe sucks x2
  79. socket.write(data);
  80. });
  81. socket.once('data', function(data) {
  82. /*
  83. * Nota para mas tarde, resolver que diferencia hay entre .on y .once
  84. */
  85. });
  86. socket.on('error', function(error) {
  87. console.log("[SOCKET] - read " + error + " from " + socket.remoteAddress + ":" + socket.remotePort);
  88. conn.destroy();
  89. });
  90. conn.on('error', function(error) {
  91. console.log("[REMOTE] - read " + error);
  92. socket.destroy();
  93. });
  94. socket.on('close', function() {
  95. console.log("[INFO] - Connection terminated for " + socket.remoteAddress + ":" + socket.remotePort);
  96. conn.destroy();
  97. });
  98. });
  99. server.listen(mainPort, function(){
  100. console.log("[INFO] - Server started on port: " + mainPort);
  101. console.log("[INFO] - Redirecting requests to: " + dhost + " at port " + dport);
  102. });