成人午夜激情影院,小视频免费在线观看,国产精品夜夜嗨,欧美日韩精品一区二区在线播放

當前位置:首頁>>開發編程>>綜合開發>>新聞內容
網絡游戲外掛核心封包揭密
作者:佚名 發布時間:2004-6-23 22:54:03 文章來源:西部E網
  網絡游戲的封包技術是大多數編程愛好者都比較關注的關注的問題之一,在這里就讓我們一起研究一下這一個問題吧。

  別看這是封包這一問題,但是涉及的技術范圍很廣范,實現的方式也很多(比如說APIHOOK,VXD,Winsock2都可以實現),在這里我們不可能每種技術和方法都涉及,所以我在這里以Winsock2技術作詳細講解,就算作拋磚引玉。

  由于大多數讀者對封包類編程不是很了解,我在這里就簡單介紹一下相關知識:

  APIHooK:

  由于Windows的把內核提供的功能都封裝到API里面,所以大家要實現功能就必須通過API,換句話說就是我們要想捕獲數據封包,就必須先要得知道并且捕獲這個API,從API里面得到封包信息。

  VXD:

  直接通過控制VXD驅動程序來實現封包信息的捕獲,不過VXD只能用于win9X。

  winsock2:

  winsock是Windows網絡編程接口,winsock工作在應用層,它提供與底層傳輸協議無關的高層數據傳輸編程接口,winsock2是winsock2.0提供的服務提供者接口,但只能在win2000下用。

  好了,我們開始進入winsock2封包式編程吧。

  在封包編程里面我準備分兩個步驟對大家進行講解:1、封包的捕獲,2、封包的發送。

  首先我們要實現的是封包的捕獲:

  Delphi的封裝的winsock是1.0版的,很自然winsock2就用不成。如果要使用winsock2我們要對winsock2在Delphi里面做一個接口,才可以使用winsock2。

  1、如何做winsock2的接口?

  1)我們要先定義winsock2.0所用得到的類型,在這里我們以WSA_DATA類型做示范,大家可以舉一仿三的來實現winsock2其他類型的封裝。

  我們要知道WSA_DATA類型會被用于WSAStartup(wVersionRequired: word; var WSData: TWSAData): Integer;,大家會發現WSData是引用參數,在傳入參數時傳的是變量的地址,所以我們對WSA_DATA做以下封裝:

const
WSADESCRIPTION_LEN = 256;
WSASYS_STATUS_LEN = 128;
type
PWSA_DATA = ^TWSA_DATA;
WSA_DATA = record
wVersion: Word;
wHighVersion: Word;
szDescription: array[0..WSADESCRIPTION_LEN] of Char;
szSystemStatus: array[0..WSASYS_STATUS_LEN] of Char;
iMaxSockets: Word;
iMaxUdpDg: Word;
lpVendorInfo: PChar;
end;
TWSA_DATA = WSA_DATA;

  2)我們要從WS2_32.DLL引入winsock2的函數,在此我們也是以WSAStartup為例做函數引入:

function WSAStartup(wVersionRequired: word; var WSData: TWSAData): Integer; stdcall;
implementation

const WinSocket2 = 'WS2_32.DLL';
function WSAStartup; external winsocket name 'WSAStartup';

  通過以上方法,我們便可以對winsock2做接口,下面我們就可以用winsock2做封包捕獲了,不過首先要有一塊網卡。因為涉及到正在運作的網絡游戲安全問題,所以我們在這里以IP數據包為例做封包捕獲,如果下面的某些數據類型您不是很清楚,請您查閱MSDN:

  1)我們要起動WSA,這時個要用到的WSAStartup函數,用法如下:

INTEGER WSAStartup(
 wVersionRequired: word,
 WSData: TWSA_DATA
);

   2)使用socket函數得到socket句柄,m_hSocket:=Socket(AF_INET, SOCK_RAW, IPPROTO_IP); 用法如下:

INTEGER socket(af: Integer,
Struct: Integer,
protocol: Integer
);

m_hSocket:=Socket(AF_INET, SOCK_RAW, IPPROTO_IP);

  在程序里m_hSocket為socket句柄,AF_INET,SOCK_RAW,IPPROTO_IP均為常量。

  3)定義SOCK_ADDR類型,跟據我們的網卡IP給Sock_ADDR類型附值,然后我們使用bind函數來綁定我們的網卡,Bind函數用法如下:

Type
IN_ADDR = record
S_addr : PChar;
End;

Type
TSOCK_ADDR = record
sin_family: Word;
sin_port: Word;
sin_addr : IN_ADDR
sin_zero: array[0..7] of Char;
End;

var
LocalAddr:TSOCK_ADDR;

LocalAddr.sin_family: = AF_INET;
LocalAddr.sin_port: = 0;
LocalAddr.sin_addr.S_addr: = inet_addr('192.168.1.1'); //這里你自己的網卡的IP地址,而inet_addr這個函數是winsock2的函數。

bind(m_hSocket, LocalAddr, sizeof(LocalAddr));

  4)用WSAIoctl來注冊WSA的輸入輸出組件,其用法如下:

INTEGER WSAIoctl(s:INTEGER,
dwIoControlCode : INTEGER,
lpvInBuffer :INTEGER,
cbInBuffer : INTEGER,
lpvOutBuffer : INTEGER,
cbOutBuffer: INTEGER,
lpcbBytesReturned : INTEGER,
lpOverlapped : INTEGER,
lpCompletionRoutine : INTEGER
);

  5)下面做死循環,在死循環塊里,來實現數據的接收。但是徇環中間要用Sleep()做延時,不然程序會出錯。

  6)在循環塊里,用recv函數來接收數據,recv函數用法如下:

INTEGER recv (s : INTEGER,
buffer:Array[0..4095] of byte,
length : INTEGER,
flags : INTEGER,
);

  7)在buffer里就是我們接收回來的數據了,如果我們想要知道數據是什么地方發來的,那么,我們要定義一定IP包結構,用CopyMemory()把IP信息從buffer里面讀出來就可以了,不過讀出來的是十六進制的數據需要轉換一下。

  看了封包捕獲的全過程序,對你是不是有點起發,然而在這里要告訴大家的是封包的獲得是很容易的,但是許多游戲的封包都是加密的,如果你想搞清楚所得到的是什么內容還需要自己進行封包解密。


最新更新
·wml中頁面自動跳轉的實現方法
·Alexa排名數據接口的簡要介紹
·利用U盤進行軟件加密的方法(VB)
·優秀程序員的十個習慣
·項目管理:如何逃離垃圾客戶
·QQ2009去廣告部分核心源代碼
·讓程序更容易理解:13個代碼注釋的小技
·nx1和nx2后綴名是什么數據庫文件?
·正則表達式符號解釋大全
·什么是RIA?介紹幾種RIA客戶端開發技術
相關信息
畫心
愚愛
偏愛
火苗
白狐
畫沙
犯錯
歌曲
傳奇
稻香
小酒窩
獅子座
小情歌
全是愛
棉花糖
海豚音
我相信
甩蔥歌
這叫愛
shero
走天涯
琉璃月
Nobody
我愛他
套馬桿
愛是你我
最后一次
少女時代
灰色頭像
斷橋殘雪
美了美了
狼的誘惑
我很快樂
星月神話
心痛2009
愛丫愛丫
半城煙沙
旗開得勝
郎的誘惑
愛情買賣
2010等你來
我叫小沈陽
i miss you
姑娘我愛你
我們都一樣
其實很寂寞
我愛雨夜花
變心的玫瑰
犀利哥之歌
你是我的眼
你是我的OK繃
貝多芬的悲傷
哥只是個傳說
丟了幸福的豬
找個人來愛我
要嫁就嫁灰太狼
如果這就是愛情
我們沒有在一起
寂寞在唱什么歌
斯琴高麗的傷心
別在我離開之前離開
不是因為寂寞才想你
愛上你等于愛上了錯
在心里從此永遠有個你
一個人的寂寞兩個人的錯
主站蜘蛛池模板: 临武县| 夏津县| 天津市| 东乌珠穆沁旗| 尼玛县| 五河县| 荥经县| 永安市| 炎陵县| 沧源| 黄陵县| 菏泽市| 昔阳县| 习水县| 铜鼓县| 右玉县| 萝北县| 淮阳县| 陆川县| 额敏县| 西盟| 留坝县| 南丹县| 惠东县| 额济纳旗| 安庆市| 吕梁市| 富源县| 师宗县| 大冶市| 城口县| 湘阴县| 彩票| 周宁县| 历史| 铜鼓县| 洞头县| 南木林县| 正镶白旗| 开阳县| 甘德县|