论文部分内容阅读
2006年刚到,稀饭编辑部就接到了一位匿名读者的“报案”。经过编辑部诸位高手的调查后,决定将此案件定性为“狗年头号盗窃案”!
稀饭编辑部案情研讨会[会议记录]
编辑A:“现在内存这么便宜!偷了再买呗!”
编辑B:“这不是买不买的问题,现在问题的关键是谁偷了内存,究竟是装机器的奸商虚报了内存容量?还是Windows本身内存占用过多?或者是软件隐瞒了真实的内存使用情况!”
编辑C:“那就分头调查去吧!”
大家的效率非常高,刚说完就做鸟兽散状……
图1
调查结果1:进程内存分配揭秘
要调查内存的使用情况,当然就得从Windows系统本身开始讲起。以Windows 2000/XP为例,在运行程序时,Windows会将这个程序文件装载到内存中,然后为其分配独立的地址空间,这就好比一家公司招了新员工之后要为其分配工位一样。
1.什么叫进程
很多程序在运行多次后会提示“只允许一个进程实例”,那么进程究竟是什么呢?进程可以理解为一个运行中的程序的实例。只允许同时运行一个实例的程序(比如杀毒软件)其实就是在程序开始运行时检测一下进程列表中是否有了该程序的进程存在,如果有则退出,而新版本的QQ也使用了这种技术,当你试图打个N个QQ时,就会收到不能打开更多QQ的错误提示。
2.进程和线程的区别
上期的《看清破绽 誓与BUG斗争到底》中提到MailWasher等软件由于界面和运算没有使用多线程而造成假死,那进程和线程有什么区别呢?你可以把进程想像成一个接线板,接线板本身并不实现任何家电的功能,但家电把插座插上接线板之后就能开始工作了,线程就是各种各样不同的家电,有的用来看电视,有的用来洗衣服。Windows规定每个进程至少要有一个线程(称为默认线程),而当一个进程中包含多个线程时,这些线程都可以共享一个进程的内存资源。
图2
3.不同程序之间能不能共享内存
Windows 9x与Windows 2000/XP最大的不同就在于:前者将所有进程所使用的内存放在一起,而后者则为每一个进程分配独立的内存,也就是说进程间是不能互相读取内存的,比如QQ是不会知道MSN在内存中保存了些什么的。在Windows 9x中程序可以直接读取某个地址中的内存,而在Windows 2000/XP中这是不允许的。
调查结果2:Windows的内存有“假”
虽然现在内存非常便宜,不过要让每个人都装上数GB的内存条显然也是不可能的,还好在那一寸内存一寸金的时代,有人发明了虚拟内存技术。所谓虚拟内存,就是在硬盘空间中开辟出一块空间,供系统读取和写入本来要在内存上读写的数据。
1.虚拟内存能不能替代物理内存
虚拟内存的管理是在由操作系统的“软”方法模拟实现的,系统本身必须通过物理内存才能启动,没有启动系统就没有办法使用虚拟内存,所以说要让虚拟内存完全替代物理内存就好像讨论先有鸡还是先有蛋一样……
2.虚拟内存是不是越大越好
硬盘的速度快还是内存的速度快?当然是内存。虚拟内存其实就是硬盘中的临时文件,所以虚拟内存的速度是无法和物理内存相提并论的。在可能的情况下,我们应该尽可能使用物理内存。
3.能不能把虚拟内存禁用了
如果你是一个有数GB物理内存的有钱人,那么看了上面那句“虚拟内存的速度……”之后肯定会想方设法把虚拟内存设得更小,最直接的方法就是直接禁用。有一句话叫物极必反,虚拟内存也是如此,如果完全禁用虚拟内存的话,你的系统就会出现各种各样奇怪的故障,比如运行Photoshop等大程序时出现错误,玩游戏时错误退出等。
图3
调查结果3:
“任务管理器”隐瞒内存占用
软件说明中的“仅占用xxKB/MB”内存大多都是指该程序在运行时所占的物理内存,而并不包括虚拟内存,在“任务管理器”的“进程”选项卡中见到的“内存使用”也是物理内存!网站上写得不亦乐乎的软件评测中也没有发现“任务管理器”的骗局!
1.逼“任务管理器”说真话
打开“任务管理器”,选择菜单“查看→选择列”,勾选“虚拟内存大小”(见图2),点击“确定”,然后把“任务管理器”的窗口横向拉大,就能看到每个进程所占用的虚拟内存了。
软件的真实内存占用=“内存使用”+“虚拟内存大小”
2.除了隐瞒,还有欺骗
故意不标虚拟内存使用情况的行为称为隐瞒,那么在软件编写时故意将“任务管理器”默认显示的物理内存占用减小,转移到看不见的虚拟内存中,这种行为就称为欺骗了。在Windows提供的程序接口(即用来帮助应用程序调用系统功能的开关)中,提供了一个内存转移函数,在编写程序时只需加入这条函数,就能把程序运行时占用的物理内存转移到虚拟内存中去。很多软件就是用了这个不见光的技巧欺骗了大家的眼睛,不过别以为这个函数只能用来干坏事,内存整理工具也用了此方法,但它是用此技术来调整物理内存及虚拟内存的比例,并以此提高系统效率的。
3.逼出来的一定是真话吗
在“任务管理器”已经可以计算每个进程所用的内存总值了,但这样的计算方式一定保险吗?有很多种技术可以使内存占用完全“隐身”,比如虚拟设备、进程插入等,这类技术在杀毒软件中应用得非常广泛。
小提示
结果已经显而易见了,是软件和“任务管理器”一起偷走了那位不幸读者的内存。同时我们又发现了很多有意思的东西,比如杀毒软件的虚拟设备及进程插入技术,那就一起给“侦破”了吧!
意外收获:杀毒软件的系统资源占用
稀饭编辑部派出的精锐调查小组果然不俗,侦破一个案件后竟然又发现了另一个案件的线索,于是突发案件调查行动又开始了。只一杯茶的工夫,一份关于杀毒软件制造“眼球陷阱”的报告就出现在了调查小组组长的桌子上……
眼球陷阱1:伪装成硬件抢内存
杀毒软件要查杀病毒,就必须抢在病毒之前得到系统控制权,为什么?要用一个应用程序级别的杀毒软件去对抗一个驱动级的病毒简直是天方夜潭。简言之,要杀毒,就必须比病毒更“毒”,所以杀毒软件中通常会在系统中安装虚拟设备驱动(见图3),让自身嵌入到操作系统的最底层。在系统看来,杀毒软件嵌入的虚拟设备就和真实的硬件一样,而这些虚拟设备所占用的内存和CPU时间在“任务管理器”中是看不见的。
眼球陷阱2:插入其他进程中
在上文中大家已经知道了进程中可以包含多个线程,而Windows中提供了一种机制,能够让某个进程将自身或自身的一部分(DLL文件)插入到别的进程中去,作为一个线程来运行,这种技术称为“进程插入”。就像特工一样,将看门的打晕,然后穿上他的衣服,混入某座大楼中……这样在“任务管理器”中就无法看到这个被插入的程序在运行了。
进程中的每个线程都能访问这个进程中共享的内存资源,很多盗号木马使用进程插入除了隐蔽性的考虑外,还有另一个目的,那就是盗取被插入进程的共享内存资源,比如QQ的内存中包含了当前用户输入的QQ号和密码,如果一个木马插入了QQ的进程,那它就能够读取到这些信息!更恐怖的事情还不止如此,在插入进程后,这个“间谍”线程占用的内存和CPU资源都“嫁祸”给了被插入的进程头上。
TIPS
小提示
Windows默认的“任务管理器”只能列出系统中的所有进程,当你需要查杀木马或恶意程序时肯定想知道每个进程中究竟加载了哪些模块(使用了哪些DLL文件),那么就需要使用更好的进程管理工具,比如Process Explorer(下载地址:http://www.onlinedown.net/soft/31805.htm)。
TIPS
小提示
★右击“我的电脑”选择“属性”,在“常规”选项卡中可以看到物理内存大小,在“高级”选项卡中点击“性能→设置”,在“性能选项”窗口的“高级”选项卡中点击“更改”,就能自由设置虚拟内存的大小和位置(见图1)。
TIPS
小提示
★Windows默认分配的内存为物理内存的1.5倍,一般情况下使用这个设置即可,如果你的内存在1GB以上,建议将虚拟内存的默认“初始大小”设置为1GB或以下。虚拟内存的默认位置也不建议更改,除非你的系统分区空间紧张。
TIPS
小提示
内存整理、优化工具在使用时应注意不要将转移量设得过高,否则应用程序需要的数据都被转移虚拟内存中,在实际使用时反而会降低效率。
TIPS
小提示
杀毒软件加入的虚拟设备在软件本身卸载后可能还存在,这些设备有可能导致兼容性问题,所以建议在“设备管理器”中选择“查看→显示隐藏设备”,然后找出未卸载掉的虚拟设备并手动删除(一般这类设备的名称中都带有软件本身或厂商的名称)。
稀饭编辑部案情研讨会[会议记录]
编辑A:“现在内存这么便宜!偷了再买呗!”
编辑B:“这不是买不买的问题,现在问题的关键是谁偷了内存,究竟是装机器的奸商虚报了内存容量?还是Windows本身内存占用过多?或者是软件隐瞒了真实的内存使用情况!”
编辑C:“那就分头调查去吧!”
大家的效率非常高,刚说完就做鸟兽散状……
图1
调查结果1:进程内存分配揭秘
要调查内存的使用情况,当然就得从Windows系统本身开始讲起。以Windows 2000/XP为例,在运行程序时,Windows会将这个程序文件装载到内存中,然后为其分配独立的地址空间,这就好比一家公司招了新员工之后要为其分配工位一样。
1.什么叫进程
很多程序在运行多次后会提示“只允许一个进程实例”,那么进程究竟是什么呢?进程可以理解为一个运行中的程序的实例。只允许同时运行一个实例的程序(比如杀毒软件)其实就是在程序开始运行时检测一下进程列表中是否有了该程序的进程存在,如果有则退出,而新版本的QQ也使用了这种技术,当你试图打个N个QQ时,就会收到不能打开更多QQ的错误提示。
2.进程和线程的区别
上期的《看清破绽 誓与BUG斗争到底》中提到MailWasher等软件由于界面和运算没有使用多线程而造成假死,那进程和线程有什么区别呢?你可以把进程想像成一个接线板,接线板本身并不实现任何家电的功能,但家电把插座插上接线板之后就能开始工作了,线程就是各种各样不同的家电,有的用来看电视,有的用来洗衣服。Windows规定每个进程至少要有一个线程(称为默认线程),而当一个进程中包含多个线程时,这些线程都可以共享一个进程的内存资源。
图2
3.不同程序之间能不能共享内存
Windows 9x与Windows 2000/XP最大的不同就在于:前者将所有进程所使用的内存放在一起,而后者则为每一个进程分配独立的内存,也就是说进程间是不能互相读取内存的,比如QQ是不会知道MSN在内存中保存了些什么的。在Windows 9x中程序可以直接读取某个地址中的内存,而在Windows 2000/XP中这是不允许的。
调查结果2:Windows的内存有“假”
虽然现在内存非常便宜,不过要让每个人都装上数GB的内存条显然也是不可能的,还好在那一寸内存一寸金的时代,有人发明了虚拟内存技术。所谓虚拟内存,就是在硬盘空间中开辟出一块空间,供系统读取和写入本来要在内存上读写的数据。
1.虚拟内存能不能替代物理内存
虚拟内存的管理是在由操作系统的“软”方法模拟实现的,系统本身必须通过物理内存才能启动,没有启动系统就没有办法使用虚拟内存,所以说要让虚拟内存完全替代物理内存就好像讨论先有鸡还是先有蛋一样……
2.虚拟内存是不是越大越好
硬盘的速度快还是内存的速度快?当然是内存。虚拟内存其实就是硬盘中的临时文件,所以虚拟内存的速度是无法和物理内存相提并论的。在可能的情况下,我们应该尽可能使用物理内存。
3.能不能把虚拟内存禁用了
如果你是一个有数GB物理内存的有钱人,那么看了上面那句“虚拟内存的速度……”之后肯定会想方设法把虚拟内存设得更小,最直接的方法就是直接禁用。有一句话叫物极必反,虚拟内存也是如此,如果完全禁用虚拟内存的话,你的系统就会出现各种各样奇怪的故障,比如运行Photoshop等大程序时出现错误,玩游戏时错误退出等。
图3
调查结果3:
“任务管理器”隐瞒内存占用
软件说明中的“仅占用xxKB/MB”内存大多都是指该程序在运行时所占的物理内存,而并不包括虚拟内存,在“任务管理器”的“进程”选项卡中见到的“内存使用”也是物理内存!网站上写得不亦乐乎的软件评测中也没有发现“任务管理器”的骗局!
1.逼“任务管理器”说真话
打开“任务管理器”,选择菜单“查看→选择列”,勾选“虚拟内存大小”(见图2),点击“确定”,然后把“任务管理器”的窗口横向拉大,就能看到每个进程所占用的虚拟内存了。
软件的真实内存占用=“内存使用”+“虚拟内存大小”
2.除了隐瞒,还有欺骗
故意不标虚拟内存使用情况的行为称为隐瞒,那么在软件编写时故意将“任务管理器”默认显示的物理内存占用减小,转移到看不见的虚拟内存中,这种行为就称为欺骗了。在Windows提供的程序接口(即用来帮助应用程序调用系统功能的开关)中,提供了一个内存转移函数,在编写程序时只需加入这条函数,就能把程序运行时占用的物理内存转移到虚拟内存中去。很多软件就是用了这个不见光的技巧欺骗了大家的眼睛,不过别以为这个函数只能用来干坏事,内存整理工具也用了此方法,但它是用此技术来调整物理内存及虚拟内存的比例,并以此提高系统效率的。
3.逼出来的一定是真话吗
在“任务管理器”已经可以计算每个进程所用的内存总值了,但这样的计算方式一定保险吗?有很多种技术可以使内存占用完全“隐身”,比如虚拟设备、进程插入等,这类技术在杀毒软件中应用得非常广泛。
小提示
结果已经显而易见了,是软件和“任务管理器”一起偷走了那位不幸读者的内存。同时我们又发现了很多有意思的东西,比如杀毒软件的虚拟设备及进程插入技术,那就一起给“侦破”了吧!
意外收获:杀毒软件的系统资源占用
稀饭编辑部派出的精锐调查小组果然不俗,侦破一个案件后竟然又发现了另一个案件的线索,于是突发案件调查行动又开始了。只一杯茶的工夫,一份关于杀毒软件制造“眼球陷阱”的报告就出现在了调查小组组长的桌子上……
眼球陷阱1:伪装成硬件抢内存
杀毒软件要查杀病毒,就必须抢在病毒之前得到系统控制权,为什么?要用一个应用程序级别的杀毒软件去对抗一个驱动级的病毒简直是天方夜潭。简言之,要杀毒,就必须比病毒更“毒”,所以杀毒软件中通常会在系统中安装虚拟设备驱动(见图3),让自身嵌入到操作系统的最底层。在系统看来,杀毒软件嵌入的虚拟设备就和真实的硬件一样,而这些虚拟设备所占用的内存和CPU时间在“任务管理器”中是看不见的。
眼球陷阱2:插入其他进程中
在上文中大家已经知道了进程中可以包含多个线程,而Windows中提供了一种机制,能够让某个进程将自身或自身的一部分(DLL文件)插入到别的进程中去,作为一个线程来运行,这种技术称为“进程插入”。就像特工一样,将看门的打晕,然后穿上他的衣服,混入某座大楼中……这样在“任务管理器”中就无法看到这个被插入的程序在运行了。
进程中的每个线程都能访问这个进程中共享的内存资源,很多盗号木马使用进程插入除了隐蔽性的考虑外,还有另一个目的,那就是盗取被插入进程的共享内存资源,比如QQ的内存中包含了当前用户输入的QQ号和密码,如果一个木马插入了QQ的进程,那它就能够读取到这些信息!更恐怖的事情还不止如此,在插入进程后,这个“间谍”线程占用的内存和CPU资源都“嫁祸”给了被插入的进程头上。
TIPS
小提示
Windows默认的“任务管理器”只能列出系统中的所有进程,当你需要查杀木马或恶意程序时肯定想知道每个进程中究竟加载了哪些模块(使用了哪些DLL文件),那么就需要使用更好的进程管理工具,比如Process Explorer(下载地址:http://www.onlinedown.net/soft/31805.htm)。
TIPS
小提示
★右击“我的电脑”选择“属性”,在“常规”选项卡中可以看到物理内存大小,在“高级”选项卡中点击“性能→设置”,在“性能选项”窗口的“高级”选项卡中点击“更改”,就能自由设置虚拟内存的大小和位置(见图1)。
TIPS
小提示
★Windows默认分配的内存为物理内存的1.5倍,一般情况下使用这个设置即可,如果你的内存在1GB以上,建议将虚拟内存的默认“初始大小”设置为1GB或以下。虚拟内存的默认位置也不建议更改,除非你的系统分区空间紧张。
TIPS
小提示
内存整理、优化工具在使用时应注意不要将转移量设得过高,否则应用程序需要的数据都被转移虚拟内存中,在实际使用时反而会降低效率。
TIPS
小提示
杀毒软件加入的虚拟设备在软件本身卸载后可能还存在,这些设备有可能导致兼容性问题,所以建议在“设备管理器”中选择“查看→显示隐藏设备”,然后找出未卸载掉的虚拟设备并手动删除(一般这类设备的名称中都带有软件本身或厂商的名称)。