制作这个程序的过程中,我查阅了很多相关资料, 对系统编程有了进一步的了解, 下面我就编制这个程序的原理过程和一些心得写出来, 给大家参考. IEr`6|X
PdN\0B`
一. 取QQ号码原理: yc4f\0B/
Gv
nclnG
QQ程序在运行过程中, 所有数据都是存放在进程空间中,QQ号码也不例外, 要取QQ号码, 从QQ进程空间着手是最保险的. V7'x?
pt
怎样确定QQ号码在QQ进程空间的位置? "goomoo"的方法是搜索"clientuin="关键字,这个关键字之后紧跟着就是QQ号码. 但我发现, "clientuin="后面也不一定总是登陆的QQ号码,有时是别的字符,有时是本地登陆的其他QQ号码, 有时又是好友的QQ号码. 所以这个通过这个关键字来定位是不准确的. r~!%w(N|M
经过分析, 我发现,QQ运行过程中会读取"MsgEx.db"文件, 在这个文件的全路径中就包含了QQ号码, 路径格式为: QQ路径 +"\" + QQ登陆号码 + "\MsgEx.db", 找到"\MsgEx.db"关键字, 然后提取关键字前面的第一个"\"和第二个"\"之间的文本,不就是QQ号码了吗? 对,正是这样. pmD-]0
在QQ进程中, "\MsgEx.db" 的地方很多, 有些前面跟的不是QQ号码.为了保证取到号码的正确性, 我们需要加入一些判断技巧. 大家知道,QQ号码都是数字格式的, 所以只要我们判断取出来的号码是不是数字, 如果不是数字,就继续查找,直到找到是数字的文本为止.
#LyjJmQ
B+[Q$Q"
二. 怎样搜索QQ进程空间的数据? T2PFE4+Dp
a1sLRqo8
1.应用程序进程 7<'i #E~
进程是当前操作系统下一个被加载到内存的、正在运行的应用程序的实例。每一个进程都是由内核对象和地址空间所组成的,内核对象可以让系统在其内存放有关进程的统计信息并使系统能够以此来管理进程,而地址空间则包括了所有程序模块的代码和数据以及线程堆栈、堆分配空间等动态分配的空间。进程仅仅是一个存在,是不能独自完成任何操作的,必须拥有至少一个在其环境下运行的线程,并由其负责执行在进程地址空间内的代码。在进程启动的同时即同时启动了一个线程,该线程被称作主线程或是执行线程,由此线程可以继续创建子线程。如果主线程退出,那么进程也就没有存在的可能了,系统将自动撤消该进程并完成对其地址空间的释放。 :-@P3F[0
加载到进程地址空间的每一个可执行文件或动态链接库文件的映象都会被分配一个与之相关联的全局唯一的实例句柄(Hinstance)。 d*:qFq_
/ZN5WK
2. 进程空间 AdS_-Cm
在WIN32中,每个应用程序都可“看见”4GB的线性地址空间, 其中最开始的4MB和最后的2GB由操作系统保留,低的2GB为进程的私有空间(如果在Boot.ini文件中使用“/3GB”的开关可以使进程的私有空间增大到3GB,系统空间1GB)。对于每个进程来讲其虚拟的地址空间是连续的,实际上它们是以页面为单位离散的存在于物理内存中,一些可能被交换到硬盘上的页面文件中,而且还有大部分的空间是未提交(Uncommitted)的。一个进程的低2GB私有空间的分布如下表: sU_4+Mk
]fS~N9B
范围 大小 作用 )"3oe ?
----------------------------------------------------------------------------------------------------------------------------- ,) jB<`
0x0~~0xFFFF 64 KB 不可访问区域,只是用来防止非法的指针访问,访问该范围的地址会导致访问违例。 x4A~MuGU
0x10000~~0x7FFEFFFF 2 GB 减去至少192 KB 进程的私有地址空间 wQS w&G
0x7FFDE000~~0x7FFDEFFF 4 KB 进程中第一个线程的线程环境块,即TEB(Thread environment block) K]*ERAfM%m
0x7FFDF000~~0x7FFDFFFF 4 KB 进程的进程环境块,即PEB(Process environment block) !J(,M)p!
0x7FFE0000~~0x7FFE0FFF 4 KB 一个共享的只读用户数据块,该块映射到到系统空间的一个数据块, LuQ
M$/i
其中存放的是一些系统信息如系统时间、时钟的滴答数、系统版本号等。 bme#G{[)Y
这样访问这些信息的时候系统就不用切换到核心模式。 <21^{ yt1
0x7FFE1000~~0x7FFEFFFF 60 KB 不可访问 `*9FKs
0x7FFF0000~~0x7FFFFFFF 64 KB 不可访问,用于防止线程的缓冲跨越两种模式空间的边界 *_rGBW
R M+K":p
0Lz56e'j
一个进程的高2GB空间具体分配如下: Q/`o6xv
0xFFFFFFFF-0xC0000000的1GB 用于VxD、存储器管理和文件系统; tYNt>9L|
0xBFFFFFFF-0x80000000的1GB 用于共享的WIN32 DLL、存储器映射文件和共享存储区; Wq&c,H
m]}"FMH$
"8dnFrE
虚拟内存通常是由固定大小的块来实现的,在WIN32中这些块称为“页”,每页大小为4,096字节。在Intel CPU结构中,通过在一个控制寄存器中设置一位来启用分页。启用分页时CPU并不能直接访问内存,对每个地址要经过一个映射进程,通过一系列称作“页表”的查找表把虚拟内存地址映射成实际内存地址。通过使用硬件地址映射和页表WIN32可使虚拟内存即有好的性能而且还提供保护。利用处理器的页映射能力,操作系统为每个进程提供独立的从逻辑地址到物理地址的映射,使每个进程的地址空间对另一个进程完全不可见。 (s*Uz3sq
5)NfZN#&