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 就可以分開了
|
|