VB WinSock 發送封包&脫機外掛原理和舉例
- VB WinSock 發送封包&脫機外掛原理和舉例
- 1.連接請求
- 2.連接成功
- 3.發送資料
- 4.判斷接收資料
- 而脫機掛 主要也是用封包組成 通過程式的計算 把封包解密加密進行讀取
- 簡單的來說 就是模擬一個遊戲用戶端
- 現在網遊的檢測越來越強大了,脫機掛也就越來越難做了
- 先找個比較菜的遊戲試試吧
- 下面來說說一些winsock函數和方法
- byte received 接收到的位元組數
- local hostname 本地機器名
- Local IP 本地IP地址
- Local port 本地通信程式的埠
- Remote host 遠端機器名
- Remote host IP 遠程IP地址
- Remote port 遠端通信程式埠
- Socket handle 提供調用API得控制碼參數
- State 連接得當前狀態
- Protocol 使用協定
- Bytereceived:反應接收到得資料量,以位元組為單位。
- State:返回當前連接狀態
- 0 關閉狀態
- 1 打開狀態
- 2 監聽狀態
- 3 連接掛起
- 4 解析功能變數名稱
- 5 正在連接
- 6 以建立連接
- 7 正在關閉
- 8 出錯
- 2.控制項
- accept接受一個連接請求。格式:對象.accept request ID
- bind:多協定介面下,把介面卡,IP位址捆綁再一起。格式:對象。Bina埠號,ip位址
- close:關閉連接。格式:對象。Close
- connect:發送連接請求。格式:對象。Connect〔ip,遠端埠〕
- getdata:取出資料後清除緩衝區。
- Peekdata:取出資料後不清楚緩衝區。格式:對象。Getdata(peekdata)變數〔,資料類型〔,最大長度〕〕
- Listen:偵聽。格式:對象。Listen
- Senddata:發送資料。格式:對象。Senddata
- 3.控制項事件
- Close 遠端設備關閉連接時觸發事件
- Connect 建立連接,進行通信時觸發
- Connectrequest 有連接請求時觸發
- Data arrival 有資料到達時觸發
- Error 錯誤時觸發
- Send complete 完成一次資料傳送觸發
- Send progress 資料傳送進度
- 以上就是能用到的函數和事件
- 下面來說下一些實際的問題
- 1.封包的發送
- 舉例1.陣列方式的發送
- 複製內容到剪貼板代碼:
- Dim Id1(0 To 14) As Byte
- Id1(0) = &H59
- Id1(1) = &HE9
- Id1(2) = &HA6
- Id1(3) = &HAD
- Id1(4) = &H51
- Id1(5) = &H6C
- Id1(6) = &H6F
- Id1(7) = &H6E
- Id1(8) = &H6E
- Id1(9) = &H6E
- Id1(10) = &H6E
- Id1(11) = &H6E
- Id1(12) = &H6E
- Id1(13) = &H6E
- Id1(14) = &H6E
- Winsock.SendData Id1()
- 這個方法有點太麻煩..也不太實際 大家參考就好了
- 舉例2.把封包存為檔,用讀取方式發送
- 複製內容到剪貼板代碼:
- Function ReadFile(filePath As String) As String
- Dim fileNo As Long
- fileNo = FreeFile
- Open filePath For Binary As fileNo
- ReadFile = Input(LOF(fileNo), fileNo)
- Close fileNo
- End Function
- winsock.SendData ReadFile(App.Path & "\封包\....\*.dat")
- 有些人就問了 存成什麼樣的呢?
- 記事本肯定不行了,建議用Winhex ,把封包的16位直接輸入到16位編輯裏 保存即可
- 舉例3.直接發送
- 複製內容到剪貼板代碼:
- winsock.SendData (Chr(&H59) & Chr(&H59) & Chr(&H59) & ..........)
- 有些人不知道怎麼直接發送16位封包...用這樣的就可以發出去了
- 以上就是3個發送封包的舉例
- 下面來說說另一個實際的問題
- 封包接收的判斷
- 複製內容到剪貼板代碼:
- '先來把封包換成16位的
- Public Function StrToHex(ByVal S As String) As String
- On Error Resume Next
- Dim ByteArr() As Byte
- ByteArr = StrConv(S, vbFromUnicode)
- Dim Temps As String
- Dim Temp As Byte
- Dim i As Long
- Dim outs As String
- For i = 0 To UBound(ByteArr)
- Temp = ByteArr(i)
- Temps = Hex(Temp)
- Temps = Right("00" & Temps, 2)
- outs = outs & Temps
- Next
- StrToHex = outs
- End Function
- Private Sub WinMove1_DataArrival(ByVal bytesTotal As Long)
- 'DataArrival事件
- winsock.GetData GetMoveSend
- GetMoveSend = StrToHex(Trim(StrConv(GetMoveSend, vbUnicode)))
- '轉換為16位元資料
- If InStr(GetMoveSend, "59E9A9ADA8B1A8AC59E9AFAD8E00") Then
- '下麵就不用說了吧...
- StatusBar1.Panels(2).Text = "登陸成功,進入選擇角色介面"
- 'StatusBar1這個是狀態欄...
- ElseIf InStr(GetMoveSend, "59E9AFADB9A559") Then
- StatusBar1.Panels(2).Text = "進入遊戲..."
- ElseIf InStr(GetMoveSend, "59E9AFADAD00") Then
- StatusBar1.Panels(2).Text = "重複登陸斷線"
- ElseIf InStr(GetMoveSend, "59E9A2AD636D6F") Then
- StatusBar1.Panels(2).Text = "檢測到帳號加入隊伍"
- '.....................
- End If
- End Sub
- 另外說下 封包發送的時候會出現兩個合到一起的
- WinMove1.SendData ReadFile(App.Path & "\.....\*.dat")
- DoEvents
- WinMove1.SendData ReadFile(App.Path & "\.....\*.dat")
- 加上DoEvents 就可以分開了
複製代碼 |