您的位置:首页 > 其它

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

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

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

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.这样数据收发包的获取框架类就完成了,数据会被广播到各个注册的解析回调中去。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: