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

📄 qqoutpacket.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 QQOutPacket;

interface

Uses Windows,SysUtils,QQPROTO,QQVars,QQTEA,MD5;

function BuildHead(QQnum:Integer;Cmd:Byte):TPacketHead;

function BuildTokenReq(QQnum:Integer):TQQBuff;
function BuildLogout(QQnum:Integer;SKey,PKey:array of Byte):TQQBuff;
function BuildKeepLive(QQnum:Integer;SKey:array of Byte):TQQBuff;
function BuildLogin(QQnum:Integer;Mode:Boolean;InitKey,PwdKey,ToKen:array of Byte;ToKenLen:Integer):TQQBuff;
function BuildChangeStat(QQnum:Integer;Mode:Byte;SKey:array of Byte):TQQBuff;
function BuildSendIM(QQnum:Integer;NowTime:Integer;RecvQQ:Integer;Text:String;SKey:array of Byte;tSize,tMode,cR,cG,cB:Byte):TQQBuff;
function BuildIMReply(QQnum:Integer;RecvQQ:Integer;SendIP,Serial,SKey:array of Byte):TQQBuff;

implementation

function BuildHead(QQnum:Integer;Cmd:Byte):TPacketHead;
var
Buff:array[0..3] of byte;
begin
CopyMemory(@Buff[0],@QQNum,4);
Result.FLAG:=HEADER05_BASIC;
Result.Ver[0]:=$0E;
Result.Ver[1]:=$1B;
Result.Cmd[0]:=QCMD_HEAD;
Result.Cmd[1]:=CMD;
Result.Serial[0]:=Trunc(Random*256);
Result.Serial[1]:=Trunc(Random*256);
Result.QQnum[0]:=Buff[3];
Result.QQnum[1]:=Buff[2];
Result.QQnum[2]:=Buff[1];
Result.QQnum[3]:=Buff[0];
end;

function BuildTokenReq(QQnum:Integer):TQQBuff;
var Packet:TPacketReqLoginToken;
begin
Packet.Head:=BuildHead(QQnum,QCMD_REQ_LOGINTOKEN);
Packet.Unknow:=QCMD_UNKNOW00;
Packet.PackEnd:=HEADER05_TAIL;
SetLength(Result,SizeOf(TPacketReqLoginToken));
CopyMemory(@Result[0],@Packet,SizeOf(TPacketReqLoginToken));
end;

function BuildLogout(QQnum:Integer;SKey,PKey:array of Byte):TQQBuff;
var
Head:TPacketHead;
EncData:TQQBuff;
EncBuffLen:Integer;
begin
Head:=BuildHead(QQnum,QCMD_LOGUT);
EncData:=QQEncrypt(PKey,SKey,EncBuffLen);
SetLength(Result,EncBuffLen+LENGTH05_BASICOUT+1);
CopyMemory(@Result[0],@Head,LENGTH05_BASICOUT); //头部
CopyMemory(@Result[LENGTH05_BASICOUT],@EncData[0],EncBuffLen);
Result[Length(Result)-1]:=HEADER05_TAIL;
end;

function BuildKeepLive(QQnum:Integer;SKey:array of Byte):TQQBuff;
var
Head:TPacketHead;
EncBuff,EncData:TQQBuff;
EncBuffLen,I:Integer;
begin
Head:=BuildHead(QQnum,QCMD_KEEPALIVE);
EncBuffLen:=Length(Trim(IntToStr(QQNum)));
SetLength(EncBuff,EncBuffLen);
For I:=1 To EncBuffLen do EncBuff[I-1]:= StrToInt(Copy(Trim(IntToStr(QQNum)),I,1));
EncData:=QQEncrypt(EncBuff,SKey,EncBuffLen);
SetLength(Result,EncBuffLen+LENGTH05_BASICOUT+1);
CopyMemory(@Result[0],@Head,LENGTH05_BASICOUT); //头部
CopyMemory(@Result[LENGTH05_BASICOUT],@EncData[0],EncBuffLen);
Result[Length(Result)-1]:=HEADER05_TAIL;
end;

function BuildLogin(QQnum:Integer;Mode:Boolean;InitKey,PwdKey,ToKen:array of Byte;ToKenLen:Integer):TQQBuff;
var
Head:TPacketHead;
LoginData:array [0..LENGTH05_LOGINDATA-1] of Byte;
ZeroStr:array [0..15] of Byte;
PwdBuf,EncBuff:TQQBuff;
EncBuffLen:Integer;
begin
ZeroMemory(@ZeroStr[0],16);
ZeroMemory(@LoginData[0],LENGTH05_LOGINDATA);
Head:=BuildHead(QQnum,QCMD_LOGIN);
PwdBuf:=QQEncrypt(ZeroStr,PwdKey,EncBuffLen); //计算PasswordCode
CopyMemory(@LoginData[0],@PwdBuf[0],LENGTH05_KEY); //写入PasswordCode
CopyMemory(@LoginData[16],@LOGIN_16_51[0],Length(LOGIN_16_51)); //写入固定数据 16_51
if Mode then LoginData[52]:=STATUS_HIDE else LoginData[51]:=STATUS_ONLINE; //登陆模式
CopyMemory(@LoginData[53],@LOGIN_53_68[0],Length(LOGIN_53_68)); //写入固定数据 53_68
LoginData[69]:=ToKenLen;  //令牌长度
CopyMemory(@LoginData[70],@ToKen[0],ToKenLen); //写入令牌
LoginData[94]:=$01; //登陆模式
LoginData[95]:=$40; //固定内容
LoginData[96]:=$0A; //数据段数
CopyMemory(@LoginData[96],@LOGIN_SEGMENTS[0],Length(LOGIN_SEGMENTS)); //数据段
EncBuff:=QQEncrypt(LoginData,InitKey,EncBuffLen); //加密登陆数据
//开始组合数据
SetLength(Result,LENGTH05_LOGINPACKET);
ZeroMemory(@Result[0],LENGTH05_LOGINPACKET);
CopyMemory(@Result[0],@Head,LENGTH05_BASICOUT); //头部
CopyMemory(@Result[LENGTH05_BASICOUT],@InitKey[0],LENGTH05_KEY); //初始密钥
CopyMemory(@Result[LENGTH05_BASICOUT+LENGTH05_KEY],@EncBuff[0],EncBuffLen); //加密后内容
Result[459]:=HEADER05_TAIL; //结尾
end;

function BuildChangeStat(QQnum:Integer;Mode:Byte;SKey:array of Byte):TQQBuff;
var
Head:TPacketHead;
EncBuff,EncData:TQQBuff;
EncBuffLen:Integer;
begin
Head:=BuildHead(QQnum,QCMD_CHANGESTATUS);
SetLength(EncBuff,5);
EncBuff[0]:=Mode;
EncBuff[1]:=$00;
EncBuff[2]:=$00;
EncBuff[3]:=$00;
EncBuff[4]:=QCMD_NFAKECAM;
EncData:=QQEncrypt(EncBuff,SKey,EncBuffLen);
SetLength(Result,EncBuffLen+LENGTH05_BASICOUT+1);
CopyMemory(@Result[0],@Head,LENGTH05_BASICOUT); //头部
CopyMemory(@Result[LENGTH05_BASICOUT],@EncData[0],EncBuffLen);
Result[Length(Result)-1]:=HEADER05_TAIL;
end;

function BuildSendIM(QQnum:Integer;NowTime:Integer;RecvQQ:Integer;Text:String;SKey:array of Byte;tSize,tMode,cR,cG,cB:Byte):TQQBuff;
var
Head:TPacketHead;
EncBuff,EncData,TextBuf:TQQBuff;
EncBuffLen,I,TextCount,TextBit,TickCount:Integer;
TickCountBuff,SNum,RNum,NumBuff:array[0..3] of byte;
SessCode:MD5Digest;
SessCodeBuf:Array [0..19] of Byte;
begin
Head:=BuildHead(QQnum,QCMD_SENDIM);
TextCount:=-1;
For I:=1 To Length(Text) do
begin
TextBit:=Ord(Text[i]);
If (TextBit>-1) And (TextBit<256) Then
begin
TextCount:=TextCount+1;
SetLength(TextBuf,TextCount+1);
TextBuf[TextCount]:=Byte(TextBit);
end else begin
TextCount:=TextCount+2;
SetLength(TextBuf,TextCount+1);
TextBuf[TextCount-1]:=Hi(TextBit);
TextBuf[TextCount]:=Lo(TextBit);
end;
end;
EncBuffLen:=67+TextCount+1;
SetLength(EncBuff,EncBuffLen); //设置包长度

CopyMemory(@SNum[0],@QQNum,4);
NumBuff[0]:=SNum[3];
NumBuff[1]:=SNum[2];
NumBuff[2]:=SNum[1];
NumBuff[3]:=SNum[0];
CopyMemory(@SNum[0],@NumBuff[0],4); //得到发送QQ

CopyMemory(@RNum[0],@RecvQQ,4);
NumBuff[0]:=RNum[3];
NumBuff[1]:=RNum[2];
NumBuff[2]:=RNum[1];
NumBuff[3]:=RNum[0];
CopyMemory(@RNum[0],@NumBuff[0],4); //得到接收QQ

TickCount:=NowTime;
CopyMemory(@TickCountBuff[0],@TickCount,4); //得到发送时间

CopyMemory(@EncBuff[0],@SNum[0],4); //发送QQ
CopyMemory(@EncBuff[4],@RNum[0],4); //接收QQ
EncBuff[8]:=$0E;
EncBuff[9]:=$1B; //版本
CopyMemory(@EncBuff[10],@SNum[0],4); //发送QQ
CopyMemory(@EncBuff[14],@RNum[0],4); //接收QQ

CopyMemory(@SessCodeBuf[0],@SNum[0],4);
CopyMemory(@SessCodeBuf[4],@SKey[0],16); //把发送QQ与SessionKey合并
SessCode:=MD5ByteArray(SessCodeBuf); //得到合并后MD5数据

CopyMemory(@EncBuff[18],@SessCode[0],16); //发送QQ与SerssionKey的MD5结果
EncBuff[34]:=0;
EncBuff[35]:=$0B; //消息类型 手机短消息??
EncBuff[36]:=Trunc(Random * 256);
EncBuff[37]:=Trunc(Random * 256); //会话ID
EncBuff[38]:=TickCountBuff[3];
EncBuff[39]:=TickCountBuff[2];
EncBuff[40]:=TickCountBuff[1];
EncBuff[41]:=TickCountBuff[0]; //发送时间
EncBuff[42]:=0;
EncBuff[43]:=0; //发送QQ头像 
EncBuff[44]:=0;
EncBuff[45]:=0;
EncBuff[46]:=0;
EncBuff[47]:=1; //字体信息
EncBuff[48]:=1; //消息分片
EncBuff[49]:=0; //分片序号
EncBuff[50]:=Trunc(Random * 256);
EncBuff[51]:=Trunc(Random * 256); //消息ID
EncBuff[52]:=IM_NORMAL_AUTO; //消息回复类型
CopyMemory(@EncBuff[53],@TextBuf[0],Length(TextBuf)); //消息内容
EncBuff[High(EncBuff)-13]:=tSize;//字体大小
EncBuff[High(EncBuff)-12]:=$00;
EncBuff[High(EncBuff)-11]:=tMode;//字体状态 09 正常 29 粗体
EncBuff[High(EncBuff)-10]:=cR;//字体颜色 R
EncBuff[High(EncBuff)-9]:=cG; //字体颜色 G
EncBuff[High(EncBuff)-8]:=cB; //字体颜色 B
EncBuff[High(EncBuff)-7]:=$00; //未知
EncBuff[High(EncBuff)-6]:=$86;
EncBuff[High(EncBuff)-5]:=$02; //消息编码 GB
EncBuff[High(EncBuff)-4]:=$CB;
EncBuff[High(EncBuff)-3]:=$CE;
EncBuff[High(EncBuff)-2]:=$CC;
EncBuff[High(EncBuff)-1]:=$E5; //字体名称 宋体
EncBuff[High(EncBuff)]:=$0D; //本部分长度 13

EncData:=QQEncrypt(EncBuff,SKey,EncBuffLen);
SetLength(Result,EncBuffLen+LENGTH05_BASICOUT+1);
CopyMemory(@Result[0],@Head,LENGTH05_BASICOUT); //头部
CopyMemory(@Result[LENGTH05_BASICOUT],@EncData[0],EncBuffLen);
Result[Length(Result)-1]:=HEADER05_TAIL;
end;

function BuildIMReply(QQnum:Integer;RecvQQ:Integer;SendIP,Serial,SKey:array of Byte):TQQBuff;
var
Head:TPacketHead;
EncBuff,EncData:TQQBuff;
EncBuffLen:Integer;
NumBuff:array[0..3] of byte;
begin
Head:=BuildHead(QQnum,QCMD_RECVIM);
SetLength(EncBuff,16);

CopyMemory(@NumBuff[0],@RecvQQ,4);
EncBuff[0]:=NumBuff[3];
EncBuff[1]:=NumBuff[2];
EncBuff[2]:=NumBuff[1];
EncBuff[3]:=NumBuff[0]; //发送QQ
CopyMemory(@NumBuff[0],@QQnum,4);
EncBuff[4]:=NumBuff[3];
EncBuff[5]:=NumBuff[2];
EncBuff[6]:=NumBuff[1];
EncBuff[7]:=NumBuff[0]; //接收QQ

CopyMemory(@EncBuff[8],@Serial[0],4);
CopyMemory(@EncBuff[12],@SendIP[0],4);

EncData:=QQEncrypt(EncBuff,SKey,EncBuffLen);
SetLength(Result,EncBuffLen+LENGTH05_BASICOUT+1);
CopyMemory(@Result[0],@Head,LENGTH05_BASICOUT); //头部
CopyMemory(@Result[LENGTH05_BASICOUT],@EncData[0],EncBuffLen);
Result[Length(Result)-1]:=HEADER05_TAIL;
end;

end.

⌨️ 快捷键说明

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