yurij
Lt. Commander
- Registriert
- Jan. 2008
- Beiträge
- 1.055
Brauchte für ein Browsergame hack einen Proxyserver, irgendwie nichts passendes im Netz gefunden. Die funktionieren entweder nicht oder sind zu komplex. Alle haben gemeinsam, dass sie versuchen den Datenstream zu entschlüsseln und zu verarbeiten.
Bin also mit eigener socket-basierten Lösung gekommen:
Das ist wahrscheinlich der einfachste HTTP Proxy Server der Welt, funktioniert aber dennoch mit allen HTTP Streams. Genau genommen versuche ich den Stream nicht zu entschlüsseln, sondern leite es augenblicklich weiter. Der Proxy funktioniert wie der primitivste Stream-Switch.
Es werden Sockets verwendet - aus sicht der HTTP Anwendung die einfachste mögliche Schicht. Proxy-Switch verwendet Multithreading und Socket-Wiederverwendung.
Programmiert als Windows-Forms Anwendung mit Visual Studio 2010 C#
Im Anhand nur der Proxy-Grundgerüst.
Als nächstes will ich bestimmte GET requests im Proxy/Switch abfangen und statt den angeforderten Flash-Dateien, eigene modifizierte zustellen (Spoofing).
Zudem ist das Browsergame viel zu langsam, wahrscheinlich würde ich HTML BODY Quality="High" in Quality="Low" umschreiben. All das funktionierte schon, habe zwei andere Proxy-Server Varianten programmiert, diese aber wegen diversen Problemen verworfen. Dieser hier ist so einfach und zuverlässig, dass ich mich entschloss es zu veröffentlichen. Vielleicht wird's jemand brauchen.
http://home.arcor.de/yurij/exProxy.zip
das ist die Hauptprozedur des Switches:
Bin also mit eigener socket-basierten Lösung gekommen:
Das ist wahrscheinlich der einfachste HTTP Proxy Server der Welt, funktioniert aber dennoch mit allen HTTP Streams. Genau genommen versuche ich den Stream nicht zu entschlüsseln, sondern leite es augenblicklich weiter. Der Proxy funktioniert wie der primitivste Stream-Switch.
Es werden Sockets verwendet - aus sicht der HTTP Anwendung die einfachste mögliche Schicht. Proxy-Switch verwendet Multithreading und Socket-Wiederverwendung.
Programmiert als Windows-Forms Anwendung mit Visual Studio 2010 C#
Im Anhand nur der Proxy-Grundgerüst.
Als nächstes will ich bestimmte GET requests im Proxy/Switch abfangen und statt den angeforderten Flash-Dateien, eigene modifizierte zustellen (Spoofing).
Zudem ist das Browsergame viel zu langsam, wahrscheinlich würde ich HTML BODY Quality="High" in Quality="Low" umschreiben. All das funktionierte schon, habe zwei andere Proxy-Server Varianten programmiert, diese aber wegen diversen Problemen verworfen. Dieser hier ist so einfach und zuverlässig, dass ich mich entschloss es zu veröffentlichen. Vielleicht wird's jemand brauchen.
http://home.arcor.de/yurij/exProxy.zip
das ist die Hauptprozedur des Switches:
Code:
public void SocketProcessor(object SocketObject)
{
ThreadDelta(1);
// ex("Socket communication processing ...");
Socket ClientSocket = (Socket)SocketObject;
String ServerHost = null;
Socket ServerSocket = new Socket(ClientSocket.AddressFamily, ClientSocket.SocketType, ClientSocket.ProtocolType);
byte[] SendBuffer = new byte[8 * 1024];
int SendSize = 0;
byte[] ReceiveBuffer = new byte[8 * 1024];
int ReceiveSize = 0;
// CROSS-SOCKET TRAFFIC EXCHANGE
try
{
while (true) {
if (!ClientSocket.Connected) break;
// PROCESS CLIENT REQUEST STREAM
if (ClientSocket.Available > 0)
{
SendSize = ClientSocket.Receive(SendBuffer);
// TRY TO GET HOST
String Method = Encoding.ASCII.GetString(SendBuffer, 0, 3);
if (Method == "GET") {
String RequestString = Encoding.ASCII.GetString(SendBuffer);
int P1 = RequestString.IndexOf(' ') + 1;
int P2 = RequestString.IndexOf(' ', P1);
String URL = RequestString.Substring(P1, P2 - P1);
Uri URI = new System.Uri(URL);
String NewHost = URI.Host;
ex("Request: " + URL);
// (RE)CONNECT TO SERVER
if (NewHost != ServerHost)
{
if (ServerSocket.Connected) ServerSocket.Close();
ServerSocket = new Socket(ClientSocket.AddressFamily, ClientSocket.SocketType, ClientSocket.ProtocolType);
ServerHost = NewHost;
ServerSocket.Connect(ServerHost, 80);
ex("Connected to " + ServerHost);
}
}
if (ServerSocket.Connected) {
if (SendSize > 0)
ServerSocket.Send(SendBuffer, SendSize, SocketFlags.None);
}
}
// REDIRECT REPLY FROM SERVER TO HOST
if (ServerSocket.Connected)
{
if (ServerSocket.Available > 0)
{
ReceiveSize = ServerSocket.Receive(ReceiveBuffer);
if (ReceiveSize > 0)
ClientSocket.Send(ReceiveBuffer, ReceiveSize, SocketFlags.None);
}
}
else break;
if (ClientSocket.Available == 0 && ServerSocket.Available == 0)
Thread.Sleep(100);
}
}
catch (Exception e)
{
ex("EXCEPTION: " + e.Message);
}
if (ServerSocket.Connected) ServerSocket.Close();
if (ClientSocket.Connected) ClientSocket.Close();
ThreadDelta(-1);
}