• Welcome to Valhalla Legends Archive.
 

[RESOLVED] Disappearing Packets?

Started by shadypalm88, May 02, 2004, 05:10 PM

Previous topic - Next topic

shadypalm88

I'm writing a bot in VB that uses the Winsock 2 API directly and not the control.  It uses WSAAsyncSelect to have notifications of connects, disconnects, and data waiting to be read sent to a hidden text field whose message handler has been replaced.  It first makes a connection to BNLS, and after it has recieved the version byte, connects to b.net and fires off an SID_AUTH_INFO.  After it gets the response back, it sends a BNLS_CDKEY_EX packet to BNLS.  Ethereal shows that the reply arrives, but no notification is sent to my bot.  Any ideas on what might be happening here?

Grok

Quote from: shadypalm88 on May 02, 2004, 05:10 PM
I'm writing a bot in VB that uses the Winsock 2 API directly and not the control.  It uses WSAAsyncSelect to have notifications of connects, disconnects, and data waiting to be read sent to a hidden text field whose message handler has been replaced.  It first makes a connection to BNLS, and after it has recieved the version byte, connects to b.net and fires off an SID_AUTH_INFO.  After it gets the response back, it sends a BNLS_CDKEY_EX packet to BNLS.  Ethereal shows that the reply arrives, but no notification is sent to my bot.  Any ideas on what might be happening here?

Well, judging from your source code ....






Oh wait.  we can't do that, now can we?

shadypalm88

Knock yourself out...

Here's the message handler, along with the code it uses to find out which bot a given message is for.Public Type whData
   Active As Boolean
   BotKey As String
   WindowHandle As Long
   SockType As mSocketType
End Type

Public Enum mSocketType
   sBattleNet
   sBNLS
   sInvalid
End Enum

Public Enum mSocketEvent
   sConnect
   sDisconnect
   sData
End Enum

'-----------------------------------------------------------------------------------
'  Variables
'-----------------------------------------------------------------------------------

Public WindowMap() As whData, NextWindowMap&

'-----------------------------------------------------------------------------------
'  Message Handler
'-----------------------------------------------------------------------------------

Private Function GetBotFromWindow(hWnd As Long, BotKey As String, SockType As mSocketType) As Boolean
   Dim i&
   SockType = sInvalid
   GetBotFromWindow = False
   For i = LBound(WindowMap) To UBound(WindowMap)
       If WindowMap(i).Active And WindowMap(i).WindowHandle = hWnd Then
           With WindowMap(i)
               BotKey = .BotKey
               SockType = .SockType
           End With
           GetBotFromWindow = True
           Exit Function
       End If
   Next i
End Function

Public Function WindowProc(ByVal hWnd As Long, ByVal wMsg As Long, _
   ByVal wParam As Long, ByVal lParam As Long) As Long
On Error Resume Next
   Dim evType&, Bot$, Count&, Buf$, SocketType As mSocketType, Sock&
   Select Case wMsg
       Case WM_SOCKEVENT
           evType = lParam And &HFFFF&
           If Not GetBotFromWindow(hWnd, Bot, SocketType) Then Exit Function
           Select Case evType
               Case FD_CONNECT
                   Bots(Bot).SocketEvent sConnect, SocketType
               Case FD_CLOSE
                   Bots(Bot).SocketEvent sDisconnect, SocketType
               Case FD_READ
                   If SocketType = sBattleNet Then
                       'Debug.Print "[B.NET] DATA"
                       Sock = Bots(Bot).GetSock()
                   ElseIf SocketType = sBNLS Then
                       'Debug.Print "[BNLS] DATA"
                       Sock = Bots(Bot).GetBNLSSock()
                   Else
                       Debug.Print "[?] DATA"
                       Exit Function
                   End If
                   Call ioctlsocket(Sock, FIONREAD, Count)
                   Buf = String$(Count&, Chr$(0))
                   Call recv(Sock, Buf, Count, 0)
                   Bots(Bot).SocketEvent sData, SocketType, Buf, Count
           End Select
       Case WM_CLOSE
           AddC "Socket closed.", vbRed
   End Select
                   
