VCL_MESSAGE_HANDLER(WM_USER_APIHOOK, TMessage, HOOKAPITest)
VCL_MESSAGE_HANDLER(WM_USER_GETSEND, TMessage, GetSend)
VCL_MESSAGE_HANDLER(WM_USER_GETRECV, TMessage, GetRecv)
END_MESSAGE_MAP(TForm)
以上就是拦截接收数据的全部了。结合以前的代码,运行程序,可以发现,拦截到的数据为所有的已经解密了的游戏数据,至于数据的解析,就看自己的了,这里给出一个解析的代码框架:
#define CMDVOID(a)
void CMDSAY##a(int cmd, int length, char* date)
#define RECVCASE(cmd,length,data)
case cmd:
CMDSAY##cmd(cmd,length,data);
break
class中的声明:
CMDVOID(10);
CMDVOID(11);
CMDVOID(21);
在接收到的函数GetRecv中:
void TwgHookForm::GetRecv(TMessage Message)
{
if (Message.WParam == 1)
{
cmdrecvstate = RECVCMD;//如果接收到的是1个字符,则接收到的是命令
}
else if (Message.WParam == 2)
{
cmdrecvstate = RECVLENGTH;//如果接收到长度是2个字符,则为将要接收到的数据长度
}
else
{
cmdrecvstate = RECVDATA;//否则接收到的就是数据
}
static int cmd,datalength;
switch (cmdrecvstate)
{
case RECVCMD:
cmd = *((int*)(Message.LParam));
return;
case RECVLENGTH:
datalength = *((int*)(Message.LParam));
return;
case RECVDATA:
if (datalength == Message.WParam)
{
Cmdsay(cmd, datalength, (char*)Message.LParam);//如果数据包没有被拆分,则进行命令解释
}
else
{//否则,打印这个包现在内容
Memo1->Lines->Add("注意:这个数据不完整:");
AnsiString astemp1 = "[接受][";
astemp1.cat_sprintf("%x][", cmd);
astemp1.cat_sprintf("应收长度:%d实际长度:%d][",datalength,Message.WParam);
BYTE *temp = (BYTE*)Message.LParam;
for (int i = 0; i < Message.WParam; i )
{
astemp1.cat_sprintf("%0.2x ", temp);
}
astemp1.cat_sprintf("][");
for (int i = 0; i < Message.WParam; i )
{
if(temp>=0x20)
astemp1.cat_sprintf("%c", temp);
else
astemp1.cat_sprintf(".");
}
astemp1.cat_sprintf("]");
Memo1->Lines->Add(astemp1);
}
return;
}
程序仅仅很简单的进行数据包的拦截和解析,对于被拆分的包不作处理,在真实应用中应该将这些包合并。
上面的接收规则对于9.16之前的大话程序有效,大话程序的一组数据会分成3次发送,首先接收到的是名字字,这个为1字节长度,接着是要接收的数据的长度,这个为2个字节,接下来就是数据了。如果真实接收到的数据和应该接收的数据长度不一样的话,表示这个包被拆分了。对于9.16之后的程序,大话不一定按照这样的规则来进行,因此上面的只适应于9.16之前的程序。下面是Cmdsay的函数实现:
void TwgHookForm::Cmdsay(int cmd, int length, char* date)
{
switch (cmd)
{
RECVCASE (10,length,date);
RECVCASE (11,length,date);
RECVCASE (21,length,date);
default://未被解析的命令
AnsiString astemp1 = "[接受][";
astemp1.cat_sprintf("%x][", cmd);
astemp1.cat_sprintf("%d]["