挂机型外挂开发-游戏数据包管理类

来源:互联网 发布:雅可比矩阵的意义 编辑:程序博客网 时间:2024/05/21 15:41

一个外挂能够正常的长时间挂机缺少不了游戏内数据的获取,这里我们就要创建个类用来获取游戏的数据及分发各种数据。

这里只针对利用封包为数据来源,如果是内存方式获取数据的,请无视该类。

unit UPacketManager;interfaceuses  Windows, Classes, SyncObjs ,GD_Utils;const  C_SEND_PACKET     =     1000;  C_RECV_PACKET     =     1001;  C_PACKET_HANDLE_BREAK = -1;type  FPacketProc = Procedure (pBuffer:Pointer;Len:Cardinal) of object;  TPacketNode = Class    HandleName:String;    PacketType:Cardinal;    Proc:FPacketProc;  End;  TPacketManager = class    private      Cri:TCriticalSection;      List:TList;      Procedure OnPacketHandle(PacketType:Cardinal;pBuffer:Pointer;Len:Cardinal);    public      constructor Create();      //添加回调      Function AddItem(PacketType:Cardinal;HandleName:string; Proc:FPacketProc):Bool;      Procedure OnSendHandle(pBuffer:Pointer;Len:Cardinal);      Procedure OnRecvHandle(pBuffer:Pointer;Len:Cardinal);  end;var  Packet:TPacketManager;implementation{ TPacketManager }function TPacketManager.AddItem(PacketType: Cardinal; HandleName:string; Proc: FPacketProc): Bool;var  pNode:TPacketNode;begin  try    pNode:=TPacketNode.Create;    pNode.HandleName := HandleName;    pNode.PacketType := PacketType;    pNode.Proc := Proc;    Dbgprint('Add Packet Handle[Name:%s Proc:0x%X]',[HandleName,Cardinal(@Proc)]);    Cri.Enter;    List.Add(pNode);    Cri.Leave;    Result:=True;  Except    Result:=False;  end;end;constructor TPacketManager.Create;begin  List:=TList.Create;  Cri:=TCriticalSection.Create;  end;procedure TPacketManager.OnPacketHandle(PacketType:Cardinal;pBuffer: Pointer; Len: Cardinal);var  i:Integer;  pNode:TPacketNode;begin  Cri.Enter;  for i := 0 to List.Count - 1 do    begin      pNode := List[i];      if pNode.PacketType = PacketType then        begin          if Assigned(pNode.Proc) then           begin            // Dbgprint('OnPacket[%s] - %X',[pNode.HandleName,Cardinal(@pNode.Proc)]);             pNode.Proc(pBuffer,Len);           end;        end;    end;  Cri.Leave;end;procedure TPacketManager.OnRecvHandle(pBuffer: Pointer; Len: Cardinal);begin  OnPacketHandle(C_RECV_PACKET,pBuffer,Len);end;procedure TPacketManager.OnSendHandle(pBuffer: Pointer; Len: Cardinal);begin  OnPacketHandle(C_SEND_PACKET,pBuffer,Len);end;initialization  Packet:=TPacketManager.Create;end.

外部send和recv hook的函数可以直接调用 Packet导出的 OnSendHandle 和 OnRecvHandle传递数据。

这里还要创建的数据包的基类用于注册回调例程

unit UGamePacket;interfaceuses  windows;type  TGamePacket = class    public       constructor Create(HandleName:String);       Procedure OnSend(pBuffer:Pointer;Len:Cardinal);virtual;abstract;       Procedure OnRecv(pBuffer:Pointer;Len:Cardinal);virtual;abstract;  end;implementationuses  UPacketManager,GD_Utils;{ TGamePacket }constructor TGamePacket.Create(HandleName: String);begin  Packet.AddItem(C_SEND_PACKET,'s_' + HandleName,OnSend);  Packet.AddItem(C_RECV_PACKET,'r_' +HandleName,OnRecv);end;end.
这样数据收发包的获取框架类就完成了,数据会被广播到各个注册的解析回调中去。

0 0