首先进行定义:
- 便携化,是指配置文件和所有程序组件在一个文件夹中的软件,并且在一般系统环境下可启动
- 绿化,是指运行结束后不留下相关信息的软件
目前软件便携化与绿化方案大致分为三种
原生
也就是软件在设计时即支持绿色与便携化
显然,这种软件无需便携化/绿化
附加安装、卸载器
例如大部分绿色软件带的绿化脚本本质上就是安装器,清理脚本本质上就是卸载器
这类方案中,最优秀的代表是portableapps。
它的启动器集成了安装器和卸载器的功能,并且支持备份启动前的原有配置
但是,缺点也很明显:
- 软件一旦非正常结束,启动器就不能正常清理
- 软件在启动前必须要执行至少两次拷贝(备份原配置,复制新配置)才能启动软件。在软件结束后,同样要执行两次拷贝。而如果配置文件较多,耗时将极大
- 不能有同一个软件的不同版本同时读取一个配置文件,否则,部署器和清理器很可能出错
创建虚拟环境
此方案其实是为软件创建一个沙盒
代表有Enigma Virtual Box、VMware Thinapp
缺点就比较多了:
- 不支持保存配置,不便于保存文件(这不是方案的缺点,但是目前对该方案具体实现的工具还没有能够支持保存配置文件的)
- 兼容性差,这是沙盒的硬伤,沙盒一直都有这个问题
- 性能损失大,原因同上
基于对上述方案进行反思,发现软件便携化和绿化最优的解决方案是原生。如果原生不能用,那么在绿化便携化时退而求其次,将软件改成接近原生绿色便携的样子
具体是:
- 将注册表写入统一改为文件写入
- 将分散到各用户文件夹的组件、配置文件集中到软件所在文件夹中的几个专用文件夹
驱动和服务的安装暂无更优办法
这样就避开了虚拟化导致的不兼容、避开了软件启动前拷贝到长耗时操作、避开了对部署/清理器的依赖、避开了可能和已存在软件之间的不兼容
再具体一点,我们到代码实现层级。总结一下,只需要对以下三个地方修改即可
- 写注册表
- 加载其他文件夹的组件
- 写入其他文件夹的配置文件
那么,我们可以发现,在Windows中,刚好这三类都有对应的winapi完成任务
- 写注册表对应Reg系API,实际只有读写查三种会用到
- 加载组件只有loadlibrary对应
- 写文件对应File系api,实际只有OpenFile和CreateFile的变形会用到
上面的操作必定调用这些api完成,因此想到了对api进行篡改,利用Hook技术,这个任务是有可能完成的
目前的进度:
- 使用c++完成任务,通过dll注入,已经实现了在大部分程序打开任意文件前弹窗提示文件名
- 改用c语言完成任务,基于上,成功重定向配置文件到;另外,重定向操作排除了所有用户手动保存的文件
- 正在寻找可用的实际软件用于测试…
- 正在添加对注册表操作的拦截…
- 待续