Eigenen HTTP-Proxy-Server programmieren
Hallo
ich hab mal wieder ein Problem.
Ich würde gerne meinen eigenen Proxy-Server programmieren, u.a. weil ich rausfinden möchte, über welche IP der Nintendo DS die Internetkonnektivität prüft. Zudem hätt ich gern die IP vom Nintendo DS eShop und die, von der er sich dir Firmware holt.
Ich hab bisher die Seite http://www.vbarchiv.net/workshop/details.php?id=57&reload=1 gefunden, da das aber nicht Visual Basic 2010 ist, musste ich den Code etwas umschreiben (Handles hinzufügen und einige Stellen an denen die Signaturen nicht übereinstimmten).
Dabei kam das folgende raus:
EDIT
Hab den Quellcode ausgetauscht
Teilweise von http://www.daniweb.com/software-development/vbnet/threads/347706/custom ...
Ich und mein C&P ...
GET http://conntest.nintendowifi.net/ HTTP/1.1
Host: conntest.nintendowifi.net
Ich dachte ja eher, er pingt einen Server an, das war ja aber nicht der fall, auch wenn das hier auch nicht sehr viel anders ist...
Gerade eben hab ich noch was rausgefunden, wenn ich den Shop öffne, komme ich auf
Jetzt gibts aber das Problem, dass er keine URLs unterstützt, die keine Dateinamen enthalten...
Jetzt mein Problem: anscheinend sendet mein Computer - mein Proxy - gar nichts an den DS zurück??!!
Hab jetzt schon einige Zeit Fehler gesucht aber ich komme einfach nicht drauf..
Auf eure Antworten und Hilfe würd ich mich freuen
EDIT
Ich schaffs nicht ohne professionelle Hilfe, hab gerade nochmal rumprobiert...
Aicher
ich hab mal wieder ein Problem.
Ich würde gerne meinen eigenen Proxy-Server programmieren, u.a. weil ich rausfinden möchte, über welche IP der Nintendo DS die Internetkonnektivität prüft. Zudem hätt ich gern die IP vom Nintendo DS eShop und die, von der er sich dir Firmware holt.
Ich hab bisher die Seite http://www.vbarchiv.net/workshop/details.php?id=57&reload=1 gefunden, da das aber nicht Visual Basic 2010 ist, musste ich den Code etwas umschreiben (Handles hinzufügen und einige Stellen an denen die Signaturen nicht übereinstimmten).
Dabei kam das folgende raus:
EDIT
Hab den Quellcode ausgetauscht
Teilweise von http://www.daniweb.com/software-development/vbnet/threads/347706/custom ...
Ich und mein C&P ...
Imports System
Imports System.Text
Imports System.IO
Imports System.Net
Imports System.Net.Sockets
Imports System.Threading
Namespace WebProxy2
Class WebProxy2
Private clientSocket As Socket
Private read() As [Byte] = New Byte(1024) {}
Private Buffer As [Byte]() = Nothing
Private ASCII As Encoding = Encoding.ASCII
Private HTTP_VERSION As String = "HTTP/1.0"
Private CRLF As String = ControlChars.Cr + ControlChars.Lf
Private RecvBytes(4096) As [Byte]
Public Sub New(ByVal socket As Socket)
Me.clientSocket = socket
End Sub
Public Sub run()
Dim clientmessage As [String] = " "
Dim sURL As [String] = " "
Dim bytes As Integer = readmessage(read, clientSocket, clientmessage)
If bytes = 0 Then
Return
End If
Dim index1 As Integer = clientmessage.IndexOf(" "c)
Dim index2 As Integer = clientmessage.IndexOf(" "c, index1 + 1)
If index1 = -1 Or index2 = -1 Then
Throw New IOException
End If
Console.WriteLine("Connecting to Site: {0}", clientmessage.Substring(index1 + 1, index2 - index1))
Console.WriteLine("Connection from {0}", clientSocket.RemoteEndPoint)
Dim part1 As String = clientmessage.Substring(index1 + 1, index2 - index1)
Dim index3 As Integer = part1.IndexOf("/"c, index1 + 8)
Dim index4 As Integer = part1.IndexOf(" "c, index1 + 8)
Dim index5 As Integer = index4 - index3
sURL = part1.Substring(index1 + 4, part1.Length - index5 - 8)
Try
Dim IPHost As IPHostEntry = Dns.Resolve(sURL)
Console.WriteLine("Request resolved: ", IPHost.HostName)
Dim aliases As String() = IPHost.Aliases
Dim address As IPAddress() = IPHost.AddressList
Console.WriteLine(address(0))
Dim sEndpoint As New IPEndPoint(address(0), 80)
Dim IPsocket As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
IPsocket.Connect(sEndpoint)
If IPsocket.Connected Then
Console.WriteLine("Socket connect OK")
End If
Dim [GET] As String = clientmessage
Dim ByteGet As [Byte]() = ASCII.GetBytes([GET])
IPsocket.Send(ByteGet, ByteGet.Length, 0)
Dim rBytes As Int32 = IPsocket.Receive(RecvBytes, RecvBytes.Length, 0)
Console.WriteLine("Recieved {0}", +rBytes)
'Buffer = RecvBytes;
Dim strRetPage As [String] = Nothing
strRetPage = strRetPage + ASCII.GetString(RecvBytes, 0, rBytes)
While rBytes > 0
rBytes = IPsocket.Receive(RecvBytes, RecvBytes.Length, 0)
strRetPage = strRetPage + ASCII.GetString(RecvBytes, 0, rBytes)
End While
IPsocket.Shutdown(SocketShutdown.Both)
IPsocket.Close()
sendmessage(clientSocket, strRetPage)
Catch exc2 As Exception
Console.WriteLine(exc2.ToString())
End Try
End Sub
Private Function readmessage(ByVal ByteArray() As Byte, ByRef s As Socket, ByRef clientmessage As [String]) As Integer
Dim bytes As Integer = s.Receive(ByteArray, 1024, 0)
Dim messagefromclient As String = Encoding.ASCII.GetString(ByteArray)
clientmessage = CType(messagefromclient, [String])
Return bytes
End Function
Private Sub sendmessage(ByVal s As Socket, ByVal message As String)
Buffer = New [Byte](message.Length + 1) {}
Dim length As Integer = ASCII.GetBytes(message, 0, message.Length, Buffer, 0)
s.Send(Buffer, length, 0)
End Sub
Public Overloads Shared Sub Main()
Main(System.Environment.GetCommandLineArgs())
End Sub
Overloads Shared Sub Main(ByVal args() As String)
Const port As Integer = 8889
Dim tcplistener As New TcpListener(port)
Console.WriteLine("Listening on port {0}", +port)
tcplistener.Start()
While True
Dim socket As Socket = tcplistener.AcceptSocket()
Dim webproxy As New WebProxy2(socket)
Dim thread As New Thread(New ThreadStart(AddressOf webproxy.run))
thread.Start()
End While
End Sub 'Main
End Class 'WebProxy2
End Namespace 'WebProxy2
Class WebProxy
Private clientSocket As Socket
Private read() As [Byte] = New Byte(1023) {}
Private Buffer As [Byte]() = Nothing
Private ASCII As Text.Encoding = System.Text.Encoding.ASCII
Private Const HTTP_VERSION As String = "HTTP/1.0"
Private Const CRLF As String = vbCr + vbLf
Private RecvBytes(4095) As [Byte]
Const port As Integer = 8088
Shared Sub Main(ByVal args() As String)
Dim tcplistener As New TcpListener(port)
tcplistener.Start()
Console.WriteLine("Listening on port {0}", +port)
'WriteToLog("log.txt", "Listening on port " & port)
While True
Dim socket As Socket = tcplistener.AcceptSocket()
Dim webproxy As New WebProxy(socket)
Dim thread As New Thread(New ThreadStart(AddressOf webproxy.run))
thread.Start()
End While
End Sub
Public Sub New(ByVal socket As Socket)
Me.clientSocket = socket
End Sub
Public Sub run()
Dim clientmessage As String = " "
Dim sURL As String = " "
Dim bytes As Integer = readmessage(read, clientSocket, clientmessage)
If bytes = 0 Then
Return
End If
Dim index1 As Integer = clientmessage.IndexOf(" "c)
Dim index2 As Integer = clientmessage.IndexOf(" "c, index1 + 1)
If index1 = -1 OrElse index2 = -1 Then
Throw New IOException()
End If
Console.WriteLine("Connecting to Site: {0}", clientmessage.Substring(index1 + 1, index2 - index1))
Console.WriteLine("Connection from {0}", clientSocket.RemoteEndPoint)
'WriteToLog("log.txt", DirectCast("Connecting to Site: {0}" & clientmessage.Substring(index1 + 1, index2 - index1), String))
'WriteToLog("log.txt", "Connection from : {0}")
Dim part1 As String = clientmessage.Substring(index1 + 1, index2 - index1) 'Könnte die Datei sein, ist keine Datei angegeben /
Dim index3 As Integer = part1.IndexOf("/"c, index1 + 8)
Dim index4 As Integer = part1.IndexOf(" "c, index1 + 8)
Dim index5 As Integer = index4 - index3
sURL = part1.Substring(index1 + 4, part1.Length - index5 - 8)
Try
Dim IPHost As IPHostEntry = Dns.Resolve(sURL)
Console.WriteLine("Request resolved: ", IPHost.HostName)
'WriteToLog("log.txt", "Request resolved: " & IPHost.HostName.ToString)
Dim aliases As String() = IPHost.Aliases
Dim address As IPAddress() = IPHost.AddressList
Console.WriteLine(address(0))
'WriteToLog("log.txt", address(0).ToString)
Dim sEndpoint As New IPEndPoint(address(0), 80)
Dim IPsocket As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
IPsocket.Connect(sEndpoint)
If IPsocket.Connected Then
Console.WriteLine("Socket connect OK")
'WriteToLog("log.txt", "Socket connect OK")
End If
Dim [GET] As String = clientmessage
Dim ByteGet As [Byte]() = ASCII.GetBytes([GET])
IPsocket.Send(ByteGet, ByteGet.Length, 0)
Dim rBytes As Int32 = IPsocket.Receive(RecvBytes, RecvBytes.Length, 0)
Console.WriteLine("Recieved {0}", +rBytes)
'WriteToLog("log.txt", "Recieved {0}" & CStr(+rBytes))
'Buffer = RecvBytes; 'War schon ausgeklammert
Dim strRetPage As String = Nothing
strRetPage = strRetPage + ASCII.GetString(RecvBytes, 0, rBytes)
While rBytes > 0
rBytes = IPsocket.Receive(RecvBytes, RecvBytes.Length, 0)
strRetPage = strRetPage + ASCII.GetString(RecvBytes, 0, rBytes) '****THIS SHOULD RETURN THE PAGE IF IM NOT MISTAKEN*********
End While
IPsocket.Shutdown(SocketShutdown.Both)
IPsocket.Close()
sendmessage(clientSocket, strRetPage) 'Then we actualy send it...?
Catch exc2 As Exception
Console.WriteLine(exc2.ToString())
'WriteToLog("log.txt", exc2.ToString)
End Try
End Sub
Private Function readmessage(ByVal ByteArray() As Byte, ByRef s As Socket, ByRef clientmessage As String) As Integer
Dim bytes As Integer = s.Receive(ByteArray, 1024, 0)
Dim messagefromclient As String = System.Text.Encoding.ASCII.GetString(ByteArray)
clientmessage = CStr(messagefromclient)
Return bytes
End Function
Private Sub sendmessage(ByVal s As Socket, ByVal message As String)
Buffer = New [Byte](message.Length + 1) {}
Dim length As Integer = ASCII.GetBytes(message, 0, message.Length, Buffer, 0)
s.Send(Buffer, length, 0)
End Sub
End Class
GET http://conntest.nintendowifi.net/ HTTP/1.1
Host: conntest.nintendowifi.net
Ich dachte ja eher, er pingt einen Server an, das war ja aber nicht der fall, auch wenn das hier auch nicht sehr viel anders ist...
Gerade eben hab ich noch was rausgefunden, wenn ich den Shop öffne, komme ich auf
CONNECT tss.t.shop.nintendowifi.net:443 HTTP/1.0
User-Agent: Opera/9.50 (Nintendo; Opera/154; U; Nintendo DS; en)
Host: tss.t.shop.nintendowifi.net:443
Jetzt mein Problem: anscheinend sendet mein Computer - mein Proxy - gar nichts an den DS zurück??!!
Hab jetzt schon einige Zeit Fehler gesucht aber ich komme einfach nicht drauf..
Auf eure Antworten und Hilfe würd ich mich freuen
EDIT
Ich schaffs nicht ohne professionelle Hilfe, hab gerade nochmal rumprobiert...
Aicher
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 234558
Url: https://administrator.de/forum/eigenen-http-proxy-server-programmieren-234558.html
Ausgedruckt am: 02.04.2025 um 18:04 Uhr
33 Kommentare
Neuester Kommentar
Moin,
wär's nicht einfacher einen Squid auf deiner Windows Kiste (oder in einer Linux VM) zu installieren? Das ganze setzt natürlich vorraus das auch HTTP/HTTPS als Protokol verwendet wird, sobald FTP oder was eigenes von Nintendo ins eingesetzt wird, bist du mit dem Proxy eh ausgeschieden.
Was für einen Router hast du? Evtl. kann der direkt den Traffic mitscheiden o.Ä.?
lg,
Slainte
wär's nicht einfacher einen Squid auf deiner Windows Kiste (oder in einer Linux VM) zu installieren? Das ganze setzt natürlich vorraus das auch HTTP/HTTPS als Protokol verwendet wird, sobald FTP oder was eigenes von Nintendo ins eingesetzt wird, bist du mit dem Proxy eh ausgeschieden.
Was für einen Router hast du? Evtl. kann der direkt den Traffic mitscheiden o.Ä.?
lg,
Slainte
Zitat von @colinardo:
Warum der Aufwand, wenn du das ganze mit einem billigen Hub und Wireshark genauso einfach erledigen kannst ?
Nutzt nichts wenn der NDS direkt mit dem WLAN Router kommuniziert. Warum der Aufwand, wenn du das ganze mit einem billigen Hub und Wireshark genauso einfach erledigen kannst ?
Zitat von @SlainteMhath:
> Warum der Aufwand, wenn du das ganze mit einem billigen Hub und Wireshark genauso einfach erledigen kannst ?
Nutzt nichts wenn der NDS direkt mit dem WLAN Router kommuniziert.
mit ARP-Poisoning ginge das alternativ schon ... > Warum der Aufwand, wenn du das ganze mit einem billigen Hub und Wireshark genauso einfach erledigen kannst ?
Nutzt nichts wenn der NDS direkt mit dem WLAN Router kommuniziert.
Zitat von @Aicher1998:
Weil ich es gerne selber programmieren möchte bzw. Quelltext haben möchte und nicht irgendwas runterladen....
Weil ich es gerne selber programmieren möchte bzw. Quelltext haben möchte und nicht irgendwas runterladen....
Den squid-Source bekommt man hier.
lks
YMMD 
(Mit dem Protokoll solltest Du dich schon ein bischen auseinandersetzen... quelle: http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol )
Ja es wird http verwendet, was ich aber nciht verstehe, ist, wieso die Anfrage nicht mit "GET" oder "POST" beginnt, sondern mit "CONNECT"
Deswegen:CONNECT
Converts the request connection to a transparent TCP/IP tunnel, usually to facilitate SSL-encrypted communication (HTTPS) through an unencrypted HTTP
proxy.[14][15] See HTTP CONNECT Tunneling.
Converts the request connection to a transparent TCP/IP tunnel, usually to facilitate SSL-encrypted communication (HTTPS) through an unencrypted HTTP
proxy.[14][15] See HTTP CONNECT Tunneling.
(Mit dem Protokoll solltest Du dich schon ein bischen auseinandersetzen... quelle: http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol )
Zitat von @Aicher1998:
Wireshark geht nur, wenn ich entweder 2 WLAN-Karten hätte oder über LAN im Inet wär
nö geht auch mit ARP Poison Routing (Man-In-The-Middle) siehe mein Kommentar oben, aber dann wirst du vermutlich noch den SSL-Traffic dechiffrieren müssen wenn das Teil alles über SSL kommuniziert.Wireshark geht nur, wenn ich entweder 2 WLAN-Karten hätte oder über LAN im Inet wär
Unter Windows z.B. mit CAIN / unter Linux mit ETTERCAP, gibts genug Anleitungen im Netz, mehr dürfen wir hier nicht darüber erzählen 
Zitat von @Aicher1998:
Zitat von @colinardo:
noch denZitat von @Aicher1998:
Wireshark geht nur, wenn ich entweder 2 WLAN-Karten hätte oder über LAN im Inet wär
nö geht auch mit ARP Poison Routing (Man-In-The-Middle) siehe mein Kommentar oben, aber dann wirst du vermutlichWireshark geht nur, wenn ich entweder 2 WLAN-Karten hätte oder über LAN im Inet wär
SSL-Traffic dechiffrieren müssen wenn das Teil alles über SSL kommuniziert.
und wie mach ich des?z.B. Einen (nicht angeforderten) ARP-Respone mit den falschen Daten an das Zielgerät schicken.
Ansonsten gibt es genügend tools dafür, die ich hier aber wegen der Forenregeln nciht aufzählen werde. Die lassen sich relativ einfach durch google finden.
lks
Dein Code kennt nur "GET" und "POST" - der DS verwendet das "CONNECT" Kommando. Also musst du CONNECT entsprechend implementieren. Aber vorkauen wird dir das hier jetzt sicher keiner, sorry.
Wie Slainte schon sagte, ein Proxy muß das ganze Protokoll beherrschen und nicht nur einen Teil davon. du kannst ja mal in den Sourceode von Squid schauen, wie die das gelöst haben.
lks
Das kommt vom Copy n' Paste Syndrom ...einfach STRG+C auf der Tastatur sperren und alles wird gut.
Wenn etwas nicht so läuft wie vorgesehen muss man dem halt auf den Grund gehen, da helfen einem dann Codesnippets auch nicht weiter, Lesen kommt vor dem verstehen...das können wir dir hier nicht abnehmen, außer du bezahlst uns dafür dir hier einen kompletten Proxy abzuliefern ...
Wenn etwas nicht so läuft wie vorgesehen muss man dem halt auf den Grund gehen, da helfen einem dann Codesnippets auch nicht weiter, Lesen kommt vor dem verstehen...das können wir dir hier nicht abnehmen, außer du bezahlst uns dafür dir hier einen kompletten Proxy abzuliefern ...
Zitat von @Aicher1998:
Hab jetzt den AnonProxy installiert, der funktioniert, aber ich kann die Daten trzotzdem noch ned abfangen
Hab jetzt den AnonProxy installiert, der funktioniert, aber ich kann die Daten trzotzdem noch ned abfangen
wireshark anwerfen und alle Daten von um zum proxy abschnorcheln.
lks
Zitat von @Aicher1998:
Hab jetzt Cain&Abel installiert... Kann aber noch nicht sagen obs auch am DS klappt, wenigstens weiß ich dass mein
Bruder gerade Google offen hat...
Hab jetzt Cain&Abel installiert... Kann aber noch nicht sagen obs auch am DS klappt, wenigstens weiß ich dass mein
Bruder gerade Google offen hat...
Weiß er, daß Du das weißt? Wenn nicht machst Du Dich ggf. strafbar. Wenn Du M onitoring und Sniffing-Tools benutzt, mußt Du alle, die davon betroffen sind informieren. Ansonsten kann das strqafrechtliceh Konsequenzen haben.
lks