-
Notifications
You must be signed in to change notification settings - Fork 0
/
Program.cs
63 lines (52 loc) · 2.11 KB
/
Program.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
using System;
using System.IO;
using System.Net;
using System.Text;
namespace FEProxy {
class Program {
static Proxy loginProxy, worldProxy;
static ProxyListener loginProxyListener, worldProxyListener;
static string remoteHost;
static ushort loginPort, worldPort, remotePort;
static void LoginServerPacketReceived( object _, PacketEventArgs packetEventArgs ) {
if( packetEventArgs.PacketType == 0x49 ) {
int offset = 4;
while( packetEventArgs.PacketData[offset++] != 0 );
string loopBack = IPAddress.Loopback.ToString();
string worldRemoteHost = Encoding.ASCII.GetString( packetEventArgs.PacketData, 4, offset - 5 );
ushort worldRemotePort = (ushort)BitConverter.ToUInt32( packetEventArgs.PacketData, offset );
offset += 4;
worldProxyListener = new ProxyListener( worldPort, worldRemoteHost, worldRemotePort );
worldProxyListener.ProxyAccepted += ( __, proxyEventArgs ) => {
worldProxy = proxyEventArgs.Proxy;
worldProxy.Process();
};
worldProxyListener.Process( true );
using( MemoryStream stream = new MemoryStream() ) {
stream.Write( packetEventArgs.PacketData, 0, 4 );
stream.Write( Encoding.ASCII.GetBytes( loopBack ), 0, Encoding.ASCII.GetByteCount( loopBack ) );
stream.WriteByte( 0 );
stream.Write( BitConverter.GetBytes( (uint)worldPort ), 0, 4 );
stream.Write( packetEventArgs.PacketData, offset, packetEventArgs.PacketLength - offset );
byte[] buffer = new byte[stream.Length];
Array.Copy( stream.GetBuffer(), buffer, buffer.Length );
packetEventArgs.SetPacketData( buffer );
}
}
}
static void Main( string[] args ) {
loginPort = UInt16.Parse( args[0] );
worldPort = UInt16.Parse( args[1] );
remoteHost = args[2];
remotePort = UInt16.Parse( args[3] );
loginProxyListener = new ProxyListener( loginPort, remoteHost, remotePort );
loginProxyListener.ProxyAccepted += ( _, proxyEventArgs ) => {
loginProxy = proxyEventArgs.Proxy;
loginProxy.ServerPacketReceived += LoginServerPacketReceived;
loginProxy.Process();
};
loginProxyListener.Process( true );
Console.ReadLine();
}
}
}