End Function


All relevant parts of the socket encapsulator class (named Arbiter):Option Explicit

Private Ready As Boolean
Private sType As mSocketType
Private sBot As String
Private LastTransmission$
Public Sock As Long

Public Enum PuppetResult
   spOK
   spErrSockAllocate
   spErrSockSelect
   spErrBind
   spErrListen
End Enum

Private Type CreateSocketResult
   Sock As Long
   Result As PuppetResult
End Type


Private Sub Class_Initialize()
   Ready = False
End Sub

Public Function Initialize(msgReciever As Long, Bot As String, SockType As mSocketType) As Boolean
   Dim Result As CreateSocketResult
   Result = CreateSocket(msgReciever, Bot, SockType)
   If (Result.Result = spOK) Then
       Initialize = True
       Ready = True
       sType = SockType
       sBot = Bot
       Sock = Result.Sock
   Else
       Initialize = False
   End If
End Function

Public Function Connect(Location As String, Port As Long) As Boolean
   Dim sockBuf As sockaddr, Host As HostEnt, RealError&
   sockBuf.sin_family = AF_INET
   sockBuf.sin_port = htons(Port)
   sockBuf.sin_addr = GetHostByNameAlias(Location)
   If (Winsock.Connect(Sock, sockBuf, Len(sockBuf)) = -1) Then
       RealError = WSAGetLastError()
       If (RealError <> WSAEWOULDBLOCK And RealError > 0) Then
           MsgBox "Socket Error " & RealError & ": " & GetWSAErrorString(RealError), vbExclamation, "Arbiter Network Class"
           Connect = False
       Else
           Connect = True
       End If
   Else
       Connect = True
   End If
End Function

Private Function CreateSocket(wh As Long, Bot As String, SockType As mSocketType) As CreateSocketResult
   Dim socketBuffer As sockaddr, Host As HostEnt, RealError As Long, Sock As Long
   Sock = Socket(AF_INET, SOCK_STREAM, 0)
   CreateSocket.Sock = Sock
   If Sock = -1 Then
       MsgBox "Socket error: " & WSAGetLastError()
       CreateSocket.Result = spErrSockAllocate
   Else
       ReDim Preserve WindowMap(NextWindowMap) As whData
       With WindowMap(NextWindowMap)
           .Active = True
           .BotKey = Bot
           .SockType = SockType
           .WindowHandle = wh
       End With
       Call SetWindowLong(wh, GWL_WNDPROC, AddressOf WindowProc)
       If (WSAAsyncSelect(Sock&, wh, ByVal WM_SOCKEVENT, ByVal FD_READ + FD_CLOSE + FD_CONNECT) = -1) Then
           CreateSocket.Result = spErrSockSelect
           Exit Function
       Else
           CreateSocket.Result = spOK
       End If
   End If
End Function


And the actual code used to make a socket...Private BNLS As New Arbiter
<..snip..>
Public Function Connect() As Boolean
   'Load frmMain.txtRecv(0)
   Dim tR As Integer
   If UseBNLS Then
       Set BNLS = New Arbiter
       tR = frmMain.txtRecv.Count
       Debug.Print "txtRecv.Count: " & tR
       Load frmMain.txtRecv(tR)
       Debug.Print "txtRecv.Count: " & frmMain.txtRecv.Count
       If BNLS.Initialize(frmMain.txtRecv(tR).hWnd, bKey, sBNLS) Then
           BotEvent bKey, evBnlsConnecting
           If Not BNLS.Connect("bnls.valhallalegends.com", 9367) Then
               BotEvent bKey, evConError, "Could not connect to BNLS."
           End If
       Else
           BotEvent bKey, evConError, "Could not initialize BNLS socket."
       End If
   End If
End Function


Judging from my source code... it's long and I'm baffled as to where in all that the fault lies, so I didn't post it at first.  frmMain.txtRecv is the hidden "listener" textbox.

shadypalm88

If I don't open the connection to b.net, the BNLS connection is not affected.   Help anyone?

shadypalm88

Oy vay.  Stupid reason.  Fixed.