使是不把 QQ 闪烁窗口按出来,也是可以的,效果如图 2所示:

另外就是看雪上的“踏雪流云”也逆向过QQSpy,还提到过一种自动回复聊天的办法,
大家可以在看雪上面去找。自动回复聊天的原理就是自己调用AppUnit下面一个叫SendMsg
的函数(这个函数只是需要一个参数——QQ号),然后把自动回复数据的函数——
SendAutoReplyMsgToBuddy进行挂钩,修改里面数据。不过SendAutoReplyMsgToBuddy这个
函数好像现在位置已经变了,不再是AppUnit中的函数了(QQ2011改到AFUnit里面了)。
有关 QQ 自动发消息这个应用也很多,比如QQ 尾巴就是其中之一,不过大家有兴趣可以
自己研究。言归正题,就是前面介绍的这个函数是专门存个人聊天的,而群聊天以及讨论组
聊天不在这个函数里面,而是另外一个由KernelUnit模块导出的 SaveMsg。其代码如下所
示:
BOOL __cdecl NewSaveMsg_2( wchar_t *group,
wchar_t *un_1,
wchar_t *username,
wchar_t *un_1_,
int num_1,
int num_2,
struct ITXMsgPack * TXMsgPack,
struct ITXData* TXData )
{
//调试打印输出,时间
time_t Time;
struct tm *local;
WCHAR wszStringTime[20] = {0};
Time = (time_t)TrueGetMsgTime(TXMsgPack);
local = localtime(&Time);
swprintf(wszStringTime,L"%0.2d:%0.2d:%0.2d",
local->tm_hour,local->tm_min,local->tm_sec);
//
WCHAR wszStringBuffer[2*MAX_PATH] = {0};
CString strBuffer;
LPWSTR *lpBuffer =(LPWSTR *)
TrueGetMsgAbstract(strBuffer.GetBufferSetLength(4096), TXMsgPack);
CString strGroup(group);
LPWSTR lpName1 = NULL;
// TXStr Str;
// TrueGetGroupMemLongNickname(num_1,num_2,Str);
// OutputDebugStringW(Str.str);
if (strGroup.CompareNoCase("group") == 0)
{ if (TrueGetPublicName)
{
TrueGetGroupName(&lpName1, num_1);
}
swprintf(wszStringBuffer,L"[%ws] %ws(%d) %ws",lpName1,username,num_2,ws
zStringTime);
OutputDebugStringW(wszStringBuffer);
OutputDebugStringW(*lpBuffer);
}
else if (strGroup.CompareNoCase("discuss") == 0)
{
if (TrueGetDiscussName)
{
TrueGetDiscussName(&lpName1, num_1);
}
swprintf(wszStringBuffer,L"[%ws] %ws(%d) %ws",lpName1,username,num_2,ws
zStringTime);
OutputDebugStringW(wszStringBuffer);
OutputDebugStringW(*lpBuffer);
}
return OldSaveMsg_2(group, un_1, username, un_1_, num_1, num_2, TXMsgPack,
TXData);
}
同上我说明下里面用到的几个函数的功能:
(1) 函数GetGroupName是获得群名称的函数。
(2) 同上函数 GetDiscussName就是获得讨论组名称的函数。
(3) 另外,原版没有的,经过测试一个叫GetGroupMemLongNickname可以获得群中ID (好
像是非好友)的签名档。
最后说明下,我手里这版的QQSpy 对于表情的支持不理想,特别是默认表情。而第三方
表情,即是“图片”,可以通过拦截CreateFileW和MoveFileExW 获得路径,但是因为时
间有限,我没有具体深入了。另外就是这个方法应该是对2009 以上的有效果,但是我测试
的是 2011(也是通过的),具体情况大家还需要自己结合IDA测试。而对于QQ2008,本来
QQSpy有另外一套函数可以获得其聊天记录的,但是我没有逆了,第一是因为用得少,第二
是至少用读窗口的办法可以获得。
|