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

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

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

unit UPacketManager;

interface
uses
  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;

interface
uses
  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;
implementation
uses
  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.
这样数据收发包的获取框架类就完成了,数据会被广播到各个注册的解析回调中去。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值