📄 unit1.pas
字号:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Sockets, ScktComp, ComCtrls;
type
TForm1 = class(TForm)
grp1: TGroupBox;
mmo1: TMemo;
btn1: TButton;
grp2: TGroupBox;
mmoLoginInfo: TMemo;
clntsckt1: TClientSocket;
StatusBar: TStatusBar;
lbl4: TLabel;
btn3: TButton;
btn5: TButton;
clntsckt2: TClientSocket;
procedure btn1Click(Sender: TObject);
procedure btn3Click(Sender: TObject);
procedure clntsckt1Read(Sender: TObject; Socket: TCustomWinSocket);
procedure clntsckt1Connect(Sender: TObject; Socket: TCustomWinSocket);
procedure clntsckt1Connecting(Sender: TObject;
Socket: TCustomWinSocket);
procedure clntsckt1Disconnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure btn5Click(Sender: TObject);
procedure btn4Click(Sender: TObject);
procedure clntsckt1Error(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure clntsckt2Read(Sender: TObject; Socket: TCustomWinSocket);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
hown:Integer;
implementation
uses
Unit2;
{$R *.dfm}
procedure TForm1.btn1Click(Sender: TObject);
var
i:Integer;
s:string;
begin
MakeTable;
mmo1.Lines.Add('==========================================================');
for i:=0 to 1055 do
begin
if (i mod 16 =0) and (i<>0) then
begin
mmo1.Lines.Add(s);
s:='';
s:=s+IntToHex(Integer(RecvCipherTable[i]),2)+' ';
end else
begin
s:=s+IntToHex(Integer(RecvCipherTable[i]),2)+' ';
end;
end;
end;
procedure TForm1.btn3Click(Sender: TObject);
begin
hown:=1;
MakeTable;
mmoLoginInfo.Lines.Add('·密钥表创建完毕!');
clntsckt1.Open;
end;
procedure TForm1.clntsckt1Read(Sender: TObject; Socket: TCustomWinSocket);
var
i:integer;
bufRecv:array of Char;
nLen:integer;
sOutPut:string;
LoginBuf:array [0..135] of Char;
SendBuf:array[0..1024] of Char;
GameIP:string;
begin
nLen:=Socket.ReceiveLength; //得到一个包的长度
SetLength(bufRecv,nLen); //为接收器设置大小
Socket.ReceiveBuf(bufRecv[0],nLen); //得到一个包
mmoLoginInfo.Lines.Add('·得到一个包,大小为:'+ IntToStr(nLen));
Decrypt(bufRecv[0],nLen); //解密
PackageID:=ord(bufRecv[3])*256+ord(bufRecv[2]); //得到包的类别
if PackageID=$0423 then
begin
CopyMemory(@FirstPackage,@bufRecv[0],nLen);
//输出一个解密
for i:=0 to nLen-1 do sOutPut:=sOutPut+inttohex(ord(bufRecv[i]),2)+' ';
mmoLoginInfo.Lines.Add('·接到服务器数据:'+ sOutPut);
//输出一个解密
sOutPut:='';
for i:=0 to nLen-1 do sOutPut:=IntToHex(FirstPackage.Packed_Data,2);
mmoLoginInfo.Lines.Add('·随机种子数为:'+ sOutPut);
//为KEY生成一个随机参数
CreateKEYVa;
mmoLoginInfo.Lines.Add('·建立KEY的随机参数!');
//生成最后的KEY
MakeKEY;
mmoLoginInfo.Lines.Add('·生成最后的KEY!');
//建立密码
LoginPackage.Packed_Pass:='wygailf66390';
//加密密码
MakePass;
//建立登录包
LoginPackage.Packed_Len:=$0088;
LoginPackage.Packed_Class:=$0442;
LoginPackage.Packed_Data:=$00000005;
LoginPackage.Packed_Name:='wygailf66390';
LoginPackage.Packed_ServerName:='湖北一区';
LoginPackage.Packed_ServerNumber:='1162';
//加密发送包
Encrypt(LoginPackage,136);
mmoLoginInfo.Lines.Add('·第一次发送包(登陆包)!');
clntsckt1.Socket.SendBuf(LoginPackage,136);
end;
if PackageID=$041F then
begin
CopyMemory(@SecondPackage,@bufRecv[0],52);
mmoLoginInfo.Lines.Add('·重定向服务器地址:'+secondpackage.Packed_Info);
mmoLoginInfo.Lines.Add('·重定向服务器端口:'+inttostr(SecondPackage.Packed_Data3));
SendSecondPackage.packed_Len:=$001C;
SendSecondPackage.packed_class:=$041C;
SendSecondPackage.packed_Data1:=SecondPackage.Packed_Data1;
SendSecondPackage.packed_Data2:=SecondPackage.Packed_Data2;
SendSecondPackage.packed_Data3:=$00303531;
SendSecondPackage.packed_Data4:='0';
Encrypt(SendSecondPackage,$1C);
mmoLoginInfo.Lines.Add('·第二次发送包!');
RecvCipherTable:='';
CopyMemory(@RecvCipherTable[0],@SendmCipherTable[0],1055);
clntsckt2.Socket.SendBuf(SendSecondPackage,$1c);
end;
end;
procedure TForm1.clntsckt1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
mmoLoginInfo.Lines.Add('·已经连接到帐号服务器 '+ Socket.RemoteHost);
end;
procedure TForm1.clntsckt1Connecting(Sender: TObject;
Socket: TCustomWinSocket);
begin
mmoLoginInfo.Lines.Add('·正在连接到帐号服务器... '+ Socket.RemoteHost);
end;
procedure TForm1.clntsckt1Disconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
mmoLoginInfo.Lines.Add('·已经断开与 '+ Socket.RemoteHost +' 的连接');
end;
procedure TForm1.btn5Click(Sender: TObject);
begin
clntsckt1.Close;
end;
procedure TForm1.btn4Click(Sender: TObject);
var
n:integer;
begin
n:=Rand();
mmo1.Lines.Add(IntToStr(n));
end;
procedure TForm1.clntsckt1Error(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
ShowMessage('出错。');
end;
procedure TForm1.clntsckt2Read(Sender: TObject; Socket: TCustomWinSocket);
var
i:integer;
bufRecv:array of Char;
nLen:integer;
sOutPut:string;
LoginBuf:array [0..135] of Char;
SendBuf:array[0..1024] of Char;
GameIP:string;
begin
hown:=hown+1;
mmo1.Lines.Add(IntToStr(hown));
nLen:=Socket.ReceiveLength; //得到一个包的长度
SetLength(bufRecv,nLen); //为接收器设置大小
Socket.ReceiveBuf(bufRecv[0],nLen); //得到一个包
mmoLoginInfo.Lines.Add('·得到一个包,大小为:'+ IntToStr(nLen));
Decrypt(bufRecv[0],nLen); //解密
PackageID:=ord(bufRecv[3])*256+ord(bufRecv[2]); //得到包的类别
//下面注释掉的请自己添加修改相应的封包结构。
// if PackageID=标识 then
// begin
// sendbuf:='';
// sendbuf:='数据';
// Encrypt(sendbuf,大小);
// clntsckt2.Socket.SendBuf(Sendbuf,大小);
// end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -