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

📄 qqinpacket.pas

📁 application with delphi
💻 PAS
字号:
{
QQ[OICQ] Runer Ver 1.01

Copyright (C) 2006 HellFish

E-Mail: hellfish@qq.com,sgfree@hotmail.com
QQ[OICQ]: 4427968

保留以上信息,保留对作者最基本的尊重
}
unit QQInPacket;

interface

Uses Windows,SysUtils,QQPROTO,QQVars,QQTEA;

function ProcessToken(Buff:TQQBuff):TQQBuff;
function ProcessLogin(Buff:TQQBuff;InitKey,PwdKey:Array of Byte):TLoginReply;
function ProcessKeepLive(Buff:TQQBuff;SKey:Array of Byte):TQQBuff;
function ProcessRecvIM(Buff:TQQBuff;MsgType:Byte;SKey:Array of Byte):TRecvIM;
function ProcessChangeStatus(Buff:TQQBuff;SKey:Array of Byte):Boolean;
function ProcessReqKey(Buff:TQQBuff;SKey:Array of Byte):TQQBuff;
function ProcessSendIM(Buff:TQQBuff;SKey:Array of Byte):Boolean;
function ProcessKickOut(Buff:TQQBuff;SKey:Array of Byte):TQQBuff;

implementation

function ProcessToken(Buff:TQQBuff):TQQBuff;
var ToKenLen:Integer;
begin
ToKenLen:=Byte(Buff[SizeOf(TInPacketHead)+1]);
SetLength(Result,ToKenLen);
CopyMemory(@Result[0],@Buff[SizeOf(TInPacketHead)+2],ToKenLen);
end;

function ProcessLogin(Buff:TQQBuff;InitKey,PwdKey:Array of Byte):TLoginReply;
var
Head:TInPacketHead;
EncBuff,DecData,TmpBuff:TQQBuff;
EncLen,DataLen:Integer;
begin
CopyMemory(@Head,@Buff[0],LENGTH05_BASICIN);
EncLen:=Length(Buff)-LENGTH05_BASICIN-1;
SetLength(EncBuff,EncLen);
CopyMemory(@EncBuff[0],@Buff[LENGTH05_BASICIN],EncLen);
DecData:=QQDecrypt(EncBuff,InitKey,DataLen);
if DataLen=0 then DecData:=QQDecrypt(EncBuff,PwdKey,DataLen);
if DataLen=0 then Exit;
Case DecData[0] of

QCMD_Login_Sucess:
begin
Result.Stat:=LsSucess;
CopyMemory(@Result.SessionKey[0],@DecData[1],LENGTH05_KEY);
CopyMemory(@Result.ClientKey[0],@DecData[78],32);
end;

QCMD_Login_Redirect:
begin
Result.Stat:=LsRedirect;
Result.RedirectServer:=IntToStr(DecData[5])+'.'+IntToStr(DecData[6])+'.'+IntToStr(DecData[7])+'.'+IntToStr(DecData[8]);
Result.ErrorMessage:='';
end;

QCMD_Login_PwdErr:
begin
Result.Stat:=LsPwdErr;
SetLength(TmpBuff,DataLen-1);
CopyMemory(@TmpBuff[0],@DecData[1],DataLen-1);
Result.ErrorMessage:=String(TmpBuff);
Result.RedirectServer:='';
end;

end; //Case
end;

function ProcessKeepLive(Buff:TQQBuff;SKey:Array of Byte):TQQBuff;
var
Head:TInPacketHead;
EncBuff,DecData:TQQBuff;
EncLen,DataLen:Integer;
begin
CopyMemory(@Head,@Buff[0],LENGTH05_BASICIN);
EncLen:=Length(Buff)-LENGTH05_BASICIN-1;
SetLength(EncBuff,EncLen);
CopyMemory(@EncBuff[0],@Buff[LENGTH05_BASICIN],EncLen);
DecData:=QQDecrypt(EncBuff,SKey,DataLen);
if DataLen>0 then
begin
SetLength(Result,DataLen);
CopyMemory(@Result[0],@DecData[0],DataLen);
end;
end;

function ProcessRecvIM(Buff:TQQBuff;MsgType:Byte;SKey:Array of Byte):TRecvIM;
var
Head:TInPacketHead;
EncBuff,DecData,TextBuf:TQQBuff;
EncLen,DataLen,MsgBegin,TimeBegin,TextLen:Integer;
GetQQNum,GetSendTime:Array [0..3] of Byte;
begin
CopyMemory(@Head,@Buff[0],LENGTH05_BASICIN);
EncLen:=Length(Buff)-LENGTH05_BASICIN-1;
SetLength(EncBuff,EncLen);
CopyMemory(@EncBuff[0],@Buff[LENGTH05_BASICIN],EncLen);
DecData:=QQDecrypt(EncBuff,SKey,DataLen);
if DataLen>0 then
begin
TimeBegin:=0;
TextLen:=0;
MsgBegin:=0;

