挂机型外挂开发-游戏数据包管理类
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.这样数据收发包的获取框架类就完成了,数据会被广播到各个注册的解析回调中去。
这里只针对利用封包为数据来源,如果是内存方式获取数据的,请无视该类。
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.这样数据收发包的获取框架类就完成了,数据会被广播到各个注册的解析回调中去。
相关文章推荐
- Android中Surface和SurfaceView的一些理解和总结
- 190. Reverse Bits
- 报表或BI的价值在哪?
- 动态加载JDBC Jar包连接数据库
- 通过按钮复制一段代码
- Machine Learning week3
- hdu 2577
- android 跑马灯
- 使用Devstack部署neutron网络节点
- 自定义Dialog且实现与Activity交互
- 源码分析-java-AbstractList-subList、RandomAccess、equals和hashCode
- 向 Activity 添加片段
- 关于row_number函数的用法
- 9. Palindrome Number
- C++右值引用
- HUST 1599 Multiple
- [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied)
- javascript获取dom的下一个节点方法
- PAT乙级.1018. 锤子剪刀布 (20)
- Javascript基础知识