Du bist nicht angemeldet.

[VB 2010] Server Login

Kevin Hombre

Buddy Ogün Style

  • »Kevin Hombre« ist männlich
  • »Kevin Hombre« ist der Autor dieses Themas

Beiträge: 194

Dabei seit: 17. Dezember 2011

Wohnort: Cologne City

Frühere Benutzernamen: Anoth3rB0y

Hilfreich-Bewertungen: 12

  • Private Nachricht senden

1

Samstag, 28. Januar 2012, 12:27

Server Login

Hallo,

ich möchte mich auf einem Server einloggen.


Jetzt muss ich ja dazu, erst mal den Ipv4 Header vom Paket bilden.


http://de.wikipedia.org/wiki/IP-Header

Da orientiere ich mich momentan.


Die Version muss 4 Bit breit sein.

Wie übertrage ich die?

Wie gebe ich IHL an?


Edit: Ich weiss nicht, wie ich die Daten zum Server bekomme.
In Wireshark wird mir der Login als komplett Hexadezimal angezeigt.

Wie soll ich den mit Vb übertragen?

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »Kevin Hombre« (28. Januar 2012, 18:23)


  • »haiyyu« ist männlich

Beiträge: 2 564

Dabei seit: 16. November 2008

Hilfreich-Bewertungen: 376

  • Private Nachricht senden

2

Samstag, 28. Januar 2012, 14:31

Was fuer ein Protokoll verwendet der Server? TCP, UDP oder was anderes?
Du musst das ganze Paket nicht selber bilden, da gibt's schon eigene Klassen des .NET-Frameworks dafuer.
Bitte keine Fragen bezüglich im Forum behandleten Themen per PN! Auch Bitten zur Beantwortung eines Themas per privater Nachricht wird nicht nachgekommen.

Kevin Hombre

Buddy Ogün Style

  • »Kevin Hombre« ist männlich
  • »Kevin Hombre« ist der Autor dieses Themas

Beiträge: 194

Dabei seit: 17. Dezember 2011

Wohnort: Cologne City

Frühere Benutzernamen: Anoth3rB0y

Hilfreich-Bewertungen: 12

  • Private Nachricht senden

3

Samstag, 28. Januar 2012, 17:14

Der Server verwendet soweit ich sehe TCP. Die Zeichen werden in Hexadezimal versendet.

  • »haiyyu« ist männlich

Beiträge: 2 564

Dabei seit: 16. November 2008

Hilfreich-Bewertungen: 376

  • Private Nachricht senden

4

Samstag, 28. Januar 2012, 17:33

Die Zeichen werden in Hexadezimal versendet.

Die Zeichen werden höchstens hexadezimal dargestellt. Das Senden funktioniert über einzelne Bits, was anderes kennt der Computer nicht.
Für TCP-Sockets gibt's einerseits die Socket-Klasse oder den TcpClient. Beide Klassen befinden sich im System.Net.Sockets-Namespace.
Kleines Beispiel zum Senden von einem String und ein paar Zahlen mittels einem TcpClient:

Visual Basic Quellcode

1
2
3
4
5
6
7
8
Dim Client As New System.Net.TcpClient
Client.Connect("ip", port)
If Client.Connected Then
 Dim Writer As New BinaryWriter(Client.GetStream())
 Writer.Write("Hallo!") ' string
 Writer.Write(DirectCast(123, Byte)) ' byte
 Writer.Write(1337) ' int32
End If
Und am anderen Ende wird das Ganze dann so ausgelesen:

Visual Basic Quellcode

1
2
3
4
5
6
7
Dim Listener As New TcpListener(New IPEndPoint(IPAddress.Any, port))
Listener.Start()
Dim RemoteClient As TcpClient = Listener.AcceptTcpClient()
Dim Reader As New BinaryReader(RemoteClient.GetStream())
Console.WriteLine("{0} {1} {2}", Reader.ReadString() _ ' string
                                 Reader.ReadByte() _ ' byte
                                 Reader.ReadInt32()) ' int32

Am besten siehst du dir zu diesem Thema einige Anleitungen an.
Bitte keine Fragen bezüglich im Forum behandleten Themen per PN! Auch Bitten zur Beantwortung eines Themas per privater Nachricht wird nicht nachgekommen.

Kevin Hombre

Buddy Ogün Style

  • »Kevin Hombre« ist männlich
  • »Kevin Hombre« ist der Autor dieses Themas

Beiträge: 194

Dabei seit: 17. Dezember 2011

Wohnort: Cologne City

Frühere Benutzernamen: Anoth3rB0y

Hilfreich-Bewertungen: 12

  • Private Nachricht senden

5

Samstag, 28. Januar 2012, 18:10

Hey,


also in Wireshark habe ich den Login mal mitgesnifft und in Vb mal versucht nachzubilden.


Visual Basic Quellcode

1
 Dim Login As String = "276e0" & Channel & "0" & Nick & "0" & Pass & "00" & "46"


So wird der erstellt, so wie ich ihn in Wireshark sehe.

So sieht beispielsweise ein Login in Wireshark aus(komplett Hexadezimal):

XML

1
276e004b75736368656c6e004e69636b6e616d650050617373776f72740046




Jetzt bin ich mir halt unsicher ob ich den Header vorher übertragen muss oder nicht?

  • »haiyyu« ist männlich

Beiträge: 2 564

Dabei seit: 16. November 2008

Hilfreich-Bewertungen: 376

  • Private Nachricht senden

6

Samstag, 28. Januar 2012, 18:13

Die Ausgabe in Wireshark ist hexadezimal, weil's einfach am kürzesten ist.
Probier's einfach aus.
Konvertier die Hex-Nummern in Bytes und sende diese.
Bitte keine Fragen bezüglich im Forum behandleten Themen per PN! Auch Bitten zur Beantwortung eines Themas per privater Nachricht wird nicht nachgekommen.

Kevin Hombre

Buddy Ogün Style

  • »Kevin Hombre« ist männlich
  • »Kevin Hombre« ist der Autor dieses Themas

Beiträge: 194

Dabei seit: 17. Dezember 2011

Wohnort: Cologne City

Frühere Benutzernamen: Anoth3rB0y

Hilfreich-Bewertungen: 12

  • Private Nachricht senden

7

Samstag, 28. Januar 2012, 18:21

Konvertier die Hex-Nummern in Bytes und sende diese.
D.h. ich muss den Header gar nicht bilden?

Und wie meinste das mit die Hex Nummern in Bytes konvertieren?
Wie kann ich mir das vorstellen? Nacheinander als einzelne bytes oder wie?


Wenn ich das komplett in den Stream schreibe als String erhalte ich eine Fehlermeldung, wenn ich
die Antwort auslese:
Über das Ende des Streams hinaus kann nicht gelesen werden.

Visual Basic Quellcode

1
Dim Antwort As String = Reader.ReadString

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Kevin Hombre« (28. Januar 2012, 18:26)


  • »haiyyu« ist männlich

Beiträge: 2 564

Dabei seit: 16. November 2008

Hilfreich-Bewertungen: 376

  • Private Nachricht senden

8

Samstag, 28. Januar 2012, 18:27

Ja, Hex ist einfach nur ein Format, um Zahlen darzustellen (Basis 16). Gleich, wie Dezimal eines ist (Basis 10). Und binär (Basis 2).
Zwei Hex-Zahlen (0-9, A-F) repräsentieren ein Byte.
Beispiel:

Visual Basic Quellcode

1
2
3
4
5
6
7
Dim HexString As String = "276e004b75736368656c6e004e69636b6e616d650050617373776f72740046"
Dim ByteList As New List(Of Byte)
For i As Integer = 0 To HexString.Length - 1 Step 2
 ByteList.Add(byte.Parse(HexString.Substring(i, 2), System.Globalization.NumberStyles.HexNumber))
Next
Client.Write(ByteList.ToArray())
Client.Flush()
Bitte keine Fragen bezüglich im Forum behandleten Themen per PN! Auch Bitten zur Beantwortung eines Themas per privater Nachricht wird nicht nachgekommen.

Kevin Hombre

Buddy Ogün Style

  • »Kevin Hombre« ist männlich
  • »Kevin Hombre« ist der Autor dieses Themas

Beiträge: 194

Dabei seit: 17. Dezember 2011

Wohnort: Cologne City

Frühere Benutzernamen: Anoth3rB0y

Hilfreich-Bewertungen: 12

  • Private Nachricht senden

9

Samstag, 28. Januar 2012, 18:40

Danke.
Aber jetzt erhalte ich, wenn ich die Response auslesen will, immernoch die Exception:

Visual Basic Quellcode

1
Über das Ende des Streams hinaus kann nicht gelesen werden.


Visual Basic Quellcode

1
 Dim M As String = Reader.ReadString


Das scheint, als hätte es nicht funktioniert.

Vllt. doch falsch so der Login?

  • »haiyyu« ist männlich

Beiträge: 2 564

Dabei seit: 16. November 2008

Hilfreich-Bewertungen: 376

  • Private Nachricht senden

10

Samstag, 28. Januar 2012, 18:55

Nö, die Response ist einfach kein String.
In deinem Fall werden die ersten 4 Bytes der Response als Integer-Wert genommen, die die Länge des Strings angeben.
Danach wird der String nach dieser Länge ausgelesen.
Wenn nun die Response kein String ist, dann ist das Ergebnis ziemlich undefiniert.

Beispiel zum Einlesen der Antwort in ein Byte-Array:

Visual Basic Quellcode

1
2
3
4
5
Dim ResponseBytes As New List(Of Byte)
While Reader.BaseStream.DataAvailable
 ResponseBytes.Add(Reader.ReadByte())
End While
Dim ResponseArray() As Byte = ResponseBytes.ToArray()
Bitte keine Fragen bezüglich im Forum behandleten Themen per PN! Auch Bitten zur Beantwortung eines Themas per privater Nachricht wird nicht nachgekommen.

Kevin Hombre

Buddy Ogün Style

  • »Kevin Hombre« ist männlich
  • »Kevin Hombre« ist der Autor dieses Themas

Beiträge: 194

Dabei seit: 17. Dezember 2011

Wohnort: Cologne City

Frühere Benutzernamen: Anoth3rB0y

Hilfreich-Bewertungen: 12

  • Private Nachricht senden

11

Samstag, 28. Januar 2012, 19:03

Nö, die Response ist einfach kein String.
In deinem Fall werden die ersten 4 Bytes der Response als Integer-Wert genommen, die die Länge des Strings angeben.
Danach wird der String nach dieser Länge ausgelesen.
Wenn nun die Response kein String ist, dann ist das Ergebnis ziemlich undefiniert.

Hm.
Also ich habe einen Binarywriter und BinaryReader , hoffe das ist korrekt so.


Hab das mal probiert , aber Vb zeigt mir an:

Visual Basic Quellcode

1
"DataAvailable" ist kein Member von "System.IO.Stream". 



Habe dann anstatt

Visual Basic Quellcode

1
While Reader.BaseStream.DataAvailable


mal

Visual Basic Quellcode

1
 While Reader.BaseStream.CanRead

genommen.

Dann erscheint jedoch wieder selbiger Fehler

Visual Basic Quellcode

1
Über das Ende des Streams hinaus kann nicht gelesen werden.


?

  • »haiyyu« ist männlich

Beiträge: 2 564

Dabei seit: 16. November 2008

Hilfreich-Bewertungen: 376

  • Private Nachricht senden

12

Samstag, 28. Januar 2012, 19:04

CanRead gibt nur im Allgemeinen an, ob gelesen werden kann. Nicht, ob was im Stream zu lesen ist.
Stream hat kein Property DataAvailable, stimmt. Dann caste den Stream zuerst.

Visual Basic Quellcode

1
While DirectCast(Reader, NetworkStream).DataAvailable
Bitte keine Fragen bezüglich im Forum behandleten Themen per PN! Auch Bitten zur Beantwortung eines Themas per privater Nachricht wird nicht nachgekommen.

Kevin Hombre

Buddy Ogün Style

  • »Kevin Hombre« ist männlich
  • »Kevin Hombre« ist der Autor dieses Themas

Beiträge: 194

Dabei seit: 17. Dezember 2011

Wohnort: Cologne City

Frühere Benutzernamen: Anoth3rB0y

Hilfreich-Bewertungen: 12

  • Private Nachricht senden

13

Samstag, 28. Januar 2012, 19:11

Okay thx.

Leider ist die .Length vom Byte() immer 0.

Habe auch mal probiert, den Loginstring mit .Write normal zu schreiben, auch immer 0 das Byte().


:(

  • »haiyyu« ist männlich

Beiträge: 2 564

Dabei seit: 16. November 2008

Hilfreich-Bewertungen: 376

  • Private Nachricht senden

14

Samstag, 28. Januar 2012, 19:12

Ersetze das While mit Do While. ;)
Bitte keine Fragen bezüglich im Forum behandleten Themen per PN! Auch Bitten zur Beantwortung eines Themas per privater Nachricht wird nicht nachgekommen.

Kevin Hombre

Buddy Ogün Style

  • »Kevin Hombre« ist männlich
  • »Kevin Hombre« ist der Autor dieses Themas

Beiträge: 194

Dabei seit: 17. Dezember 2011

Wohnort: Cologne City

Frühere Benutzernamen: Anoth3rB0y

Hilfreich-Bewertungen: 12

  • Private Nachricht senden

15

Samstag, 28. Januar 2012, 19:26

Ersetze das While mit Do While.

Visual Basic Quellcode

1
2
3
 	Do While DirectCast(Reader.BaseStream, NetworkStream).DataAvailable
        	Responze.Add(Reader.ReadByte())
    	Loop


So?

Immernoch 0 die .length vom Byte()

  • »haiyyu« ist männlich

Beiträge: 2 564

Dabei seit: 16. November 2008

Hilfreich-Bewertungen: 376

  • Private Nachricht senden

16

Samstag, 28. Januar 2012, 19:41

Ja, kleiner Fehler meinerseits.

Visual Basic Quellcode

1
2
3
Do
 Response.Add(Reader.ReadByte()) ' man schreibt's Response ;)
Loop While DirectCast(Reader.BaseStream, NetworkStream).DataAvailable
Bitte keine Fragen bezüglich im Forum behandleten Themen per PN! Auch Bitten zur Beantwortung eines Themas per privater Nachricht wird nicht nachgekommen.

Kevin Hombre

Buddy Ogün Style

  • »Kevin Hombre« ist männlich
  • »Kevin Hombre« ist der Autor dieses Themas

Beiträge: 194

Dabei seit: 17. Dezember 2011

Wohnort: Cologne City

Frühere Benutzernamen: Anoth3rB0y

Hilfreich-Bewertungen: 12

  • Private Nachricht senden

17

Samstag, 28. Januar 2012, 19:53

Ja, kleiner Fehler meinerseits.

Do
Response.Add(Reader.ReadByte()) ' man schreibt's Response ;)
Loop While DirectCast(Reader.BaseStream, NetworkStream).DataAvailable
Okay.
Sieht jetzt so aus:

Visual Basic Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
   	Dim Login As String = "276e0" & Channel & "0" & Nick & "0" & Pass & "00" & "46"

    	Dim ByteList As New List(Of Byte)
    	For i As Integer = 0 To Login.Length - 1 Step 2
        	ByteList.Add(Byte.Parse(Login.Substring(i, 2), System.Globalization.NumberStyles.HexNumber))
    	Next
    	Writer.Write(ByteList.ToArray())
    	Writer.Flush()

    	Dim Response As New List(Of Byte)
    	Do
        	Response.Add(Reader.ReadByte())
    	Loop While DirectCast(Reader.BaseStream, NetworkStream).DataAvailable
    	Dim ResponseArray() As Byte = Response.ToArray()
    	Console.WriteLine(ResponseArray.Length)


In

Visual Basic Quellcode

1
Response.Add(Reader.ReadByte())
wiedermal der nun mehr als bekannte Fehler:

Visual Basic Quellcode

1
Über das Ende des Streams hinaus kann nicht gelesen werden.

  • »haiyyu« ist männlich

Beiträge: 2 564

Dabei seit: 16. November 2008

Hilfreich-Bewertungen: 376

  • Private Nachricht senden

18

Samstag, 28. Januar 2012, 19:53

Ich weiß nicht, wieso das passiert.
Bei mir wird immer gewartet, bis etwas da ist, wenn nichts da ist.
Bitte keine Fragen bezüglich im Forum behandleten Themen per PN! Auch Bitten zur Beantwortung eines Themas per privater Nachricht wird nicht nachgekommen.

Kevin Hombre

Buddy Ogün Style

  • »Kevin Hombre« ist männlich
  • »Kevin Hombre« ist der Autor dieses Themas

Beiträge: 194

Dabei seit: 17. Dezember 2011

Wohnort: Cologne City

Frühere Benutzernamen: Anoth3rB0y

Hilfreich-Bewertungen: 12

  • Private Nachricht senden

19

Samstag, 28. Januar 2012, 20:09

Hm mist.

  • »haiyyu« ist männlich

Beiträge: 2 564

Dabei seit: 16. November 2008

Hilfreich-Bewertungen: 376

  • Private Nachricht senden

20

Samstag, 28. Januar 2012, 20:12

Zeig uns am besten mal deinen kompletten Code, damit wir sehen können, ob die Ursache des Fehlers vielleicht woanders liegt.
Bitte keine Fragen bezüglich im Forum behandleten Themen per PN! Auch Bitten zur Beantwortung eines Themas per privater Nachricht wird nicht nachgekommen.

Social Bookmarks