Dxl:网上流传着很多的上帝模式的详细解析,但是却无法解决我的疑问,那就是上帝模式的原理到底是什么呢,为什么指定的字符串会指定到固定的图标和功能呢?字符串的编码规律有是怎样的呢?
在网上google和baidu了很长的时间没有什么斩获,看来没有人发表过关于上帝模式的详细的技术解析,没办法,自己动手丰衣足食!
下面就给出我探索上帝模式原理的一些发现吧!
首先给出网上找来的一些CLSID字符串:
回收站.{645ff040-5081-101b-9f08-00aa002f954e}
拨号网络.{992CFFA0-F557-101A-88EC-00DD010CCC48}
打印机.{2227a280-3aea-1069-a2de-08002b30309d}
控制面板.{21ec2020-3aea-1069-a2dd-08002b30309d}
网上邻居.{208D2C60-3AEA-1069-A2D7-08002B30309D}
图标clsid=windowsmedia 文件名.{00020c01-0000-0000-c000-000000000046}
无关联文件 文件名.{00021401-0000-0000-c000-000000000046}
BMP文件 文件名.{d3e34b21-9d75-101a-8c3d-00aa001a1652}
HTML文件 文件名.{25336920-03f9-11cf-8fd0-00aa00686f13}
媒体剪辑文件 文件名.{00022601-0000-0000-c000-000000000046}
打印机 文件名.{2227a280-3aea-1069-A2de-08002b30309d}
控制面板 文件名.{21ec2020-3aea-1069-A2dd-08002b30309d}
网上邻居 文件名.{208d2c60-3aea-1069-A2d7-08002b30309d}
拨号网络 文件名.{992cffa0-F557-101a-88ec-00dd010ccc48}
计划任务 文件名.{D6277990-4c6a-11cf-8d87-00aa0060f5bf}
回收站 文件名.{645ff040-5081-101b-9f08-00aa002f954e}
Web文件夹 文件名.{Bdeadf00-C265-11d0-Bced-00a0c90ab50f}
历史记录 文件名.{Ff393560-C2a7-11cf-Bff4-444553540000}
收藏夹 文件名.{1a9ba3a0-143a-11cf-8350-444553540000}
预订文件夹 文件名.{F5175861-2688-11d0-9c5e-00aa00a45957}
ActiveX高速缓存文件夹文件名.{88c6c381-2e85-11d0-94de-444553540000}
excel.{00020810-0000-0000-C000-000000000046}
word.{00020900-0000-0000-C000-000000000046}
media.{00022603-0000-0000-C000-000000000046}
CAB.{0CD7A5C0-9F37-11CE-AE65-08002B2E1262}
搜索-计算机{1f4de370-d627-11d1-ba4f-00a0c91eedba}
mht.{3050F3D9-98B5-11CF-BB82-00AA00BDCE0B}
mshta.{3050f4d8-98B5-11CF-BB82-00AA00BDCE0B}
我的文档.{450D8FBA-AD25-11D0-98A8-0800361B1103}
XML.{48123bc4-99d9-11d1-a6b3-00c04fd91555}
回收站(满).{5ef4af3a-f726-11d0-b8a2-00c04fc309a4}
回收站.{645FF040-5081-101B-9F08-00AA002F954E}
ftp_folder.{63da6ec0-2e98-11cf-8d82-444553540000}
网络和拨号连接.{7007ACC7-3202-11D1-AAD2-00805FC1270E}
写字板文档.{73FDDC80-AEA9-101A-98A7-00AA00374959}
Temporary Offline Files Cleaner.{750fdf0f-2a26-11d1-a3ea-080036587f03}
用户和密码.{7A9D77BD-5403-11d2-8785-2E0420524153}
Internet 临时文件.{7BD29E00-76C1-11CF-9DD0-00A0C9034933}
已下载的程序文件的清除程序.{8369AB20-56C9-11D0-94E8-00AA0059CE02}
公文包.{85BBD920-42A0-1069-A2E4-08002B30309D}
ActiveX 高速缓存文件夹.{88C6C381-2E85-11D0-94DE-444553540000}
mail.{9E56BE60-C50F-11CF-9A2C-00A0C90A90CE}
历史记录.{FF393560-C2A7-11CF-BFF4-444553540000}
目录.{fe1290f0-cfbd-11cf-a330-00aa00c16e65}
Internet Explorer.{FBF23B42-E3F0-101B-8488-00AA003E56F8}
Snapshot File.{FACB5ED2-7F99-11D0-ADE2-00A0C90DC8D9}
预订文件夹.{F5175861-2688-11d0-9C5E-00AA00A45957}
MyDocs Drop Target.{ECF03A32-103D-11d2-854D-006008059367}
Policy Package.{ecabaebd-7f19-11d2-978E-0000f8757e2a}
搜索结果.{e17d4fc0-5564-11d1-83f2-00a0c90dc849}
添加网上邻居.{D4480A50-BA28-11d1-8E75-00C04FA31A86}
Paint.{D3E34B21-9D75-101A-8C3D-00AA001A1652}
管理工具.{D20EA4E1-3957-11d2-A40B-0C5020524153}
字体.{D20EA4E1-3957-11d2-A40B-0C5020524152}
Web Folders.{BDEADF00-C265-11d0-BCED-00A0C90AB50F}
DocFind Command.{B005E690-678D-11d1-B758-00A0C90564FE}
脱机文件夹.{AFDB1F70-2A4C-11d2-9039-00C04F8EEB3E}
(以上基本上是XP和Windows 7共同存在的CLSID键值,然而还有很多的Windows 7特有的键值还没有被公布)
这里我们首先要了解什么是CLSID
以下内容摘自百度百科:
在Windows系统中也称之为Class ID,缩写为CLSID。对于不同的应用程序,文件类型,OLE对象,特殊文件夹以及各种系统组件,Windows都会分配一个唯一表示它的ID代码。
那么这些键值被保存在什么地方呢?呵呵,聪明的读者可能马上就想到了,在注册表中!对,的确是在注册表中,因为注册表是一个庞大的系统数据库,有很多系统的配置信息被保存在内。
如图:

那么就开始行动,来到HKEY_CLASSES_ROOT\CLSID项下有很多的资源描述符,那么怎么知道这些CLSID值各自代表的是什么意思呢?我们以{645ff040-5081-101b-9f08-00aa002f954e}这个CLSID值为例子,这个键值是回收站的资源描述符,这个字符项有5个子项,分别是DefaultIcon, InProcServer32, shell, shellex, ShellFolder。由于我们只研究键值所代表的特定图标,所以DefaultIcon子项所包含的字符串键值就值得我们注意。这个子项所包含的键值如下:
Empty->%SystemRoot%\System32\imageres.dll,-55
Full->%SystemRoot%\System32\imageres.dll,-54

上面的键值分别表示了回收站“空”和“满”两个状态的图标设置,一个是imageres.dll中的第55号图标,一个是imageres.dll中的第54号图标。为了更直观的了解这两个图标,请参考下图:

此图是在系统个性化中的更改桌面图标设置中的回收站图标文件,而这两个图标和其他的图标也是imageres.dll中被封装的文件。
哦,原来如此,在注册表的CLSID项中有很多以特定的资源描述符命名的子项,而这些子项都包含DefualtIcon项,DefualtIcon项内有指定此资源描述符所显示的图标字符串,而这些指定的图标在imageres.dll文件中!
好,知道了大概的原理,那么我们来看看上帝模式({ED7BA470-8E54-465E-825C-99712043E01C})的资源描述符所对应的子项吧
如图:

在上帝模式CLSID值{ED7BA470-8E54-465E-825C-99712043E01C}项中有个System.AppUserModel.ID的字符串,字符串的内容是Microsoft.Windows.ControlPanel,意思是控制面板。哦,这样一来就不难解释为什么这个键值能将控制面板的主要功能选项都列出来了。而子项中的DefaultIcon包含字符串为%SystemRoot%\System32\imageres.dll,-27,意思就是imageres.dll文件中的第27号图标!
呵呵,到了这一步,基本上就明朗了,原来是注册表的键值在起作用!
那么如何得知特定的图标在imageres.dll中所对应的顺序呢?
接下来我们要用到一个工具:Restorator,关于工具详细功能介绍不不说了,没用过的可以去网上搜索下!
我们用这个工具打开imageres.dll文件,在位图中点击第27号图标,果然就是上帝模式对应的27号图标,也就是控制面板的图标!

到这里探索的过程就要告一段落了,读者们应该揭开了上帝模式所谓的神秘面纱了,希望你们能从本文中有所收获!