⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gamepacket.pas

📁 千年外挂通用
💻 PAS
字号:
unit gamepacket;

interface

uses
  Windows, Sysutils, Classes, dialogs,
  Winsock2, dllform, gamecode;
  
procedure gamePacketsend (buf:pchar; len:integer);
procedure gamePacketrecv (buf:pchar; len:integer);
procedure sendmsg (source:pchar; size:integer );
function  MyWSASendaa(SendBuf:PChar;SendLen:Integer):Integer;
function  SaveLog(LogStr:String):integer;

var
  sendnum :integer ;
  recvnum :integer;
  gamesocket :Tsocket=0;                        //定义socket
  stratnum : bool = false ;                     //初始化封包序号标志
  sendcount : array [0..1] of byte ;            //游戏发送封包序号 2字节. 无符号型
  newsendcount :pchar;                          //游戏发送封包序号 2字节. char型

implementation

procedure newsendnum;                           //更新封包序列号
begin
  if byte(newsendcount[0]) <> $FF then
    begin
    sendcount[0] := byte(newsendcount[0]);
    inc (sendcount[0]);
    sendcount[1] := byte(newsendcount[1]);
    newsendcount := @sendcount;
    end else                                    //如果第一位是FF 第二位加上 1
    begin
    sendcount[0] := $00;
    sendcount[1] := byte(newsendcount[1]);
    inc (sendcount[1]);
    newsendcount := @sendcount;
    end;
end;

procedure gamePacketsend (buf:pchar; len:integer);
var
  outlen  : integer ;
  outchar,recvbuf : array [0..1000] of char ;
  logstr  : string;
begin
  copychar ( buf, recvbuf, len );
  outlen := Decode ( @recvbuf[1], len-1, outchar);

  if stratnum = false then                      //初始化封包序列号 (只执行一次)
    begin
    sendcount[0] := byte(outchar[2]);
    sendcount[1] := byte(outchar[3]);
    newsendcount := @sendcount;
    stratnum := true;            
    end;
                  
  if dllform1.Checksend.Checked =false then exit;
  with dllform1.Listsend.Items.Add do                   //填加记录到表
    begin
    caption := inttostr(sendnum);
    inc(sendnum);
    subitems.add(chartoascii (@outchar[0],2));          //封包长度
    subitems.add(chartoascii (@outchar[2],2));          //封包代号
    subitems.add(chartoascii (@outchar[4],4));          //0000 0000
    subitems.add(chartoascii (@outchar[8],2));          //标识符后数据长度
    subitems.add(chartoascii (@outchar[10],1));         //标识符
    subitems.add(chartoascii (@outchar[11],outlen-11)); //参数
    subitems.add(pchar(@outchar[13]));                  //参数
    end;

  if dllform1.Checksave.Checked then                    //保存到文件
    begin
    logstr := 'send'+' '+inttostr(sendnum)+' '+chartoascii (@outchar[10],1)+' '+chartoascii (@outchar[11],outlen-11)+' '+pchar(@outchar[13]);
    SaveLog (logstr);
    end;          
end;

procedure gamePacketrecv (buf:pchar; len:integer);
var
  outlen  : integer ;
  outchar,recvbuf : array [0..1000] of char ;
  logstr  : string;
begin
  copychar ( buf, recvbuf, len );
  outlen := Decode ( @recvbuf[1], len-1, outchar);

  if dllform1.Checkrecv.Checked = false then exit ;
  with dllform1.Listrecv.Items.Add do
    begin
    caption := inttostr(recvnum);
    inc(recvnum);
    subitems.add(chartoascii (@outchar[0],2));                  //封包长度
    subitems.add(chartoascii (@outchar[2],2));                  //封包代号
    subitems.add(chartoascii (@outchar[4],4));                  //0000 0000
    subitems.add(chartoascii (@outchar[8],2));                  //标识符后数据长度
    subitems.add(chartoascii (@outchar[10],1));                 //标识符
    subitems.add(chartoascii (@outchar[11],outlen-11));         //参数
    subitems.add(pchar(@outchar[17]));                          //参数
    end;

  if dllform1.Checksave.Checked then
    begin
    logstr := 'recv'+' '+inttostr(recvnum)+' '+chartoascii (@outchar[10],1)+ ' '+chartoascii (@outchar[11],outlen-11)+' '+pchar(@outchar[13]);
    SaveLog (logstr);
    end;
end;         

procedure sendmsg (source:pchar; size:integer );     //加密并调用发送封包
var
  len : integer;
  outchar,sendbuf : array [0..1000] of char;
begin
  Len:=Encode(source,size,@outchar[1]);
  copychar (outchar,sendbuf,Len);
  if GameSocket<>0 then
    MyWSASendaa(sendbuf,len+2);
end;

function MyWSASendaa(Sendbuf:PChar;SendLen:Integer):Integer;
var
  Buffers : WSABUF;
  NumberOfSent:dword;
begin
  Buffers.buf:=Sendbuf;
  Buffers.len:=SendLen;
  Buffers.buf[0]:='(';
  Buffers.buf[SendLen-1]:=')';
  MyWSASendaa:=WSASend(GameSocket,@Buffers,1,NumberOfSent,0,nil,nil);
end;      



function SaveLog(LogStr:String):integer;                //log记录
var
   Log:textfile;
begin
   assignfile(Log,dllform1.Edit1.text);
   if fileexists(dllform1.Edit1.text)=false then rewrite(Log)
   else
     append(Log);
     Writeln(Log,LogStr);
     closefile(Log);
   SaveLog := 1;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -