鱼C论坛

 找回密码
 立即注册
查看: 2521|回复: 4

[技术交流] VC++实现读取本地已登录的QQ号及应用代码

[复制链接]
发表于 2013-9-27 12:00:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. 不废话了直接上代码
复制代码
  1. #include <Windows.h>

  2. #include <Tlhelp32.h>

  3. #define TH32CS_SNAPPROCESS 0x00000002



  4. //对比数据,找到相同字节集的偏移  

  5. int GetInBuffer(const void *pStart, int nLen, const void *pFindBuffer, int nfLen)  

  6. {  

  7. for (int i = 0; i < nLen - nfLen; i++)  

  8. {  

  9. if (memcmp((void *)((ULONG)pStart + i), pFindBuffer, nfLen) == 0)  

  10. {  

  11. return i;  

  12. }  

  13. }  



  14. return -1;  

  15. }  



  16. void ReadQQ(DWORD dwProcessId)  

  17. {  

  18. //由于QQ是使用Unicode字符集的,所以我们使用wchar_t类型  

  19. static wchar_t QQDATA[] = L"Msg2.0.db";   

  20. //MsgEx.db,好像以前有个版本的数据库文件是MsgEx.db,用MsgEx来当关键字检索速度会变慢。  

  21. //但是QQ2010的是用Msg2.0.db的。  



  22. //打开进程  

  23. HANDLE hProcess = OpenProcess(PROCESS_VM_READ | PROCESS_QUERY_INFORMATION, 0, dwProcessId);  



  24. int nMemLen = 28, nMemStart;  

  25. void *pMemAddress = NULL;  

  26. BYTE *bMemBuffer;  



  27. MEMORY_BASIC_INFORMATION mbi;  

  28. memset(&mbi, 0, sizeof(MEMORY_BASIC_INFORMATION));  



  29. wchar_t szQQnumber[15];  

  30. szQQnumber[0] = 0;  



  31. //寻找进程空间  

  32. while (VirtualQueryEx(hProcess, pMemAddress, &mbi, nMemLen) != 0)  

  33. {  

  34. if (mbi.Type == MEM_PRIVATE && mbi.Protect == PAGE_READWRITE)  

  35. {  

  36. //分配足够的内存空间,存放数据  

  37. bMemBuffer = new BYTE[mbi.RegionSize + 1];  

  38. bMemBuffer[mbi.RegionSize] = 0;  



  39. if (ReadProcessMemory(hProcess, pMemAddress, bMemBuffer, mbi.RegionSize, NULL))  

  40. {  

  41. //尝试寻找当前内存空间中是否包含Msg2.0.db  

  42. nMemStart = GetInBuffer(bMemBuffer, mbi.RegionSize, QQDATA, sizeof(QQDATA));  



  43. if (nMemStart != -1)  

  44. {  

  45. //向前推一定位置,因为路径是 ..\[QQ号]\Msg2.0.db  



  46. wchar_t *pQQText = (wchar_t *)&bMemBuffer[nMemStart - 28];  

  47. wchar_t *pQQstart = wcsstr(pQQText, L"\");  

  48. if (pQQstart)  

  49. {  

  50. pQQstart++;  

  51. wchar_t *pQQEnd = wcsstr(pQQstart, L"\");  

  52. if (pQQEnd)  

  53. {  

  54. lstrcpynW(szQQnumber, pQQstart, pQQEnd - pQQstart + 1);  

  55. wprintf(L"%s\n", szQQnumber);  

  56. }  

  57. }  



  58. delete[] bMemBuffer;  

  59. break;  

  60. }  

  61. }  



  62. //销毁刚刚分配的内存空间  

  63. delete[] bMemBuffer;  



  64. }  

  65. pMemAddress = (void *)((ULONG)pMemAddress + mbi.RegionSize);  

  66. }  



  67. CloseHandle(hProcess);  

  68. }  



  69. void FindQQ()  

  70. {  

  71. DWORD dwProcessId = 0;  

  72. //进程快照~  

  73. HANDLE Snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);  



  74. PROCESSENTRY32 pl;  

  75. pl.dwSize=sizeof(PROCESSENTRY32);  



  76. bool bmore=Process32First(Snapshot, &pl);  

  77. while(bmore)  

  78. {  



  79. if(lstrcmpi(pl.szExeFile, _T("QQ.exe")) == 0)  

  80. {  

  81. //读取QQ号  

  82. ReadQQ(pl.th32ProcessID);  

  83. //dwProcessId = pl.th32ProcessID;  

  84. //循环,读取本地所有登录的QQ号。  

  85. //break;    跳出循环  

  86. }  

  87. bmore= Process32Next(Snapshot, &pl);  

  88. }  



  89. CloseHandle(Snapshot);  

  90. //  return dwProcessId;  

  91. }  



  92. int _tmain(int argc, _TCHAR* argv[])  

  93. {  

  94. FindQQ();  

  95. scanf("%*c");  

  96. return 0;  

  97. }  
复制代码


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-9-27 12:33:03 | 显示全部楼层
看起来好高端!看不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-9-27 12:51:13 | 显示全部楼层
支持一下下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-9-27 13:14:18 | 显示全部楼层
谢谢分享了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-9-27 16:23:28 | 显示全部楼层
//向前推一定位置,因为路径是 ..\[QQ号]\Msg2.0.db  

这句关键,学习了,,,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 01:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表