I made a simple proxy (Silkroad Security API with some of my code and some of SRProxy API)
what i basically did is I Made a proxy between me and sever and then i passed Packets
What i need help with is whenever i login and choose char i get crash
i have tried many things but never worked here is my code , Hope anybody could tell my why i get this random crash
Oh and i found out that the last packet OPCode was 0x2114
PHP Code:
const byte SRLocal = 18; //18=iSRO,40=rSRO
const int SRVersion = 416;
private static bool mClientConnected;
public static bool ClientConnected
{
get { return mClientConnected; }
}
private static ushort mLocalPort;
private static string mGatewayIP;
private static Client mClientSocket;
private static Server mGatewaySocket;
private static Server mAgentSocket;
private static string agentServerIP;
private static ushort agentServerPort;
private static bool doAgentServerConnect;
private static bool isConnectedToAgentServer;
public static void Start(ushort localPort, string gatewayIP)
{
//Store parameters
mLocalPort = localPort;
mGatewayIP = gatewayIP;
//Create ClientSocket instance and link the Events
mClientSocket = new Client();
mClientSocket.Connected += new Client.ConnectedEventHandler(ClientSocket_Connected);
mClientSocket.Disconnected += new Client.DisconnectedEventHandler(ClientSocket_Disconnected);
mClientSocket.PacketReceived += new Client.PacketReceivedEventHandler(ClientSocket_PacketReceived);
//Listen for Client
mClientSocket.Listen(localPort);
//Create GatewayServer instance and link the Events
mGatewaySocket = new Server();
mGatewaySocket.Connected += new Server.ConnectedEventHandler(GatewaySocket_Connected);
mGatewaySocket.Disconnected += new Server.DisconnectedEventHandler(GatewaySocket_Disconnected);
mGatewaySocket.Kicked += new Server.KickedEventHandler(GatewaySocket_Kicked);
mGatewaySocket.PacketReceived += new Server.PacketReceivedEventHandler(GatewaySocket_PacketReceived);
//Create AgentSocket instance and link the Events
mAgentSocket = new Server();
mAgentSocket.Connected += new Server.ConnectedEventHandler(AgentSocket_Connected);
mAgentSocket.Disconnected += new Server.DisconnectedEventHandler(AgentSocket_Disconnected);
mAgentSocket.Kicked += new Server.KickedEventHandler(AgentSocket_Kicked);
mAgentSocket.PacketReceived += new Server.PacketReceivedEventHandler(AgentSocket_PacketReceived);
}
#region ClientSocket EventHandlers
private static void ClientSocket_PacketReceived(Packet packet)
{
Console.WriteLine("C->P:" + packet.Opcode.ToString("X4") /*+ " Data:" + packet.ToString()*/);
//------>>> SEND TO LOGICAL PACKET HANDLER for ClientPackets
//Bot.PacketHandler.HandleClientPacket(packet);
if (isConnectedToAgentServer)
{
if (packet.Opcode == 0x6100)
{
return;
}
else if (packet.Opcode == 0xB007)
{
Login.HandleCharList(packet);
}
mAgentSocket.Send(packet);
}
else
{
mGatewaySocket.Send(packet);
}
}
private static void ClientSocket_Disconnected()
{
//Secures reconnect for Client
mClientConnected = false;
if (isConnectedToAgentServer)
{
isConnectedToAgentServer = false;
doAgentServerConnect = false;
mAgentSocket.Disconnect();
}
else
{
mGatewaySocket.Disconnect();
}
}
private static void ClientSocket_Connected()
{
//Connects the Proxy to the right Server.
mClientConnected = true;
if (doAgentServerConnect)
{
mAgentSocket.Connect(agentServerIP, agentServerPort);
mGatewaySocket.Disconnect();
}
else
{
mGatewaySocket.Connect(mGatewayIP, 15779);
}
}
#endregion
#region GatewaySocket EventHandlers
/// <summary>
/// Switches the Gatewayserver packets to the Client
/// </summary>
/// <param name="packet"></param>
private static void GatewaySocket_PacketReceived(Packet packet)
{
Console.WriteLine("S->P:" + packet.Opcode.ToString("X4") + " Data:" + packet.ToString());
#region Client/Clientless Support
//Clientless
if (!mClientConnected)
{
//Request Patches
if (packet.Opcode == 0x2001)
{
//Generate the Patchverification
Packet response = new Packet(0x6100, true);
response.WriteByte(SRLocal);
response.WriteAscii("SR_Client"); //ServiceName
response.WriteUInt(SRVersion);
mGatewaySocket.Send(response);
}
//Request the Serverlist.
if (packet.Opcode == 0xA100)
{
byte errorCode = packet.ReadByte();
if (errorCode == 1) //Success
{
Packet response = new Packet(0x6101, true);
mGatewaySocket.Send(response);
}
else
{
Console.WriteLine("There is an update or you are using an invalid silkroad version.");
}
}
//Reconnect to AgentServer on successfull login.
if (packet.Opcode == 0xA102)
{
byte result = packet.ReadByte();
if (result == 1)
{
uint sessionID = packet.ReadUInt();
agentServerIP = packet.ReadAscii();
agentServerPort = packet.ReadUShort();
//doAgentServerConnect = true;
mGatewaySocket.Disconnect();
mAgentSocket.Connect(agentServerIP, agentServerPort);
}
}
}
else //Client
{
//Redirect the Client
if (packet.Opcode == 0xA102)
{
byte result = packet.ReadByte();
if (result == 1)
{
uint sessionID = packet.ReadUInt();
agentServerIP = packet.ReadAscii();
agentServerPort = packet.ReadUShort();
doAgentServerConnect = true;
//Create fake response for Client to redirect to localIP/localPort
Packet response = new Packet(0xA102, true);
response.WriteByte(result);
response.WriteUInt(sessionID);
response.WriteAscii("127.0.0.1");
response.WriteUShort(mLocalPort);
//Override the orginal packet with the fake.
packet = response;
}
}
}
#endregion
//------>>> SEND TO LOGICAL PACKET HANDLER FOR GatewayPackets
//Bot.PacketHandler.HandleGatewayPacket(packet);
mClientSocket.Send(packet);
}
private static void GatewaySocket_Kicked()
{
Console.WriteLine("GatewaySocket_Kicked");
mGatewaySocket.Disconnect();
}
private static void GatewaySocket_Disconnected()
{
Console.WriteLine("GatewaySocket_Disconnected");
}
private static void GatewaySocket_Connected(string ip, ushort port)
{
Console.WriteLine("GatewaySocket connected to " + ip + ":" + port);
}
#endregion
#region AgentSocket EventHandlers
/// <summary>
/// Switches the Agentserver packets to the Client
/// </summary>
/// <param name="packet"></param>
private static void AgentSocket_PacketReceived(Packet packet)
{
Console.WriteLine("S->P:" + packet.Opcode.ToString("X4") /*+ " Data:" + packet.ToString()*/);
mClientSocket.Send(packet);
}
private static void AgentSocket_Kicked()
{
//When logging out.
isConnectedToAgentServer = false;
doAgentServerConnect = false;
mAgentSocket.Disconnect();
}
private static void AgentSocket_Disconnected()
{
Console.WriteLine("AgentSocket_Disconnected");
}
private static void AgentSocket_Connected(string ip, ushort port)
{
isConnectedToAgentServer = true;
Console.WriteLine("AgentSocket connected to " + ip + ":" + port);
}
#endregion
public static void PerformClientless()
{
mClientConnected = false;
mGatewaySocket.Connect("212.24.57.34", 15779);
}
public static void SendToServer(Packet packet)
{
mGatewaySocket.Send(packet);
}






