从进程中获取QQ号码

修正后的源码及EXE , 有易友提出源程序出错, 这里说明一下, 源程序是用4.0测试版5编写的 , 用3.8打开会出错。 前段时间在论坛上, 易友 "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

(0)

相关推荐

  • 在QQ客户端群聊天窗口中的QQ号码的排序规则

    在目前正式发布的版本中,QQ客户端群聊天窗口中的QQ号码的排序规则如下: 第一优先级: 在线状态:Q我吧>在线>忙碌>离开>静音>隐身或者离线 第二优先级: 创建者> ...

  • 如何在手机微信中绑定QQ号码

    QQ.微信都是现在十分常用的社交软件,有些新用户不知道如何在手机微信中绑定QQ号码,接下来小编就给大家介绍一下具体的操作步骤.具体如下:1. 首先第一步打开手机微信,先点击右下角[我]图标,接着根据下 ...

  • excel表格中的QQ号码怎么批量转为QQ邮箱?

    我们想给很多qq好友发邮件,有了qq号码,有几个办法可以把QQ号批量转换为QQ邮箱地址. 1.准备好qq号码. 2.将qq号码全部复制到excel中,然后在第二列增加@qq.com. 3.复制qq号码 ...

  • 怎样删除QQ登陆框中多余的QQ号码

    有些QQ号码不经常使用,或者先登陆框中的QQ号码过多,有没有想过删除QQ登陆框中多余的QQ号码,有些时候确实需要删除登陆框中多余的QQ,比如QQ已经不用了。登陆框中也显得干净整齐一些,那么如何删除QQ ...

  • 如何让自己的qq号码查询不到

    QQ绑定辅助帐号是什么? 我们将您的QQ号与您的邮件地址进行关联,您可以用邮件帐号代替QQ号码实现登录、显示、查找等功能。每个QQ号只能绑定一个邮件地址,您可以从QQ邮箱和其他邮箱中任选其一。 步骤一 ...

  • 年前保护自己的QQ号码安全的方法

    简单的讲,QQ使用安全=使用安全的电脑+安全的上网习惯+设置QQ密码保护。 一、使用安全的电脑 1、个人电脑 a)、设置操作系统登录密码,并开启系统防火墙; b)、安装杀毒软件并及时更新病毒特征库; ...

  • 如何关闭qq号码的查找功能?

    首先打开电脑,找到电脑桌面的qq启动快捷方式,双击启动qq. 然后弹出qq登录面板,输入qq账号和密码,点击登录按钮登录qq号. 登录完之后找到qq网名后面的小对号,然后点击小对号,在下拉面板中找到我 ...

  • 怎么隐藏qq号码

    隐藏qq号码可以让别人无法通过搜索找到你,也防止了别人骚扰你,隐藏qq号码具体应该怎么操作呢?一起来看看. 操作方法 01 打开qq点击面板左下角"三"字图标. 02 选择帮助,然 ...

  • 如何让QQ号码查找不到,关闭qq号码查找功能教程

    在查找某个好友给的正常号码后,不知道你有没有遇到过查找不到的情况,总是给人一种号码有误的感觉,但是QQ号明明是正确的,其实这只是对方在主显账号进行一下设置,下面我来说下如何让QQ号码查找不到,关闭qq ...