case DecData[19] of //消息类型
RECV_IM_FRIEND,RECV_IM_STRANGER:
begin
MsgBegin:=65; //?? 35
TimeBegin:=50;
TextLen:=DataLen-MsgBegin-Byte(DecData[DataLen-2]);
end;
RECV_IM_TEMP:
begin
MsgBegin:=29-Byte(DecData[28]);
TimeBegin:=MsgBegin-1-Byte(DecData[MsgBegin]);
MsgBegin:=MsgBegin+TimeBegin;
TextLen:=DecData[MsgBegin+1];
end;
RECV_IM_SYS:
begin
MsgBegin:=22;
TextLen:=DecData[21];
end;
RECV_IM_BIND_USER,RECV_IM_MOBILE_QQ,RECV_IM_MOBILE_QQ_2,RECV_IM_MOBILE:
begin
MsgBegin:=DataLen-160;
TextLen:=160;
if DecData[19]=RECV_IM_MOBILE_QQ then TimeBegin:=41;
if DecData[19]=RECV_IM_MOBILE_QQ_2 then TimeBegin:=41;
end;
RECV_IM_GROUP1:
begin
MsgBegin:=57;
TimeBegin:=37;
TextLen:=DataLen-MsgBegin-DecData[DataLen-2];
end;
RECV_IM_GROUP2:
begin
MsgBegin:=53;
TimeBegin:=33;
TextLen:=DataLen-MsgBegin-DecData[DataLen-2];
end;
RECV_IM_GROUP3:
begin
MsgBegin:=43;
TimeBegin:=33;
TextLen:=DataLen-MsgBegin-DecData[DataLen-2];
end;
RECV_IM_10000:
begin
MsgBegin:=24;
TextLen:=Byte(DecData[23]);
end else Result.MessageType:=$FF;
end;

GetQQNum[0]:=DecData[3];
GetQQNum[1]:=DecData[2];
GetQQNum[2]:=DecData[1];
GetQQNum[3]:=DecData[0]; //取得发送者QQ
CopyMemory(@Result.SendQQ,@GetQQNum[0],4);    //返回发送QQ
CopyMemory(@Result.SendIP[0],@DecData[12],4); //返回发送IP
CopyMemory(@Result.Serial[0],@DecData[8],4);  //返回消息序号
if TimeBegin>0 then
begin
GetSendTime[3]:=DecData[TimeBegin];
GetSendTime[2]:=DecData[TimeBegin+1];
GetSendTime[1]:=DecData[TimeBegin+2];
GetSendTime[1]:=DecData[TimeBegin+3]; //取得发送时间
CopyMemory(@Result.SendTime,@GetSendTime[0],4); //返回发送时间
end else Result.SendTime:=0;
if (TextLen>0) and (MsgBegin>0) then
begin
SetLength(TextBuf,TextLen);
CopyMemory(@TextBuf[0],@DecData[MsgBegin],TextLen); //取得消息内容
Result.Messages:=String(TextBuf);
if (TextBuf[0]=$00) and (TextBuf[1]=$00) and (TextBuf[2]=$00) and (TextBuf[3]=$00) then
begin
Result.MessageType:=$FF;
Result.Messages:='';
end;
end else Result.Messages:='';
if Result.MessageType<>$FF then Result.MessageType:=DecData[19]; //消息类型
end;
end;

function ProcessSendIM(Buff:TQQBuff;SKey:Array of Byte):Boolean;
var
Head:TInPacketHead;
EncBuff,DecData:TQQBuff;
EncLen,DataLen:Integer;
begin
Result:=False;
CopyMemory(@Head,@Buff[0],LENGTH05_BASICIN);
EncLen:=Length(Buff)-LENGTH05_BASICIN-1;
SetLength(EncBuff,EncLen);
CopyMemory(@EncBuff[0],@Buff[LENGTH05_BASICIN],EncLen);
DecData:=QQDecrypt(EncBuff,SKey,DataLen);
if DataLen>0 then
if DecData[0]=REPLY_OK then Result:=True else Result:=False;
end;

function ProcessChangeStatus(Buff:TQQBuff;SKey:Array of Byte):Boolean;
var
Head:TInPacketHead;
EncBuff,DecData:TQQBuff;
EncLen,DataLen:Integer;
begin
Result:=False;
CopyMemory(@Head,@Buff[0],LENGTH05_BASICIN);
EncLen:=Length(Buff)-LENGTH05_BASICIN-1;
SetLength(EncBuff,EncLen);
CopyMemory(@EncBuff[0],@Buff[LENGTH05_BASICIN],EncLen);
DecData:=QQDecrypt(EncBuff,SKey,DataLen);
if DataLen>0 then
if DecData[0]=QCMD_CHANGESTATUSOK then Result:=True else Result:=False;
end;

function ProcessReqKey(Buff:TQQBuff;SKey:Array of Byte):TQQBuff;
var
Head:TInPacketHead;
EncBuff,DecData:TQQBuff;
EncLen,DataLen,FileToKenLen:Integer;
begin
CopyMemory(@Head,@Buff[0],LENGTH05_BASICIN);
EncLen:=Length(Buff)-LENGTH05_BASICIN-1;
SetLength(EncBuff,EncLen);
CopyMemory(@EncBuff[0],@Buff[LENGTH05_BASICIN],EncLen);
DecData:=QQDecrypt(EncBuff,SKey,DataLen);
if DataLen>0 then
if DecData[1]=$00 then
begin
FileToKenLen:=Integer(DecData[30]);
SetLength(Result,16+FileToKenLen);
CopyMemory(@Result[0],@DecData[2],16);
CopyMemory(@Result[16],@DecData[31],FileToKenLen); //返回数据 16 字节密匙+文件令牌
end;
end;

function ProcessKickOut(Buff:TQQBuff;SKey:Array of Byte):TQQBuff;
var
Head:TInPacketHead;
EncBuff,DecData:TQQBuff;
EncLen,DataLen:Integer;
begin
CopyMemory(@Head,@Buff[0],LENGTH05_BASICIN);
EncLen:=Length(Buff)-LENGTH05_BASICIN-1;
SetLength(EncBuff,EncLen);
CopyMemory(@EncBuff[0],@Buff[LENGTH05_BASICIN],EncLen);
DecData:=QQDecrypt(EncBuff,SKey,DataLen);
if DataLen>0 then
begin
SetLength(Result,DataLen);
CopyMemory(@Result[0],@DecData[0],DataLen);
end;
end;

end.

⌨️ 快捷键说明

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