Jump to content

Good example of TCPServer with basic security


Recommended Posts

Hello this is my first started thread, I guess  :bye:

I coded this TCPServer script with the help from this topics

>Fast multi-client TCP Server

>Multiple connection TCP server

Ohh GOD wrong section.. my bad..

mod, please transfer this to Example section..

#include <ListViewConstants.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <EditConstants.au3>
#include <TabConstants.au3>
#include <GuiListView.au3>
#include <GUIListBox.au3>
#include <GuiMenu.au3>
#include <String.au3>
#include <Array.au3>
#include <Crypt.au3>
#include <File.au3>

TCPStartup() ;Start the TCP function
Opt("TCPTimeout", 0) ;We will make our own timeout
Opt("GUIOnEventMode", 1)
_Crypt_Startup() ;To optimized crypt function
OnAutoItExitRegister("Close") ;Call Close() function when script exit

#Region ;***User Setting***
Global $ServerBindToHost = IniRead("PXGWS.ini", "Server", "IP", "0.0.0.0") ;The IP will be used for TCP connections
Global $ServerBindToPort = IniRead("PXGWS.ini", "NetLib", "Port", 15998) ;The Port will be used for TCP connections
Global $PacketHeaderKey = BinaryToString("0x" & IniRead("PXGWS.ini", "Server", "HeaderXor", "FD2AC72E")) ;This is the packet header identifier
Global $PacketSecretKey = BinaryToString("0x" & IniRead("PXGWS.ini", "Server", "PacketXor", "B8E9ACD5")) ;This is the packet data encryption/decryption key
Global $PacketMaxSize = IniRead("PXGWS.ini", "NetLib", "MaxBufferSize", 2048) ;The packet data size to handle
Global $MaxClients = IniRead("PXGWS.ini", "NetLib", "MaxUserNum", 999) ;Total of connections to handle
Global $MaxTimeout = IniRead("PXGWS.ini", "NetLib", "ConnectTimeout", 65000) ;Maximum timeout of each connections
Global $XTrapDir = IniRead("PXGWS.ini", "Server", "XTrapDir", "XTrap") ;XTrap folder
Global $TimeFormat = IniRead("PXGWS.ini", "Server", "TimeFormat", 24) ;Time Format
Global $CabalMain = IniRead("PXGWS.ini", "Generator", "CabalMain", "CabalMain.exe")
Global $Parameter = IniRead("PXGWS.ini", "Generator", "Parameter", "husky")
Global $PXLibHost = IniRead("PXGWS.ini", "Generator", "PXLibHost", "127.0.0.1")
Global $CheckList = IniRead("PXGWS.ini", "Generator", "CheckList", "CabalOnline.ini")
#EndRegion ;***User Setting***

#Region ;***Data Identifiers
Global $REQ_DATA_SR = 100 ;Session request
Global $REQ_DATA_HB = 101 ;Heartbeart request
Global $REQ_DATA_XH = 102 ;XTrap Hash request
Global $CS2_DATA_XH = 103 ;XTrap Hash data
Global $S2C_DATA_ST = 200 ;Server Stopped
Global $S2C_DATA_SR = 201 ;Server Restarted
Global $S2C_DATA_SS = 202 ;Server Shutdown
Global $S2C_DATA_KC = 203 ;Terminate selected client connection
Global $S2C_DATA_KA = 204 ;Terminate all client connections
Global $C2S_DATA_DA = 300 ;Detected Application
Global $C2S_DATA_LO = 400 ;Client Logout
#EndRegion ;***Data Identifiers

#Region ;***Ignore if you don't know what you are doing***
Global $Listen = -1 ;The handle of TCPListen
Global $Client[1][20] ;[index][Socket,IP,Time,Data,List]
Global $Ws2_32 = DllOpen("Ws2_32.dll") ;Ws2_32.dll open handle
Global $NTDLL = DllOpen("ntdll.dll") ;ntdll.dll open handle
Global $Kernel32 = DllOpen("Kernel32.dll") ;kernel32.dll open handle
Global $InitialTime, $PacketCache, $UserBanList
Global $tmpList = FileRead("cl.tmp")
#EndRegion ;***Ignore if you don't know what you are doing***

#Region ### START Koda GUI section ### Form=C:\Program Files (x86)\AutoIt3\SciTE\Koda\Forms\Form2.kxf
Global $MAINGUI = GUICreate("PX2000 Game Watcher Server", 834, 384, 190, 113)
Global $LOGS = GUICtrlCreateList("", 8, 280, 817, 97, BitOR($LBS_NOTIFY, $LBS_NOINTEGRALHEIGHT, $LBS_NODATA, $WS_VSCROLL, $WS_BORDER), 0)
Global $TAB = GUICtrlCreateTab(8, 8, 817, 267, $TCS_FLATBUTTONS)
Global $TAB1 = GUICtrlCreateTabItem("Monitor")
Global $LIST = GUICtrlCreateListView("#|IP Address|Computer Name|Game Account|Status|LastUpdate", 19, 40, 649, 225)
Global $Group1 = GUICtrlCreateGroup("Server ", 676, 35, 137, 49, BitOR($GUI_SS_DEFAULT_GROUP, $BS_CENTER))
Global $SVRSTART = GUICtrlCreateButton("Start", 684, 51, 57, 25, $BS_FLAT)
Global $SVRSTOP = GUICtrlCreateButton("Stop", 748, 51, 57, 25, $BS_FLAT)
Global $Group2 = GUICtrlCreateGroup(" Control ", 677, 88, 137, 49, BitOR($GUI_SS_DEFAULT_GROUP, $BS_CENTER))
Global $KICKONE = GUICtrlCreateButton("Kick One", 685, 104, 57, 25, $BS_FLAT)
Global $KICKALL = GUICtrlCreateButton("Kick All", 749, 104, 57, 25, $BS_FLAT)
Global $Group3 = GUICtrlCreateGroup(" Setting ", 677, 142, 137, 124, BitOR($GUI_SS_DEFAULT_GROUP, $BS_CENTER))
Global $IP = GUICtrlCreateInput($ServerBindToHost, 688, 160, 113, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER))
Global $PORT = GUICtrlCreateInput($ServerBindToPort, 688, 184, 56, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER))
Global $MAXCLIENT = GUICtrlCreateInput($MaxClients, 747, 184, 54, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER))
Global $MAXBUFFER = GUICtrlCreateInput($PacketMaxSize, 688, 208, 56, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER))
Global $TIMEOUT = GUICtrlCreateInput($MaxTimeout, 747, 208, 54, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER))
Global $SVRRELOAD = GUICtrlCreateButton("Apply and Restart", 688, 232, 113, 25, $BS_FLAT)
Global $TabSheet2 = GUICtrlCreateTabItem("Generator")
Global $Group4 = GUICtrlCreateGroup(" Param Generator ", 16, 34, 799, 231)
Global $Label1 = GUICtrlCreateLabel("CabalMain:", 24, 59, 57, 17)
Global $Input1 = GUICtrlCreateInput($CabalMain, 88, 56, 113, 21)
GUICtrlSetTip(-1, "Your CabalMain.exe")
Global $Label2 = GUICtrlCreateLabel("Parameter:", 208, 59, 55, 17)
Global $Input2 = GUICtrlCreateInput($Parameter, 272, 56, 113, 21)
GUICtrlSetTip(-1, "You CabalMain parameter")
Global $Label3 = GUICtrlCreateLabel("Server IP:", 24, 83, 51, 17)
Global $Input3 = GUICtrlCreateInput($ServerBindToHost, 88, 80, 113, 21)
GUICtrlSetTip(-1, "PXGW Server IP")
Global $Label4 = GUICtrlCreateLabel("Server Port:", 208, 83, 56, 17)
Global $Input4 = GUICtrlCreateInput($ServerBindToPort, 272, 80, 113, 21)
GUICtrlSetTip(-1, "PXGW Server Port")
Global $Label5 = GUICtrlCreateLabel("Check List:", 392, 83, 57, 17)
Global $Input5 = GUICtrlCreateInput($CheckList, 456, 80, 113, 21)
GUICtrlSetTip(-1, "List of trainers")
Global $Label6 = GUICtrlCreateLabel("URL: http://", 392, 59, 63, 17)
Global $Input6 = GUICtrlCreateInput($PXLibHost, 456, 56, 113, 21)
GUICtrlSetTip(-1, "URL to download PXLib32.dll and PXLib64.dll")
Global $Edit1 = GUICtrlCreateEdit("", 24, 104, 361, 153, BitOR($ES_AUTOVSCROLL, $ES_READONLY, $ES_WANTRETURN, $WS_VSCROLL))
GUICtrlSetData(-1, "Your PXGWC parameter will show here.")
Global $Button6 = GUICtrlCreateButton("Generate Parameter and Check List", 576, 80, 233, 20, $BS_FLAT)
Global $Label7 = GUICtrlCreateLabel("/PXLib32.dll and PXLib64.dll", 574, 59, 139, 17)
Global $Edit2 = GUICtrlCreateEdit("", 392, 104, 417, 153, BitOR($ES_AUTOVSCROLL, $ES_WANTRETURN, $WS_VSCROLL))
GUICtrlSetData(-1, $tmpList)
GUICtrlSetFont(-1, 9, 400, 0, "Lucida Console")
GUICtrlSetTip(-1, "#MD5 Hashes of application you want PXGWC to detect it.")
GUICtrlSetLimit($IP, 15)
GUICtrlSetTip($IP, "Server IP Address")
GUICtrlSetLimit($PORT, 5)
GUICtrlSetTip($PORT, "Server Port Address")
GUICtrlSetLimit($MAXCLIENT, 3)
GUICtrlSetTip($MAXCLIENT, "Maximum client connections")
GUICtrlSetLimit($MAXBUFFER, 4)
GUICtrlSetTip($MAXBUFFER, "Max buffer to accept")
GUICtrlSetLimit($TIMEOUT, 5)
GUICtrlSetTip($TIMEOUT, "Maximum connection timeout")
GUICtrlSendMsg($LIST, $LVM_SETCOLUMNWIDTH, 0, 35)
GUICtrlSendMsg($LIST, $LVM_SETCOLUMNWIDTH, 1, 100)
GUICtrlSendMsg($LIST, $LVM_SETCOLUMNWIDTH, 2, 120)
GUICtrlSendMsg($LIST, $LVM_SETCOLUMNWIDTH, 3, 110)
GUICtrlSendMsg($LIST, $LVM_SETCOLUMNWIDTH, 4, 175)
GUICtrlSendMsg($LIST, $LVM_SETCOLUMNWIDTH, 5, 105)
GUICtrlSendMsg($LOGS, $LVM_SETCOLUMNWIDTH, 0, 150)
GUICtrlSendMsg($LOGS, $LVM_SETCOLUMNWIDTH, 1, 663)
GUISetOnEvent($GUI_EVENT_CLOSE, "Close")
GUICtrlSetOnEvent($SVRSTART, "_ServerListenStart")
GUICtrlSetOnEvent($SVRSTOP, "_ServerListenStop")
GUICtrlSetOnEvent($KICKONE, "_ConnectionKill")
GUICtrlSetOnEvent($KICKALL, "_ConnectionKillAll")
GUICtrlSetOnEvent($SVRRELOAD, "_ServerReload")
GUICtrlSetOnEvent($Button6, "_Generate")
GUICtrlSetState($SVRSTOP, $GUI_DISABLE)
GUICtrlSetState($KICKONE, $GUI_DISABLE)
GUICtrlSetState($KICKALL, $GUI_DISABLE)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

CheckSetting()
_Main()

Func _Main()
    $Client[0][0] = 0
    AddLogView($LOGS, "PX2000 XTrap Auth Server", 0)
    AddLogView($LOGS, "Build Version " & StringTrimLeft(FileGetVersion(@AutoItExe), 4), 0)
    While 1
        _CheckNewConnections()
        _CheckNewPackets()
        _CheckBadConnection()
        NSleep(1000, $NTDLL)
    WEnd
EndFunc   ;==>_Main

Func _CheckNewConnections()
    Local $iSock = TCPAccept($Listen)
    If $iSock = -1 Then Return
    Local $iSize = UBound($Client, 1)
    If $iSize - 1 > $MaxClients And $MaxClients > 0 Then
        TCPCloseSocket($iSock)
        Return
    EndIf
    ReDim $Client[$iSize + 1][20]
    $Client[0][0] = $iSize
    $Client[$iSize][0] = $iSock
    $Client[$iSize][1] = SocketIP($iSock, $Ws2_32)
    $Client[$iSize][2] = TimerInit()
    $Client[$iSize][3] = "" ; Packet buffer
    $Client[$iSize][4] = "" ; Connection error buffer
    $Client[$iSize][5] = "" ; Identifier buffer
    $Client[$iSize][6] = "" ; Heartbeat count buffer
    $Client[$iSize][7] = "" ; Computer/Username buffer
    $Client[$iSize][8] = "" ; Unused buffer
    $Client[$iSize][9] = "" ; Unused buffer
    $Client[$iSize][10] = "" ; Unused buffer
    $Client[$iSize][11] = "" ; Unused buffer
    $Client[$iSize][12] = "" ; Unused buffer
    $Client[$iSize][13] = "" ; Unused buffer
    $Client[$iSize][14] = "" ; Unused buffer
    $Client[$iSize][15] = "" ; Unused buffer
    $Client[$iSize][16] = "" ; Unused buffer
    $Client[$iSize][17] = "" ; Unused buffer
    $Client[$iSize][18] = "" ; Unused buffer
    $Client[$iSize][19] = GUICtrlCreateListViewItem($iSize & "|" & $Client[$iSize][1] & "||N/A||" & $InitialTime, $LIST)
EndFunc   ;==>_CheckNewConnections

Func _CheckBadConnection()
    If $Client[0][0] < 1 Then Return
    Local $iNewSize = 0
    For $i = 1 To $Client[0][0]
        If $Client[$i][4] <> 1 Or Round(TimerDiff($Client[$i][2])) > $MaxTimeout Then
            TCPCloseSocket($Client[$i][0])
            GUICtrlDelete($Client[$i][19])
            $Client[$i][0] = ""
            $Client[$i][4] = ""
            $Client[$i][5] = ""
            $Client[$i][6] = ""
            $Client[$i][7] = ""
            $Client[$i][8] = ""
            $Client[$i][9] = ""
            $Client[$i][11] = ""
            $Client[$i][12] = ""
            $Client[$i][13] = ""
            $Client[$i][14] = ""
            $Client[$i][15] = ""
            $Client[$i][16] = ""
            $Client[$i][17] = ""
            $Client[$i][18] = ""
            ContinueLoop
        Else
            $iNewSize += 1
        EndIf
    Next
    If $iNewSize < $Client[0][0] Then
        Local $iSize = UBound($Client, 2) - 1
        Local $aTemp[$iNewSize + 1][$iSize + 1]
        Local $iCount = 1
        For $i = 1 To $Client[0][0]
            If $Client[$i][0] = "" Then ContinueLoop
            For $j = 0 To $iSize
                $aTemp[$iCount][$j] = $Client[$i][$j]
            Next
            $iCount += 1
        Next
        $aTemp[0][0] = $iNewSize
        $Client = $aTemp
        For $i = 1 To $Client[0][0]
            GUICtrlSetData($Client[$i][19], $i)
        Next
    EndIf
EndFunc   ;==>_CheckBadConnection

Func _CheckNewPackets()
    If $Client[0][0] < 1 Then Return ;No connections then return to _Main()
    Local $RecvPacket
    For $i = 1 To $Client[0][0]
        $RecvPacket = TCPRecv($Client[$i][0], $PacketMaxSize, 1) ; Attempt to receive data
        If $RecvPacket <> "" Then
            If CheckHeader($RecvPacket) = 0 Then
                AddLogView($LOGS, "Unknown Client from IP [" & $Client[$i][1] & "]")
                $Client[$i][4] = -1 ; The packet don't have the spicified packet header, let's set this as invalid one
                Return
            Else
                $Client[$i][3] &= $RecvPacket ; Add it to the packet buffer.
                ConsoleWrite(">> New Packet from " & SocketIP($Client[$i][0]) & @CRLF & "+> " & $RecvPacket & @CRLF & @CRLF) ; Let us know we got a packet in scite.
            EndIf
            Local $RawPackets = $Client[$i][3] ; Transfer all the data we have to a new variable.
            Local $StripHeader = StripHeader($RawPackets) ; Removing the packet header
            Local $DecryptData = PacketDec($StripHeader, $PacketSecretKey) ; Decrypting the data
            If $DecryptData <> "" Then
                Local $Calculator = Dec(StringMid($DecryptData, 1, 8))
                Local $PacketHash = StringMid($DecryptData, 9, $Calculator) ; Retrieving the packet hash
                Local $RequestType = Dec(StringMid($DecryptData, 9 + $Calculator, 8)) ; Retrieving the request type
                Local $RequestData = _HexToString(StringTrimLeft($DecryptData, 16 + $Calculator)) ; Retrieving the packet data
                $Client[$i][5] = $PacketHash ; Packet hash to avoid duplicated packet or packet resend
                $Client[$i][3] = StringTrimLeft($Client[$i][3], StringLen($RecvPacket)) ;We are done extracting the packet let's now empty the buffer
                ConsoleWrite(">> Full packet found!" & @CRLF)
                ConsoleWrite("+> Unpacked: " & $DecryptData & @CRLF)
                ConsoleWrite("+> Hash: " & $Client[$i][5] & @CRLF)
                ConsoleWrite("+> Type: " & $RequestType & @CRLF)
                ConsoleWrite("+> Data: " & $RequestData & @CRLF)
                ConsoleWrite("+> LeftOver: " & $Client[$i][3] & @CRLF)
                If StringInStr($PacketCache, $Client[$i][5]) <> 0 Then
                    AddLogView($LOGS, "Received duplicated packet from User IP [" & $Client[$i][1] & "]. This is malicious action!")
                    $Client[$i][4] = -1
                    ConsoleWrite(@CRLF)
                    Return
                Else
                    ConsoleWrite("+> PacketCache Current Size: " & StringLen($PacketCache) & @CRLF & @CRLF)
                    If StringLen($PacketCache) > 2048 Then $PacketCache = ""
                    $PacketCache &= $Client[$i][5] & @CRLF
                    _ProcessFullPacket($RequestData, $RequestType, $i)
                EndIf
            Else
                $Client[$i][4] = -1
            EndIf
        EndIf
    Next
EndFunc   ;==>_CheckNewPackets

Func _ProcessFullPacket($PacketData, $PacketType, $sID)
    Local $i = $sID
    Switch $PacketType
        Case $REQ_DATA_SR
            $Client[$i][4] = 1
            $Client[$i][7] = $PacketData
            GUICtrlSetData($Client[$i][19], "||" & $Client[$i][7] & "||Connection Established")
            AddLogView($LOGS, "Established connection from IP [" & $Client[$i][1] & "]")
        Case $REQ_DATA_HB
            Local $BeatCount = 1
            $Client[$i][2] = TimerInit()
            $Client[$i][6] += $BeatCount
            GUICtrlSetData($Client[$i][19], "||" & $Client[$i][7] & "||Heartbeat Count " & $Client[$i][6] & "|" & Hour($PacketData, $TimeFormat))
            AddLogView($LOGS, "Heartbeat is okey from IP [" & $Client[$i][1] & "]", 0)
        Case $REQ_DATA_XH
            If $PacketData <> XTrapHash() Then
                Local $Data = PacketEnc(Hex($CS2_DATA_XH) & _StringToHex(XTrapHash()))
                Local $Packet = $PacketHeaderKey & $Data
                TCPSend($Client[$i][0], BinaryToString($Packet))
                GUICtrlSetData($Client[$i][19], "||||XTrap Check Error")
                AddLogView($LOGS, "Client " & $Client[$i][7] & " has different XTrap version from the server")
                $Client[$i][4] = -1
            EndIf
        Case $C2S_DATA_DA
            AddLogView($LOGS, $PacketData & " is detected from client " & $Client[$i][7])
            $Client[$i][4] = -1
        Case $C2S_DATA_LO
            GUICtrlSetData($Client[$i][19], "||||User Logout|" & Hour($PacketData, $TimeFormat))
    EndSwitch
EndFunc   ;==>_ProcessFullPacket

Func Close()
    If $Client[0][0] >= 1 Then
        For $i = 1 To $Client[0][0]
            Sleep($Client[0][0] - $i)
            Local $Data = PacketEnc(Hex($S2C_DATA_SS) & _StringToHex("Server has been shutdown."))
            Local $Packet = $PacketHeaderKey & $Data
            TCPSend($Client[$i][0], BinaryToString($Packet))
            TCPCloseSocket($Client[$i][0])
        Next
    EndIf
    DllClose($Ws2_32)
    DllClose($NTDLL)
    DllClose($Kernel32)
    TCPShutdown()
    _Crypt_Shutdown()
    $PacketCache = ""
    Exit
EndFunc   ;==>Close

Func SocketIP($Sock, $hDLL = "Ws2_32.dll")
    Local $structName = DllStructCreate("short;ushort;uint;char[8]")
    Local $sRet = DllCall($hDLL, "int", "getpeername", "int", $Sock, "ptr", DllStructGetPtr($structName), "int*", DllStructGetSize($structName))
    If Not @error Then
        $sRet = DllCall($hDLL, "str", "inet_ntoa", "int", DllStructGetData($structName, 3))
        If Not @error Then Return $sRet[0]
    EndIf
    Return "0.0.0.0"
EndFunc   ;==>SocketIP

Func NSleep($nSleep, $hDLL = "ntdll.dll")
    Local $hStruct = DllStructCreate("int64")
    DllStructSetData($hStruct, 1, -1 * ($nSleep * 10))
    DllCall($hDLL, "dword", "ZwDelayExecution", "int", 0, "ptr", DllStructGetPtr($hStruct))
EndFunc   ;==>NSleep

Func PacketEnc($EncData, $EncKey = $PacketSecretKey)
    Local $EncOut0 = MD5Data(Random(11111111, 99999999, 1))
    Local $EncOut1 = Random(111111, 999999, 1) & Hex(StringLen($EncOut0)) & $EncOut0
    Local $EncOut2 = _Crypt_EncryptData($EncOut1 & $EncData, $EncKey, $CALG_AES_256)
    Return BinaryToString($EncOut2)
EndFunc   ;==>PacketEnc

Func PacketDec($DecData, $DecKey = $PacketSecretKey)
    Local $DecOut1 = _Crypt_DecryptData($DecData, $DecKey, $CALG_AES_256)
    Local $DecOut2 = BinaryToString($DecOut1)
    Return StringTrimLeft($DecOut2, 6)
EndFunc   ;==>PacketDec

Func CheckHeader($RawPacketData)
    Local $CheckHeader1 = StringTrimLeft($RawPacketData, 2)
    Local $CheckHeader2 = StringLen(StringTrimLeft(StringToBinary($PacketHeaderKey), 2))
    Local $CheckHeader3 = StringMid($CheckHeader1, 1, $CheckHeader2)
    Local $CheckHeader4 = StringTrimLeft(StringToBinary($PacketHeaderKey), 2)
    If $CheckHeader3 = $CheckHeader4 Then Return 1
EndFunc   ;==>CheckHeader

Func StripHeader($RawPacketData)
    Local $StripHeader1 = StringTrimLeft($RawPacketData, 2)
    Local $StripHeader2 = StringLen(StringTrimLeft(StringToBinary($PacketHeaderKey), 2))
    Local $StripHeader3 = StringTrimLeft($StripHeader1, $StripHeader2)
    Return BinaryToString("0x" & $StripHeader3)
EndFunc   ;==>StripHeader

Func XTrapHash($iDir = $XTrapDir)
    Local $XTemp1 = MD5File($iDir & "\psapi.dll")
    Local $XTemp2 = MD5File($iDir & "\XDataFI0.Xtp")
    Local $XTemp3 = MD5File($iDir & "\XTrap.xt")
    Local $XTemp4 = MD5File($iDir & "\XTrapExt.dll")
    Local $XTemp5 = MD5File($iDir & "\XTrapVa.dll")
    Return MD5Data($XTemp1 & $XTemp2 & $XTemp3 & $XTemp4 & $XTemp5)
EndFunc   ;==>XTrapHash

Func MD5File($iFile)
    Local $FileHash1 = _Crypt_HashFile($iFile, $CALG_MD5)
    Return StringTrimLeft($FileHash1, 2)
EndFunc   ;==>MD5File

Func MD5Data($iStr)
    Local $DataHash1 = _Crypt_HashData($iStr, $CALG_MD5)
    Return StringTrimLeft($DataHash1, 2)
EndFunc   ;==>MD5Data

Func _ServerListenStart()
    If $Listen <> -1 Then
        AddLogView($LOGS, "Socket already open")
        Return
    Else
        $Listen = TCPListen($ServerBindToHost, $ServerBindToPort, $MaxClients)
        If $Listen = -1 Then
            AddLogView($LOGS, "Unable to open socket")
            Return
        EndIf
    EndIf
    GUICtrlSetState($SVRSTART, $GUI_DISABLE)
    GUICtrlSetState($SVRSTOP, $GUI_ENABLE)
    GUICtrlSetState($KICKONE, $GUI_ENABLE)
    GUICtrlSetState($KICKALL, $GUI_ENABLE)
    AddLogView($LOGS, "Server started on " & $ServerBindToHost & ":" & $ServerBindToPort)
EndFunc   ;==>_ServerListenStart

Func _ServerListenStop()
    If $Listen = -1 Then
        AddLogView($LOGS, "Socket already closed")
        Return
    EndIf
    For $i = 1 To $Client[0][0]
        Sleep($Client[0][0] - $i)
        Local $Data = PacketEnc(Hex($S2C_DATA_ST) & _StringToHex("Server has been stopped."))
        Local $Packet = $PacketHeaderKey & $Data
        TCPSend($Client[$i][0], BinaryToString($Packet))
        $Client[$i][4] = -1
    Next
    GUICtrlSetState($SVRSTART, $GUI_ENABLE)
    GUICtrlSetState($SVRSTOP, $GUI_DISABLE)
    GUICtrlSetState($KICKONE, $GUI_DISABLE)
    GUICtrlSetState($KICKALL, $GUI_DISABLE)
    AddLogView($LOGS, "Server stopped, (" & $Client[0][0] & ") total clients has been disconnected")
    TCPCloseSocket($Listen)
    $Listen = -1
    $PacketCache = ""
EndFunc   ;==>_ServerListenStop

Func _ServerReload()
    GUICtrlSetState($SVRRELOAD, $GUI_DISABLE)
    GUICtrlSetData($SVRRELOAD, "Restarting...")
    GUICtrlSetState($SVRSTART, $GUI_ENABLE)
    GUICtrlSetState($SVRSTOP, $GUI_DISABLE)
    GUICtrlSetState($KICKONE, $GUI_DISABLE)
    GUICtrlSetState($KICKALL, $GUI_DISABLE)
    If Not $Listen = -1 Then
        If $Client[0][0] >= 1 Then
            For $i = 1 To $Client[0][0]
                Sleep($Client[0][0] - $i)
                Local $Data = PacketEnc(Hex($S2C_DATA_SR) & _StringToHex("Server has been restarted"))
                Local $Packet = $PacketHeaderKey & $Data
                TCPSend($Client[$i][0], BinaryToString($Packet))
                $Client[$i][4] = -1
            Next
            AddLogView($LOGS, "Server stopped for restart, (" & $Client[0][0] & ") total clients has been disconnected")
        EndIf
    EndIf
    TCPCloseSocket($Listen)
    $Listen = -1
    $PacketCache = ""
    IniWrite("PXGWS.ini", "Server", "IP", GUICtrlRead($IP))
    IniWrite("PXGWS.ini", "NetLib", "Port", GUICtrlRead($PORT))
    IniWrite("PXGWS.ini", "NetLib", "MaxBufferSize", GUICtrlRead($MAXBUFFER))
    IniWrite("PXGWS.ini", "NetLib", "MaxUserNum", GUICtrlRead($MAXCLIENT))
    IniWrite("PXGWS.ini", "NetLib", "ConnectTimeout", GUICtrlRead($TIMEOUT))
    $ServerBindToHost = GUICtrlRead($IP)
    $ServerBindToPort = GUICtrlRead($PORT)
    $PacketMaxSize = GUICtrlRead($MAXBUFFER)
    $MaxClients = GUICtrlRead($MAXCLIENT)
    $MaxTimeout = GUICtrlRead($TIMEOUT)
    TCPShutdown()
    TCPStartup()
    _ServerListenStart()
    GUICtrlSetData($SVRRELOAD, "Save/Restart")
    GUICtrlSetState($SVRRELOAD, $GUI_ENABLE)
EndFunc   ;==>_ServerReload

Func _ConnectionKill()
    Local $Selected = GUICtrlRead(GUICtrlRead($LIST))
    If Not $Selected <> "" Then
        AddLogView($LOGS, "Please select a connection to disconnect")
        Return
    EndIf
    Local $Data = PacketEnc(Hex($S2C_DATA_KC) & _StringToHex("You have been kicked from the server."))
    Local $Packet = $PacketHeaderKey & $Data
    Local $x = StringSplit($Selected, "|", 1)
    Local $i = $x[1]
    TCPSend($Client[$i][0], BinaryToString($Packet))
    AddLogView($LOGS, "Terminate client successful, client " & $Client[$i][7] & " has been disconnected")
    $Client[$i][4] = -1
EndFunc   ;==>_ConnectionKill

Func _ConnectionKillAll()
    If $Client[0][0] >= 1 Then
        For $i = 1 To $Client[0][0]
            If $Client[$i][0] > 0 Then
                Sleep($Client[0][0] - $i)
                Local $Data = PacketEnc(Hex($S2C_DATA_KA) & _StringToHex("All client's has been kicked from the server."))
                Local $Packet = $PacketHeaderKey & $Data
                TCPSend($Client[$i][0], BinaryToString($Packet))
                $Client[$i][4] = -1
            EndIf
        Next
    Else
        AddLogView($LOGS, "No connections to close")
        Return
    EndIf
    $PacketCache = ""
    AddLogView($LOGS, "Terminate all client successful, (" & $Client[0][0] & ") total clients has been disconnected")
EndFunc   ;==>_ConnectionKillAll

Func AddLogView($hListBox, $hListBoxMsg, $isLog = 1)
    If $isLog = 1 Then
        WriteLog($hListBoxMsg)
        _GUICtrlListBox_BeginUpdate($hListBox)
        _GUICtrlListBox_AddString($hListBox, "[" & @HOUR & ":" & @MIN & ":" & @SEC & ":" & @MSEC & "] > " & $hListBoxMsg)
        _GUICtrlListBox_SetTopIndex($hListBox, _GUICtrlListBox_GetListBoxInfo($hListBox) - 1)
        _GUICtrlListBox_UpdateHScroll($hListBox)
        _GUICtrlListBox_EndUpdate($hListBox)
    ElseIf $isLog = 0 Then
        _GUICtrlListBox_BeginUpdate($hListBox)
        _GUICtrlListBox_AddString($hListBox, "[" & @HOUR & ":" & @MIN & ":" & @SEC & ":" & @MSEC & "] > " & $hListBoxMsg)
        _GUICtrlListBox_SetTopIndex($hListBox, _GUICtrlListBox_GetListBoxInfo($hListBox) - 1)
        _GUICtrlListBox_UpdateHScroll($hListBox)
        _GUICtrlListBox_EndUpdate($hListBox)
    Else
        Return @error - 1
    EndIf
EndFunc   ;==>AddLogView

Func Hour($cTime, $iFormat = 24)
    Local $Time = StringSplit($cTime, "/")
    ConsoleWrite($Time & @CRLF)
    If Not $Time[0] = 7 Then
        Return @error - 1
    Else
        If $iFormat = 24 Then
            Return $Time[4] & ":" & $Time[5] & ":" & $Time[6] & ":" & $Time[7]
        ElseIf $iFormat = 12 Then
            Local $HOUR
            Local $AMPM
            If $Time[4] >= 01 And $Time[4] <= 11 Then
                If StringMid($Time[4], 1, 1) = 0 Then
                    $HOUR = StringTrimLeft($Time[4], 1)
                Else
                    $HOUR = $Time[4]
                EndIf
            ElseIf $Time[4] = 00 Or $Time[4] = 12 Then
                $HOUR = 12
            Else
                $HOUR = $Time[4] - 12
            EndIf
            If $Time[4] = 00 Or $Time[4] >= 01 And $Time[4] <= 11 Then
                $AMPM = "AM"
            Else
                $AMPM = "PM"
            EndIf
            Return $HOUR & ":" & $Time[5] & ":" & $Time[6] & " " & $AMPM
        Else
            Return @error - 2
        EndIf
    EndIf
EndFunc   ;==>Hour

Func WriteLog($lMsg)
    FileWrite(@ScriptDir & "\" & @YEAR & @MON & @MDAY & "_FatalLog.txt", @YEAR & "-" & @MON & "-" & @MDAY & @TAB & @HOUR & ":" & @MIN & ":" & @SEC & ":" & @MSEC & @TAB & $lMsg & @CRLF)
EndFunc   ;==>WriteLog

Func CheckSetting()
    Local $XPath = _FileListToArray(@ScriptDir, $XTrapDir, 2)
    If StringInStr($PacketHeaderKey, "0x") <> 0 Then
        GUIDelete($MAINGUI)
        MsgBox(16, "Error", "Header xor must be in hex.")
        Exit
    ElseIf StringLen($PacketHeaderKey) <> 4 Then
        GUIDelete($MAINGUI)
        MsgBox(16, "Error", "Header xor must be 8 bytes long.")
        Exit
    ElseIf StringInStr($PacketSecretKey, "0x") <> 0 Then
        GUIDelete($MAINGUI)
        MsgBox(16, "Error", "Packet xor must be in hex.")
        Exit
    ElseIf StringLen($PacketSecretKey) <> 4 Then
        GUIDelete($MAINGUI)
        MsgBox(16, "Error", "Packet xor must be 8 bytes long.")
        Exit
    ElseIf $PacketMaxSize > 2048 Then
        GUIDelete($MAINGUI)
        MsgBox(16, "Error", "Error Code: " & 1004)
        Exit
    ElseIf $MaxClients >= 1000 Then
        GUIDelete($MAINGUI)
        MsgBox(16, "Error", "Error Code: " & 1005)
        Exit
    ElseIf $MaxTimeout < 65000 Then
        GUIDelete($MAINGUI)
        MsgBox(16, "Error", "Error Code: " & 1006)
        Exit
    ElseIf $XPath = 0 Then
        GUIDelete($MAINGUI)
        MsgBox(16, "Error", "Error Code: " & 1007)
        Exit
    ElseIf $TimeFormat <> 12 And $TimeFormat <> 24 Then
        GUIDelete($MAINGUI)
        MsgBox(16, "Error", "Error Code: " & 1008)
        Exit
    EndIf
    If $TimeFormat = 12 Then
        $InitialTime = "--:--:-- --"
    Else
        $InitialTime = "--:--:--:---"
    EndIf
EndFunc   ;==>CheckSetting

Func PCrypt($1, $2, $3, $4, $5, $6)
    Local $CmdParam1 = _Crypt_EncryptData($1 & "|" & $2 & "|" & $3 & "|" & $4 & "|" & $5 & "|" & $6, $PacketSecretKey, $CALG_AES_256)
    Return StringTrimLeft($CmdParam1, 2)
EndFunc   ;==>PCrypt

Func _Generate()
    Local $gTimer = TimerInit()
    Local $main = GUICtrlRead($Input1)
    Local $parm = GUICtrlRead($Input2)
    Local $hsts = GUICtrlRead($Input3)
    Local $prts = GUICtrlRead($Input4)
    Local $lsts = GUICtrlRead($Input5)
    Local $link = GUICtrlRead($Input6)
    Local $pOut = PCrypt($main, $parm, $hsts, $prts, $lsts, $link)
    GUICtrlSetData($Edit1, "-Usage" & @CRLF & "PXGWC.exe EncryptedParam" & @CRLF & @CRLF & "-EncryptedParam" & @CRLF & $pOut & @CRLF & @CRLF & "Example: PXGWC.exe " & $pOut)
    If FileExists(GUICtrlRead($Input5)) Then FileDelete(GUICtrlRead($Input5))
    Local $iHash = MD5Data(GUICtrlRead($Edit2))
    Local $eData = _Crypt_EncryptData($iHash & GUICtrlRead($Edit2), $PacketSecretKey, $CALG_RC4)
    FileDelete("cl.tmp")
    FileDelete($CheckList)
    FileWrite("cl.tmp", GUICtrlRead($Edit2))
    FileWrite($lsts, BinaryToString($eData))
    IniWrite("PXGWS.ini", "Generator", "CabalMain", $main)
    IniWrite("PXGWS.ini", "Generator", "Parameter", $parm)
    IniWrite("PXGWS.ini", "Generator", "PXLibHost", $link)
    IniWrite("PXGWS.ini", "Generator", "CheckList", $lsts)
    Local $fTimer = Round(TimerDiff($gTimer))
    AddLogView($LOGS, "File created on " & @ScriptDir & "\" & $lsts)
    AddLogView($LOGS, "Generated in " & $fTimer & "ms.")
EndFunc   ;==>_Generate
Edited by Jimtags
Link to comment
Share on other sites

  • Moderators

Are you asking for help with a problem? If not, this would be better suited for the Examples section, rather than Help and Support. If you do require assistance, please explain in detail what you're having a problem with.

Edited by JLogan3o13

"Profanity is the last vestige of the feeble mind. For the man who cannot express himself forcibly through intellect must do so through shock and awe" - Spencer W. Kimball

How to get your question answered on this forum!

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...