用VC获取正在运行的QQ号码

易语言-易语言获取本机登陆QQ 易语言获取本机登陆QQ源码 立即下载
用VC获取正在运行的QQ号码

收录人:admin 文章作者:佚名(从网上收集) 更新日期:2006-3-13 阅读次数:220
 

前段时间在论坛上, 易友 "wjkplx" 问 "如何取正在运行的QQ号" (dispbbs.asp?BoardID=1&ID=51048), 后来有"方德软件","近在眼前","goomoo","云德武" 几位热心的大侠各自提出了自己的思路及解决办法.

位易友的方法各不相同, 各有优点, 也都不完美. "方德软件"的方法是查找硬盘文件, 编程简单,但只能取最后一个登陆的QQ号码,不能取多个QQ的号码. "近在眼前"最初的办法好像是搜索QQ目录以数字命名的文件夹, 也同样有 "方德软件" 的缺点, "近在眼前"之后修改的版本, 采用了moogoo的方法. 相对来说, "goomoo" 的方法是最好的, 直接在QQ进程空间里查找QQ号码,因为QQ的任何数据都是放在进程空间里的(包括QQ号码),所以这个方法是绝对能成功的.当然,前提是QQ必须先登陆成功. "goomoo" 的方法可能是考虑得不够周全, 比如有些号码找不到, 而有些找到了又是别的号码."云城武" 的方法跟 "goomoo"是一样的.

   我花了两天时间, 仔细地研究了各位的方法, 并到网上搜索了相关的资料, 集合几位大侠的思路, 做出了取QQ登陆号码的程序. 这个程序可以提取腾讯QQ所有版本的登陆成功后的QQ号码. 可以在任何操作系统下使用. 运行速度快, 取号码准确, 目前为止,没有发现取错号.
   制作这个程序的过程中,我查阅了很多相关资料, 对系统编程有了进一步的了解, 下面我就编制这个程序的原理过程和一些心得写出来, 给大家参考.

一. 取QQ号码原理:

  QQ程序在运行过程中, 所有数据都是存放在进程空间中,QQ号码也不例外, 要取QQ号码, 从QQ进程空间着手是最保险的.
  怎样确定QQ号码在QQ进程空间的位置? "goomoo"的方法是搜索"clientuin="关键字,这个关键字之后紧跟着就是QQ号码. 但我发现, "clientuin="后面也不一定总是登陆的QQ号码,有时是别的字符,有时是本地登陆的其他QQ号码, 有时又是好友的QQ号码. 所以这个通过这个关键字来定位是不准确的.
  经过分析, 我发现,QQ运行过程中会读取"MsgEx.db"文件, 在这个文件的全路径中就包含了QQ号码, 路径格式为: QQ路径 +"/" + QQ登陆号码 + "/MsgEx.db", 找到"/MsgEx.db"关键字, 然后提取关键字前面的第一个"/"和第二个"/"之间的文本,不就是QQ号码了吗? 对,正是这样.
  在QQ进程中, "/MsgEx.db" 的地方很多, 有些前面跟的不是QQ号码.为了保证取到号码的正确性, 我们需要加入一些判断技巧. 大家知道,QQ号码都是数字格式的, 所以只要我们判断取出来的号码是不是数字, 如果不是数字,就继续查找,直到找到是数字的文本为止.


