绿化软件必然需要把一些捆绑式的广告软件,或者是一些不需要的插件去掉。但如何检测主程序依赖那些程序集呢(资源文件,配置等文件暂且不谈论)?
1使用检测工具
2注册表比较观察法
3文件系统比较法
4进程模块查看工具
5试验法
1使用检测工具
使用一些依赖性检测工具,例如Depends.exe,PowerTool,或者使用W32Dasm之类的反汇编工具,就很容易的查到到主程序依赖那些程序集。
例如使用Depends.exe检测QQ主程序检测到依赖的程序集,如下
使用反汇编工具W32Dasm就更强大了,不但能检测到检测到程序集,而且能检测到调用依赖程序集的方法
这种方法的缺陷是似乎只能检测到C或者C++编写的程序,使用其他语言编写的似乎就不行了,例如使用C#编写的就不行了
这种方法只能检测出代码中直接引入的程序集。另外C语言,C++语言也有动态加载的概念,类似于java和C#中的反射,通过提供一个一个程序集名称来动态加载DLL,这种方法就没办法检测出来。
如在系统核心DLLkernel32.dll中就有如下三个方法,当然还有其他类似的方法,使用这种方式就是没法检测出来的。但最起码可以知道,程序肯定依赖那些程序集。
LoadLibraryA
载入指定的动态链接库,并将它映射到当前进程使用的地址空间
LoadLibraryExA
装载指定的动态链接库,并为当前进程把它映射到地址空间
LoadModule
载入一个windows应用程序,并在指定的环境中运行
2注册表比较观察法
可使用专用的注册表比较观察工具例如RegShot,或者Total Uninstall
就是观察分析注册表的变化,
具体参考
具体参考
依赖的共享程序集
可以看看[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\SharedDLLs]是否有改变
服务
可以看看HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services 是否有改变
更多参考
3文件系统比较法
可以使用工具Total Uninstall或者Uninstall Manager
主要观察系统目录的变化和CommonProgramFiles的变化,其他目录的文件基本上都是程序运行不需要的。
4进程模块查看工具
可以使用软件PowerTool,很方便,你可以选择不显示微软的模块
可以查看程序运行时使用了那些DLL,但检查出来的却不一定是必须的,但只要把所有的DLL包含了主程序就可以运行了,给出了DLL的一个最大集合。
使用软件PowerTool查看QQ管家绿色版进程的加载DLL
使用软件PowerTool查看QQ进程的加载DLL
5试验法
通过以上步骤就可以基本确定可能依赖的程序集,通过方法1确定的肯定依赖了,2和3是可能依赖了,4给出了DLL的最大集合。
如果不能正常运行,说明程序运行需要通过注册表的找到安装目录,依赖于安装目录下的某些文件,而且这些文件是通过注册表找到的。
如果能正常运行,说明,注册表中所有指向安装目录的文件都是不需要的,最起码是正常运行不必要的文件,因为我们改变了安装目录,但没有修改注册表。
然后修改不在安装目录下的文件目录。例如CommonProgramFiles下创建的目录,看看程序是否可以正常运行
如果可以,说明,CommonProgramFiles下的文件也是不需要的。
如果不能正常运行,把CommonProgramFiles移动到改名后安装目录下,看看是否可以正常运行,如果可以说明CommonProgramFiles下的目录完全可以放在安装目录下,完全没有必要放在系统CommonProgramFiles下。如果不行,可以查看注册表,看看是不是有某个文件指向了CommonProgramFiles,如果是需要注册的,重新注册下,试试。如果成功,说明文件时可以移动的,只是需要重新注册而已。
至于其他系统目录下的文件,也可以按照这样的思路试试。
安装程序下DLL文件,可以删除了,运行,再删除另一个,在运行,思路基本不变。
需要注意的是,每次都应该先关闭程序,然后在移动文件夹,修改文件夹,删除文件,必要时还需要重启系统,有些修改时必须重启系统才能生效的。
通过反复试验,最后剩下的文件其实就是程序运行需要的最少DLL文件。