Ich bin ja hobbyzocker und spiel gerne ET. Nun hab ich mir aus Langeweile ein Programm geschrieben, dass analysiert was ET zum Server sendet und was der Server wieder zurück sendet. Nun hab ich das Programm soweit programmiert, dass es Server und Client auf macht und Packete in einer Datei speichert und weiter sendet. Mein Problem ist, dass ich in der Konsole ein Buchstaben wirwar bekomme o_O Der Buchstabenchaos ist meistens dann, wenn ich Ausgebe, dass der Server was gesendet hat. (kann aber auch nicht überprüfen ob das, was der Server bekommt auch das richtige Packet ist, vielleicht hat er auch so ein Zeugs bekommen o_O.) ich zeig euch am bessten mal den Code:
Code: Alles auswählen
;{ Konstanten
#app_version = "0.0.1"
Enumeration
#fil_LogFile
EndEnumeration
;}
;{ Variablen
Global My_Host.s
Global My_Port.s
Global Server_Host.s
Global Server_Port.s
Global Used.l
;}
;{ Declare
Declare CPrint(pText.s)
Declare.s ACharToOEM(Text.s)
Declare UDPServer(Wert.l)
Declare UDPClient(Wert.l)
Declare BuildClient()
Declare CommandParsing()
;}
;{ Sockets
Global ETServer.UDPConnect
Global ETClient.UDPConnect
Global ETOrginal.UDPUserID
;}
;{ Threads
Global ServerThrd.l
Global ClientThrd.l
;}
If OpenConsole() <> 0
ConsoleCursor(10)
CPrint("^O -=^L Packet Analyse ^O=- ^J[" + #app_version + "]\\")
CPrint("^O------------------------\")
CPrint("^O-- ^Llade Programmbasis ^O--\")
CPrint("^O------------------------\")
CPrint("^OParse Argumente ab...")
CommandParsing()
CPrint("^JOK\")
CPrint("^OLade UDP Netzwerk....")
If UDPInitNetwork() <> 0
CPrint("^JOK\")
Else
CPrint("^LERROR\")
EndIf
CPrint("^OLade TCP Netzwerk....")
If InitNetwork() <> 0
CPrint("^JOK\")
Else
CPrint("^LERROR\")
EndIf
My_Host = IPString(UDPGetLocalIP())
If My_Port = ""
My_Port = "27965"
EndIf
CPrint("^OLokaler PC: ^J" + UCase(Hostname()) + " ^N(" + My_Host + ")\")
CPrint("^OÖffne Logfile...")
If CreateFile(#fil_LogFile, "C:\packets.txt") <> 0
CPrint("^JOK\")
Else
CPrint("^LERROR\")
EndIf
CPrint("\")
CPrint("^O---------------------\")
CPrint("^O-- ^Llade ServerFake ^O--\")
CPrint("^O---------------------\")
CPrint("^OBaue ^LServer^O auf...\")
If Server_Host = ""
CPrint("^OBitte geben Sie die ECHTEN ^LServer^Odaten an.\")
CPrint("^LServer:")
Server.s = Input(): CPrint("\")
Server_Host = Trim(StringField(Server, 1, ":"))
Server_Port = Trim(StringField(Server, 2, ":"))
EndIf
CPrint("^OServerFake zu diesen ^LDaten^O konfiguriert: \")
CPrint(" ^OHost: ^N" + Server_Host + "\")
CPrint(" ^OPort: ^N" + Server_Port + "\")
CPrint("^OÖffne Server...")
If UDPCreateServer(Val(My_Port), ETServer)
CPrint("^JOK ^N(" + My_Port + ")\")
CPrint("^OUDPEventThread: ^N" + Str(UDPStartCaptureEvents(ETServer)) + "\")
Else
CPrint("^LERROR\")
EndIf
CPrint("^OStarte ^LUDP ^OStack...")
ServerThrd = CreateThread(@UDPServer(), 0)
If ServerThrd <> 0
CPrint ("^JOK ^N(" + Str(ServerThrd) + ")\")
Else
CPrint("^LERROR\")
EndIf
CPrint("\^O -=^l Packet Analyse ^O=- ^J ist nun ^LAKTIV^O!\")
Input()
;Repeat: Delay(10): Until Inkey() <> ""
CPrint("^O---------------------\")
CPrint("^O-- ^LShutdown System ^O--\")
CPrint("^O---------------------\")
UDPEndCaptureEvents(ETServer)
UDPCloseServer(ETServer)
If ServerThrd <> 0
KillThread(ServerThrd)
EndIf
If ClientThrd <> 0
KillThread(ClientThrd)
EndIf
ClearConsole()
CloseConsole()
End
EndIf
Procedure UDPServer(Wert.l)
; Verarbeitet Packete die vom Client kommen
DefType.l *ServerBuffer
DefType.l BytesGet
DefType.s Packet
*ServerBuffer = AllocateMemory(1025)
PokeS(*ServerBuffer, Space(1024))
Debug "ServerThread gestartet..."
Debug "ServerBuffer: " + Str(*ServerBuffer) + " (" + Str(MemoryStringLength(*ServerBuffer)) + ")"
Repeat
BytesGet = UDPWaitUntilReceive(ETServer, *ServerBuffer, 1024)
If BytesGet > 0
Debug "ClientPacket: " + Str(BytesGet) + " " + PeekS(*ServerBuffer, BytesGet)
WriteStringN(FormatDate("%hh:%ii:%ss", Date()) + ">:" + PeekS(*ServerBuffer, BytesGet))
CPrint("^J>^OPacket vom Client...")
Packet = PeekS(*ServerBuffer, BytesGet)
Select Packet
Case "ÿÿÿÿgetchallenge"
CPrint("^nCONNECTION REQUEST\")
If Used = 0
CPrint("^OSpeichere ClientID...")
UDPSaveUserID(ETOrginal, ETServer)
CPrint("^JOK\")
BuildClient()
EndIf
Case "ping"
CPrint("^nPING\")
BuildClient()
Default
CPrint("^nUNBRAUCHBAR\")
EndSelect
UDPSend(ETClient, *ServerBuffer, 1024)
PokeS(*ServerBuffer, " " + Chr(0))
EndIf
ForEver
EndProcedure
Procedure UDPClient(Wert.l)
; Verarbeitet Packete die vom Server kommen
DefType.l *ClientBuffer
DefType.l BytesGetClient
DefType.s PacketForClient
Debug "ClientThread gestartet..."
*ClientBuffer = AllocateMemory(5125): PokeS(*ClientBuffer, Space(5120))
Debug "ClientBuffer: " + Str(*ClientBuffer) + " (" + Str(MemoryStringLength(*ClientBuffer)) + ")"
Repeat
BytesGetClient = UDPWaitUntilReceive(ETClient, *ClientBuffer, 5120)
If BytesGetClient => 0
Debug "ServerPacket: " + Str(BytesGetClient) + " " + PeekS(*ClientBuffer)
CPrint("^J<^OPacket vom Server...")
WriteStringN(FormatDate("%hh:%ii:%ss", Date()) + "<:" + PeekS(*ClientBuffer, BytesGetClient))
PacketForClient = PeekS(*ClientBuffer, BytesGetClient)
CPrint("^nUNBRAUCHBAR\")
UDPLoadUserID(ETOrginal, ETServer)
UDPSend(ETServer, *ClientBuffer, BytesGetClient)
PokeS(*ClientBuffer, Space(BytesGetClient))
EndIf
Delay(500)
ForEver
EndProcedure
Procedure BuildClient()
CPrint("^OBaue Client auf...")
If ClientThrd = 0
If UDPConnectServer(Val(Server_Port), Server_Host, ETClient) <> 0
CPrint("^JOK\")
CPrint("^OUDPEventThread: ^N" + Str(UDPStartCaptureEvents(ETClient)) + "\")
CPrint("^OBaue UDPClient Thread auf...")
ClientThrd = CreateThread(@UDPClient(), 0)
If ClientThrd <> 0
CPrint ("^JOK ^N(" + Str(ClientThrd) + ")\")
Else
CPrint("^LERROR\")
EndIf
CPrint("^OClient zu ^L" + Server_Host + "(" + Server_Port + ")^O verbunden !\")
CPrint("^OBreit zum Packetfluss !\")
Used = 1
Else
CPrint("^LERROR\")
EndIf
Else
CPrint("^LERROR\")
EndIf
EndProcedure
Procedure CommandParsing()
DefType.s Befehl, Parameter, Param
Repeat
Param = ProgramParameter()
Befehl = StringField(Param, 1, "=")
Parameter = StringField(Param, 2, "=")
Select LCase(Befehl)
Case "/server"
Server_Host = Trim(StringField(Parameter, 1, ":"))
Server_Port = Trim(StringField(Parameter, 2, ":"))
Case "/port"
My_Port = Trim(Parameter)
EndSelect
Until Param = ""
EndProcedure
Procedure CPrint(pText.s)
DefType.l I
DefType.s Color
For I = 1 To Len(pText)
If Mid(pText, I, 1) = "^"
Color = UCase(Mid(pText, I + 1, 1))
Color = ReplaceString(Color, "A", "1") ; 1 Blau
Color = ReplaceString(Color, "B", "2") ; 2 Grün
Color = ReplaceString(Color, "C", "3") ; 3 Türkis
Color = ReplaceString(Color, "D", "4") ; 4 Rot
Color = ReplaceString(Color, "E", "5") ; 5 Magenta
Color = ReplaceString(Color, "F", "6") ; 6 Braun
Color = ReplaceString(Color, "G", "7") ; 7 Hellgrau (Std.)
Color = ReplaceString(Color, "H", "8") ; 8 Dunkelgrau
Color = ReplaceString(Color, "I", "9") ; 9 Hellblau
Color = ReplaceString(Color, "J", "10") ; 10 Hellgrün
Color = ReplaceString(Color, "K", "11") ; 11 Cyan
Color = ReplaceString(Color, "L", "12") ; 12 Hellrot
Color = ReplaceString(Color, "M", "13") ; 13 Helles Magenta
Color = ReplaceString(Color, "N", "14") ; 14 Gelb
Color = ReplaceString(Color, "O", "15") ; 15 Weiß
ConsoleColor(Val(Color), 0)
I = I + 1
ElseIf Mid(pText, I, 1) = "\"
PrintN("")
Else
Print(ACharToOEM(Mid(pText, I, 1)))
EndIf
Delay(1)
Next
ConsoleColor(7, 0)
EndProcedure
Procedure.s ACharToOEM(Text.s)
DefType.l FunkCTO
OpenLibrary(0, "user32.dll")
*FunkCTO = IsFunction(0, "CharToOemA")
CallFunctionFast(*FunkCTO, Text, Text)
CloseLibrary(0)
ProcedureReturn Text
EndProcedure