二. 怎样搜索QQ进程空间的数据?

  1.应用程序进程
  进程是当前操作系统下一个被加载到内存的、正在运行的应用程序的实例。每一个进程都是由内核对象和地址空间所组成的,内核对象可以让系统在其内存放有关进程的统计信息并使系统能够以此来管理进程,而地址空间则包括了所有程序模块的代码和数据以及线程堆栈、堆分配空间等动态分配的空间。进程仅仅是一个存在,是不能独自完成任何操作的,必须拥有至少一个在其环境下运行的线程,并由其负责执行在进程地址空间内的代码。在进程启动的同时即同时启动了一个线程,该线程被称作主线程或是执行线程,由此线程可以继续创建子线程。如果主线程退出,那么进程也就没有存在的可能了,系统将自动撤消该进程并完成对其地址空间的释放。
  加载到进程地址空间的每一个可执行文件或动态链接库文件的映象都会被分配一个与之相关联的全局唯一的实例句柄(Hinstance)。

  2. 进程空间
     在WIN32中,每个应用程序都可“看见”4GB的线性地址空间, 其中最开始的4MB和最后的2GB由操作系统保留,低的2GB为进程的私有空间(如果在Boot.ini文件中使用“/3GB”的开关可以使进程的私有空间增大到3GB,系统空间1GB)。对于每个进程来讲其虚拟的地址空间是连续的,实际上它们是以页面为单位离散的存在于物理内存中,一些可能被交换到硬盘上的页面文件中,而且还有大部分的空间是未提交(Uncommitted)的。一个进程的低2GB私有空间的分布如下表:

     范围          大小           作用
-----------------------------------------------------------------------------------------------------------------------------
     0x0~~0xFFFF           64 KB          不可访问区域,只是用来防止非法的指针访问,访问该范围的地址会导致访问违例。
     0x10000~~0x7FFEFFFF          2 GB 减去至少192 KB        进程的私有地址空间
     0x7FFDE000~~0x7FFDEFFF       4 KB          进程中第一个线程的线程环境块,即TEB(Thread environment block)
     0x7FFDF000~~0x7FFDFFFF       4 KB          进程的进程环境块,即PEB(Process environment block)
     0x7FFE0000~~0x7FFE0FFF       4 KB          一个共享的只读用户数据块,该块映射到到系统空间的一个数据块,
                                                               其中存放的是一些系统信息如系统时间、时钟的滴答数、系统版本号等。
                                                               这样访问这些信息的时候系统就不用切换到核心模式。
     0x7FFE1000~~0x7FFEFFFF       60 KB         不可访问
     0x7FFF0000~~0x7FFFFFFF       64 KB         不可访问,用于防止线程的缓冲跨越两种模式空间的边界


一个进程的高2GB空间具体分配如下:
     0xFFFFFFFF-0xC0000000的1GB      用于VxD、存储器管理和文件系统;
     0xBFFFFFFF-0x80000000的1GB      用于共享的WIN32 DLL、存储器映射文件和共享存储区;


     虚拟内存通常是由固定大小的块来实现的,在WIN32中这些块称为“页”,每页大小为4,096字节。在Intel CPU结构中,通过在一个控制寄存器中设置一位来启用分页。启用分页时CPU并不能直接访问内存,对每个地址要经过一个映射进程,通过一系列称作“页表”的查找表把虚拟内存地址映射成实际内存地址。通过使用硬件地址映射和页表WIN32可使虚拟内存即有好的性能而且还提供保护。利用处理器的页映射能力,操作系统为每个进程提供独立的从逻辑地址到物理地址的映射,使每个进程的地址空间对另一个进程完全不可见。

     我们要搜索另一个进程空间的数据, 要扫描范围的起点和终点不是从0~~2GB,而只是其中的一部分。要得到这个起点和终点可以使用API函数GetSystemInfo,函数的原型如下:
     VOID GetSystemInfo(
       LPSYSTEM_INFO lpSystemInfo
     );
     而在结构SYSTEM_INFO中有两个值:lpMinimumApplicationAddress和 lpMaximumApplicationAddress,
     就是一个应用程序可用的最小和最大的地址空间。这样我们就得到了要扫描的地址的起点和终点。那么是不是这起点和终点间所有的地址都要扫描呢?并不是这样的,因为一般情况下一个进程是用不着这么大(接近2GB)的地址空间的。因此一个进程的大部分地址空间都是未用(Free)或是保留(Reserved)的,真正用到的只是那些已提交(Committed)的内存而已。
         
     内存页面可以有三种状态:未用(Free)、保留(Reserved)和提交(Committed)。一个未用的页面是指该页面未被保留或是提交,对一个进程来讲一个未用的页面是不可访问的,访问这样的页面将导致访问违例。进程可以要求系统保留一些页面以备后用,系统返回一段保留的地址给进程,但是这些地址同样是不可访问的,进程若想使用这段地址空间,使用必须先提交。只有一个提交的页面才是一个真正可以访问的页面。不过你提交了一个页面,系统并不会马上分配物理页面,只有在该页面第一次被访问到时,系统才会分配页面并初始化。另外,这三个状态的两两之间都是可以相互转化的。
     这样我们的工作已大大减少了,只需要扫描那些提交的页面就好了。接下来要做的就是得到一个进程的已提交的页面范围。这就要用到另外两个API函数VirtualQuery和VirtualQueryEx。两个函数的功能相似,不同就是VirtualQuery只是查询本进程而VirtualQueryEx可以查询指定进程的内存空间信息,后者正是我们所需要的,函数原型如下:
     DWORD VirtualQueryEx(
         HANDLE hProcess,                     // 进程的句柄
         LPCVOID lpAddress,                   // 内存地址指针
         PMEMORY_BASIC_INformATION lpBuffer,  // 指向MEMORY_BASIC_INformATION结构的指针,用于返回内存空间的信息
         SIZE_T dwLength                      // lpBuffer的长度
     );

     再来看一下结构MEMORY_BASIC_INformATION的声明:
     typedef struct _MEMORY_BASIC_INformATION {
          PVOID BaseAddress;                  //查询内存块的基地址
          PVOID AllocationBase;               //用VirtualAlloc分配该内存时实际分配的基地址,可以小于BaseAddress,
                                              //也就是说BaseAddress一定包含在AllocationBase分配的范围内
          DWORD AllocationProtect;            //分配该页面时,页面的一些属性,如PAGE_READWRITE、PAGE_EXECUTE等
          SIZE_T RegionSize;                  //从BaseAddress开始,具有相同属性的页面的大小
          DWORD State;                        //页面的状态,有三种可能值:MEM_COMMIT、MEM_FREE和MEM_RESERVE,
                                              //这个参数对我们来说是最重要的了,从中我们便可知指定内存页面的状态了
          DWORD Protect;                      //页面的属性,其可能的取值与AllocationProtect相同
          DWORD Type;                         //该内存块的类型,有三种可能值:MEM_IMAGE、MEM_MAPPED和MEM_PRIVATE
     } MEMORY_BASIC_INformATION, *PMEMORY_BASIC_INformATION;

     进一步研究发现, 要搜索数据, 只要搜索 类型=MEM_PRIVATE 页面属性=PAGE_READWRITE 的内存块就好了, 这样可以大大提高搜索速度.

     这样我们就可得到进程中需要扫描的地址范围了。到这里剩下的问题就是要读取指定的进程的指定的地地址空间的内容了。这里要用到的是用于调试程序和错误处理(Debugging and Error Handling)的API函数中的ReadProcessMemory,它的原型如下:
     BOOL ReadProcessMemory(
          HANDLE hProcess,              // 被读取进程的句柄
          LPCVOID lpBaseAddress,        // 读的起始地址
          LPVOID lpBuffer,              // 存放读取数据缓冲区
          SIZE_T nSize,                 // 一次读取的字节数
          SIZE_T * lpNumberOfBytesRead  // 实际读取的字节数
     );

     参数很简单从它们的名字都可以猜出其意义了,这里就不多做说明了。要说明的是要对一个进程进行ReadProcessMemory操作,当前进程对要读的进程必须有PROCESS_VM_READ 和 PROCESS_QUERY_INformATION 访问权。要获得一个进程的句柄和对这个进程的一些控制权可以使用API函数OpenProcess得到,其使用不做详细说明了,只给出其原型:
     HANDLE OpenProcess(
          DWORD dwDesiredAccess,       // 访问标志
          BOOL bInheritHandle,         // 继承标志
          DWORD dwProcessId            // 进程ID
     );

   3.如何获取QQ进程ID

进程ID可由 Process32First 和 Process32Next 得到,这两个函数可以枚举出所有开启的进程。
Process32First 和 Process32Next原形如下:

 BOOL WINAPI Process32First
 (
     HANDLE hSnapshot      //由 CreateToolhelp32Snapshot 返回的系统快照句柄;
   LPPROCESSENTRY32 lppe   // 指向一个 PROCESSENTRY32 结构;
 );
 BOOL WINAPI Process32Next
 (
   HANDLE hSnapshot      // 由 CreateToolhelp32Snapshot 返回的系统快照句柄;
   LPPROCESSENTRY32 lppe // 指向一个 PROCESSENTRY32 结构;
 );

CreateToolhelp32Snapshot 原形如下:
 HANDLE WINAPI CreateToolhelp32Snapshot
 (
   DWORD dwFlags,      // 快照标志;
   DWORD th32ProcessID // 进程ID;
 );

现在需要的是进程的信息,所以将 dwFlags 指定为 TH32CS_SNAPPROCESS,th32ProcessID 忽略;

PROCESSENTRY32 结构如下:
 typedef struct tagPROCESSENTRY32 {
   DWORD dwSize;             // 结构大小;
   DWORD cntUsage;           // 此进程的引用计数;
   DWORD th32ProcessID;      // 进程ID;
   DWORD th32DefaultHeapID;  // 进程默认堆ID;
   DWORD th32ModuleID;       // 进程模块ID;
   DWORD cntThreads;         // 此进程开启的线程计数;
   DWORD th32ParentProcessID;// 父进程ID;
   LONG  pcPriClassBase;     // 线程优先权;
   DWORD dwFlags;            // 保留;
   char szExeFile[MAX_PATH]; // 进程全名;
 } PROCESSENTRY32;


三. 程序流程

  知道了上面的原理 , 编写程序就很简单了 .程序流程如下:

 1. 遍历系统进程, 找到所有QQ进程的ID;
 2. 通过ID打开每个QQ进程, 获得操作句柄;
 3. 读取QQ进程 "类型=MEM_PRIVATE 页面属性=PAGE_READWRITE" 的内存块到自己程序的缓冲区, 然后搜索关键字 "/MsgEx.db"位置;
 4. 提取关键字前面的QQ号码.
 5. 显示QQ号码.结束.

C#获取本机登录的QQ号码-源码 立即下载

相关推荐

C#获得当前登录的所有QQ号码,可支持win10_64

直接复制可用

HOOK(易语言高级部分)

Hook API_HOOK核心代码 这里时绝对跳转 FF,有些需要修改内存属性 下面在同进程中也使用通过,其他未测试 hook同进程MessageBoxA 未HOOK前 MessageBoxA HOOK后 MessageBoxA 我们正好把这7个字节改了. mov eax,0x401A5F jmp eax 类_InlineHook 这个就是利用相对跳转。E9 整体逻...

平凡者的专栏 1万+

易语言取已登录过的QQ号源码-易语言

易语言取已登录过的QQ号源码

枚举当前所有进程并获取当前登陆qq的号码

写在前言:       1.枚举进程实际上就是利用进程快照,和两个函数进行枚举当期存在的进程.       获取qq号,依照源码进行个人猜测得到. QQ为每个用户建立的db文件,应用程序会将这个文件载入到进程中,依照信息和相关文件路劲进行偏移字符串得到马赛克部分qq号信息,,关于其相关进程信息机制暂时没有想要去深入,以上言论也纯属揣测,暂时存档供后面研究,当前重心会放

山水人间。 1012

易语言取进程中所有QQ号源码

易语言取进程中所有QQ号源码。@资源源码站。

易语言枚举进程通过窗口句柄获取已经登录的QQ号码

今天小编就为大家分享一篇关于易语言枚举进程通过窗口句柄获取已经登录的QQ号码,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

分享一个在内存里搜索QQ号码的源码,源自看雪论坛

源码出于看雪论坛。源址已佚。先谢过     看结果         耗时47微秒 #include #include #include #include #include int SearchStr(PTSTR pszString, int iStrLen, PTSTR pszSearchStr) { int i = 0; int iSea

_Witch__的专栏 4523

易语言取QQ号码列表

易语言取QQ号码列表源码,取QQ号码列表,转换为号码,十六进制到十进制

VC如何获取QQ好友发来的信息

转自: http://zhidao.baidu.com/question/108544365.html?fr=ala0   VC如何获取QQ好友发来的信息 悬赏分:15 - 解决时间:2009-7-30 16:18 我想用VC写个程序,当QQ好友发来信息,右下角QQ图标闪动的时候,程序能获取QQ消息,QQ好友的QQ号码等等内容。我知道QQ消息是加密的,但是Windows

vbbianchengde的专栏 1530

使用 Vosk 实现语音识别

在近两年里,如果说想要在本地部署离线语音识别模型,那么和肯定是首选项。所以为什么要使用呢?

weixin_48967543的博客 9719

【DDSCAT——离散偶极近似仿真程序05】模型设计Matlab代码:多核壳球 、多核壳圆柱

简洁明了,后面及部分给出的都是模型设计的Matlab代码,这些代码都来自于一篇文章:Chin C W S. Localized Surface Plasmon Resonance with the use of Silver and Titanium Oxide Nanostructures[J]. 2011. 一、设计多个核壳球形结构 1)Matlab代码 ...

XD_Yangf的博客 4260

c语言盗取qq号程序,C++获取本机登陆过的QQ号码示例程序

// FileName: GetQQ.cpp#include "stdafx.h" // 如果编译出错请删除这句#include "GetQQ.h"GetQQ::GetQQ(){}GetQQ::~GetQQ(){}std::vector GetQQ::Init(void){TCHAR pathBuffer[MAX_PATH] = {0};::SHGetSpecialF...

weixin_39726131的博客 3322

使用 pip 安装 pygame 遇到的问题

今天尝试学习使用 pygame 时,按照我的习惯一发 pip install 下去,本以为很简单的事情,没想到遇到了不少问题,顺手记录一下。 0x01. 无法找到 “SDL.h” 文件 pygame 是使用 SDL 库写就的游戏框架,自然强依赖于 SDL,我的 python@3 是使用 macOS 的 brew 管理器直接安装的,可能由于不是编译安装的问题,缺少了这个库,继续使用 brew 安...

Mitscherlich的博客 8621

躲开QQ的本地密码验证

首先申明,笔者写这篇文章并非针对某人或某物,只是提出当前在广大用户以为安全的某些环境下,存在着一些潜在的危机。目的在于指出漏洞,交流技术,望高手指点。Tencent的QQ估计是国内个人上网用户的必备工具了,虽然现在的QQ比起三年前的版本,在安全方面有了长足的进步,但总觉得这些安全措施总是比不上Hacker的动作。由于笔者的朋友的QQ号掉了,想找回,但忘记了密码保护的提示问题答案,所以跑来找

conan0267的专栏 3182

新手必看:TwinCAT死活扫不到倍福CX5020?别慌,先检查这3个地方(附静态IP配置)

本文详细介绍了TwinCAT软件无法扫描到倍福CX5020控制器的常见问题及解决方案。从网络连通性检查、系统环境配置到静态IP设置,提供了一套完整的排查流程和优化建议,帮助新手快速解决通信问题,确保设备稳定运行。

weixin_27219587的博客 364

微信小程序协同工作和发布

微信小程序协同工作和发布

qq_53114527的博客 1620

开源QQ协议库QQProtocol

 基于QQ协议的资料网上有很多了,lumaqq是非常著名的java实现的QQ客户端,本QQ协议库也是基于这些资料和少量抓包分析包后实现的。本协议库是基于QQ2005协议,全VC6实现先贴出来QQ协议常量,基本上就是lumaqq完全移植的啦,所有协议常量都实现为类QQ的公共静态成员,给协议库中其它类使用,这么做完全是移植起来方便class QQ{public:      ...};CQQUser类:

红杉树(ecitnet)的博客 3737

基于simulink的自动紧急制动系统(AEB)的功能验证

本文手把手指导使用Simulink构建自动紧急制动系统(AEB)模型,通过五个关键步骤完成功能验证:1)搭建车辆动力学模型;2)设计雷达传感器模型;3)开发基于碰撞时间(TTC)的决策逻辑;4)设计标准化测试场景;5)进行仿真分析。重点讲解了AEB的多级触发机制(预警、辅助制动、自动制动)和核心指标验证方法,包括制动时机判断、减速度性能等。通过典型场景仿真,展示了AEB如何在2.5秒TTC触发预警,1.2秒TTC启动自动制动,有效避免碰撞。文章还展望了行人AEB、传感器融合等进阶研究方向,为自动驾驶安全系统

amy_mhd的博客 267

一个开源QQ协议库vc

基于QQ协议的资料网上有很多了,lumaqq是非常著名的Java实现的QQ客户端,本QQ协议库也是基于这些资料和少量抓包分析包后实现的。本协议库是基于QQ2005协议,全VC6实现   先贴出来QQ协议常量,基本上就是lumaqq完全移植的啦,所有协议常量都实现为类QQ的公共静态成员,给协议库中其它类使用,这么做完全是移植起来方便   class QQ   {   public:         ...

KimmKing的技术博客 502

调用魔搭API出现Please bind your Alibaba Cloud account before use的解决方案

本文主要介绍了调用魔搭API出现Please bind your Alibaba Cloud account before use解决方案,希望能对使用大模型的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 3万+

VMware16虚拟机:下载和安装教程

VMware16 虚拟机 下载和安装教程

MQ0522的博客 20万+

vc获取计算机用户名,vc获取计算机名和ip地址的方法

vc获取计算机名和ip地址的方法本文实例讲述了vc获取计算机名和ip地址的方法。分享给大家供大家参考。具体实现方法如下:#include #include #pragma comment(lib,"ws2_32.lib")void main(){WSADATA wsadata;WORD dwVersionRequested;int err;err=WSAStartup(dwVersionReque...

weixin_42348109的博客 1097

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

VC++获取QQ密码 (07年的文章,对于现在的QQ版本 已经失效)

<br />日无所事事,看到现在的QQ防盗技术越来越好,一般的钩子已经无法获取用户输入 的密码了,我也试图用发送WM_GETTEXT消息以及GetWindowText来获取密码文本框的数据,发现是不可行的。左思右想,既然程序本身的防范很 严密。那么我们就从用户这边来下手吧。毕竟很多用户对电脑不是很了解的,各位看官可不能扔丑鸡蛋啊。 <br /><br />  网吧里一般用户点击QQ快捷方式后就输入号码和密码,然后再登陆,这样我们就可以进行欺骗了。我们的程序运行在后台不停的检测当前激活的窗口是不是QQ登录的窗

nokianasty的专栏 1705

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

VC写的手机qq聊天记录导出工具

源文件下载地址:http://download.youkuaiyun.com/source/2248555最近把手机QQ从200版换到了2009版,于是以前的聊天记录也就看不到了。有时候想起和好友们开开心心聊天的点点滴滴,于是想把手机QQ里面的聊天记录导出到文本文件中方便以后没事儿时看看。参考了文章:http://blog.youkuaiyun.com/wenwu500/archive/2009/10/14/

潇湘宇的专栏 8144

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

上一篇: VC常用API
下一篇: 替换wsock32.dll
goingup
博客等级 码龄22年 52粉丝 158原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值