选择显示字体大小

网络游戏外挂核心封包揭密

  网络游戏的封包技术是大多数编程爱好者都比较关注的关注的问题之一,在这里就让我们一起研究一下这一个问题吧。

  别看这是封包这一问题,但是涉及的技术范围很广范,实现的方式也很多(比如说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_.net, sock_raw, ipproto_ip); 用法如下:

integer socket(af: integer,
struct: integer,
protocol: integer
);

m_hsocket:=socket(af_.net, sock_raw, ipproto_ip);

  在程序里m_hsocketsocket句柄,af_.net,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_.net;
localaddr.sin_port: = 0;
localaddr.sin_addr.s_addr: = .net_addr('192.168.1.1'); //这里你自己的网卡的ip地址,而.net_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里面读出来就可以了,不过读出来的是十六进制的数据需要转换一下。

  看了封包捕获的全过程序,对你是不是有点起发,然而在这里要告诉大家的是封包的获得是很容易的,但是许多游戏的封包都是加密的,如果你想搞清楚所得到的是什么内容还需要自己进行封包解密。


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons