关于QQ2009聊天消息获取原理说明 .
来源:互联网 发布:红色草原软件 编辑:程序博客网 时间:2024/06/05 11:38
QQ2009 聊天界面消息获取文档说明
版权所有: Goldant
时间: 2009-2-8
Blog: http://blog.csdn.net/antswallow
重要声明 : 任何第三方个人或公司使用该技术对他人聊天消息进行监控 , 需经过被控方同意 , 任何由此引起的法律纠风均与本人无关 .
内容 : 本文简述 QQ09 聊天界面获取的基本原理 , 对于其它所需的技术以及细节将一笔带过 , 需第三方人员自行实现完成 . (个人已实现 QQ08/09 MSN 8.5+ 版本的聊天监控,有时间会把细节处理及其它关键技术后续发表出来)
由于 QQ2009 采用了最新的 UI 界面技术 , 使得无法再通取窗口句柄的方式来取得用户的聊天消息 . 查看了下 QQ 聊天窗体 , 发现采用的是 RichEdit 4.1 控件 . 对于这种无窗口句柄的控件 , 只能通过拦截内部的 COM 指针 , 来获取聊天消息 . 经过跟踪研究 , 只需要拦截掉 RichEdit.dll 中的 CreateService, 就可以取得 COM 指针 , 然后利用这 COM 指针去获取聊天消息 .
为了能够拦截掉 COM 指针需要将一 DLL 注入 QQ 进程之中 , 至于如何注入进程 , 网上有很多教程 , 这里不作详述 ,CreateRemoteThread 以及 SetHook 都可以 , 逻辑代码如下 :
DWORD pid =GetProcessID(_T("QQ.exe"));
HANDLE hProcess =OpenProcess(PROCESS_ALL_ACCESS,false,pid);
void *pDataRemote=
(char*)VirtualAllocEx(hProcess,0,cb, MEM_COMMIT,PAGE_READWRITE );
ret = WriteProcessMemory( hProcess, pDataRemote, "qqinject.dll", cb, NULL);
CreateRemoteThread(
hProcess, NULL, 0,
(LPTHREAD_START_ROUTINE)
GetProcAddress(GetModuleHandle(_T("KERNEL32.DLL")),"LoadLibraryW"),
pDataRemote, 0 , NULL);
当 DLL 成功注入 QQ 进程后 , 便可以开始进行 API 拦截 ,API 拦截不在本文档所述之内 , 所需拦截的 API 函数 , 需包含相应的头文件 , 建议在 VS2003 下编绎 ,VC6 还需下载 SDK, 如下 :
#include <richedit.h>
#include <imm.h>
#include <textserv.h>
#include <tom.h>
#pragma comment(lib,"riched20.lib")
const IID IID_ITextServices = {
// 由于此 IID 在 SDK 中的 riched20.lib 是错误的 , 需重新定义
0x8d33f740, 0xcf58, 0x11ce, {0xa8, 0x9d, 0x00, 0xaa, 0x00, 0x6c, 0xad, 0xc5}
};
// 函数拦截代码 用户自行完成 , 需拦截掉 riched20.dll 中的导出函数 CreateService
CreateService 函数原型如下 :
// 定义所需拦截函数的函数指针 PFCreateTextServices
typedef HRESULT (STDAPICALLTYPE * PFCreateTextServices)(
IUnknown *punkOuter,
ITextHost *pITextHost,
IUnknown **ppUnk);
// 此函数为自定义的函数 , 用户需自行完成 API 的拦截 , 使得
// 当 QQ 进程调用 CreateService 的时候 , 能够先跳转到此函数 ,
STDAPI MyCreateTextServices(
IUnknown *punkOuter,
ITextHost *pITextHost,
IUnknown **ppUnk)
{
// 找到原始函数的地址
PFCreateTextServices proc = (PFCreateTextServices) FindHook ("CreateTextServices",NULL);
// 执行原始函数 , 以取得当前 COM 的指针
HRESULT ret=proc(punkOuter,pITextHost,ppUnk);
// 得到 COM 的 IID_ItextServices 接口
CComQIPtr<ITextServices,&IID_ITextServices> my_textServ;
my_textServ=*ppUnk;
// 需自行过滤掉没用的接口指针
// 保存 QQ 聊天消息窗体的 COM 接口
Save(my_textServ);
return ret;
}
// 查询 QQ 聊天内容
BSTR GetQQContent(){
BSTR bs;
my_textServ->TxGetText(&bs); // 取得存文本聊天消息
// 如果想要修改聊天消息 , 请自行参与 RichEdit 控件 SDK,
return bs;
}
- 关于QQ2009聊天消息获取原理说明
- 关于QQ2009聊天消息获取原理说明 .
- QQ2009打开聊天窗口CPU100%解决办法
- 关于qq2009的解密问题
- 实时获取微信聊天消息记录
- iOS关于聊天消息提醒铃声
- QQ2009聊天文本记录器 完成发布,支持目前最新的QQ2009 SP1版本。
- Android QQ、微信聊天消息界面设计原理与实现
- Android QQ、微信聊天消息界面设计原理与实现
- 第三方apk实时获取微信聊天消息记录
- 关于XMPP和openfire中的消息回执和聊天状态
- 关于mqtt不适合移动聊天消息推送的个人见解
- Android集成网易云信(关于聊天发送位置消息)
- 关于消息队列的一点说明
- 关于data2ext/data2sd的一些原理说明
- 关于SSL原理的说明理解
- comet 推送 消息 聊天
- 消息推送,实时聊天
- 多少块地(求可以分成多少个独立的区域)
- 在三层架构的B层应用TransactionScope事务
- Linux下判断文件或文件夹是否存在的方法
- 各自天涯 各自珍重
- memcached全面剖析–3.memcached的删除机制和发展方向
- 关于QQ2009聊天消息获取原理说明 .
- ADO.Net 精简的三层架构(初学者)
- ZOJ 2433 Highways(水题)
- 虚拟主机安全方案
- 位移进制运算
- memcached全面剖析–4. memcached的分布式算法
- 如何保存Matlab绘制出来的图像
- 从B 树、B+ 树、B* 树谈到R 树
- memcached全面剖析–5. memcached的应用和兼容程序