魚骨頭的雲端圖書館's Archiver

mhfo 發表於 2012-12-28 10:06

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

頁: [1]

Powered by Discuz! Archiver 7.0.0  © 2001-2009 Comsenz Inc.