网络游戏外挂制作之我所见(6)

原创 2003年05月19日 21:32:00

    网络游戏的封包技术是大多数编程爱好者都比较关注的关注的问题之一,在这一篇里就让我们一起研究一下这一个问题吧。
    别看这是封包这一问题,但是涉及的技术范围很广范,实现的方式也很多(比如说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里面读出来就可以了,不过读出来的是十六进制的数据需要转换一下。

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

版权说明:
您可以随意复制、分发、下载此文档。但未经本人同意,您不可以截取、改动本文片断,或用本文谋取任何形式的利益。

[四种]网络游戏外挂的制作方法

1、动作式,所谓动作式,就是指用API发命令给窗口或API控制鼠标、键盘等,使游戏里的人物进行流动或者攻击,最早以前的“石器”外挂就是这种方式。(这种外挂完全是垃圾,TMD,只要会一点点API的人都知...
  • liujiayu2
  • liujiayu2
  • 2015年05月14日 15:36
  • 1663

网络游戏外挂编写初级教程

做自己喜欢的!  ------ 明天你来自己做外挂 随着网络游戏的日益火爆,很多玩家都投身到游戏中。目前很多玩家都依赖于一些游戏的外挂程序来进行游戏。那么做一个游戏的外挂程序是否是一件很困难的事呢?...
  • liujiayu2
  • liujiayu2
  • 2015年05月14日 15:41
  • 1127

网络游戏外挂制作

在几年前我看到别人玩网络游戏用上了外挂,做为程序员的我心里实在是不爽,想搞清楚这到底是怎么回事。就拿了一些来研究,小有心得,拿出来与大家共享,外挂无非就是分几种罢了(依制作难度): 1、动作式,...
  • u010258235
  • u010258235
  • 2013年10月18日 12:13
  • 740

网络游戏外挂制作技术浅谈

网络游戏外挂制作技术浅谈2007-01-27 21:05外挂无非分以下几种(依制作难度):1、动作式,所谓动作式,就是指用API发命令给窗口或API控制鼠标、键盘等,使游戏里的人物进行流动或者攻击,最...
  • shaozhanyu
  • shaozhanyu
  • 2013年10月23日 16:27
  • 525

外挂制作必备工具下载.

外挂制作必备工具下载. 工具下载: peid 0.94    用于查壳,知道什么壳就可以脱壳拉. http://www.pediy.com/tools/unpack/File_analyse...
  • liujiayu2
  • liujiayu2
  • 2016年06月22日 18:47
  • 3194

简单游戏外挂制作教程

在几年前我看到别人玩网络游戏用上了外挂,做为程序员的我心里实在是不爽,想搞清楚这到底是怎么回事。就拿了一些来研究,小有心得,拿出来与大家共享,外挂无非就是分几种罢了(依制作难度):  1、动作式...
  • liujiayu2
  • liujiayu2
  • 2015年05月14日 15:52
  • 4400

网游外挂之制作流程

很多人都对网游外挂的制作很感兴趣,在这篇文章里,我向大家简单介绍一下一款网游外挂的大致制作流程。  首先,我想说明几点: 第一,这篇文章并不是具体教你如何写外挂,只是带你大致浏览一下网游外挂的制作...
  • hwt0101
  • hwt0101
  • 2013年08月26日 10:38
  • 2655

Android 源码系列之<十>从源码的角度深入理解AccessibilityService,打造自己的APP小外挂(上)

说起外挂特别是玩游戏的小伙伴估计对它很熟悉,肯定有部分小伙伴使用过,至于为什么使用它,你懂得(*^__^*) ……我最早接触外挂是在大二的时候,那时候盛行玩QQ农场,早上一睁眼就是打开电脑先把自己的菜...
  • llew2011
  • llew2011
  • 2016年10月24日 17:55
  • 7328

网络游戏外挂编写基础

要想在修改游戏中做到百战百胜,是需要相当丰富的计算机知识的。有很多计算机高手就是从玩游戏,修改游戏中,逐步 对计算机产生浓厚的兴趣,逐步成长起来的。不要在羡慕别人能够做到的,因为别人能够做的你也...
  • li744831579
  • li744831579
  • 2013年04月23日 20:19
  • 1023

Java外挂开发之内存修改器(类似CE)

最近闲着蛋疼,无聊之中用CE耍了一哈游戏,发现挺好用的,于是就想,我自己能不能写个内存修改器呢?于是乎,这个软件就诞生了! 当然我只会Java,C++嘛,了解了解,嘿嘿,所以这个工具也是用Java写的...
  • qq969422014
  • qq969422014
  • 2016年12月09日 21:44
  • 6123
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:网络游戏外挂制作之我所见(6)
举报原因:
原因补充:

(最多只允许输入30个字)