编程定制系统安装盘

编程定制系统安装盘
masepu(本文已发表于黑客防线,转载转载注明出处)
相信大家对各类集成了第三方软件的自动安装windows系统光盘并不陌生,为了快速装机,大多数人都采用了快速恢复安装和无人值守安装的方式。虽然方便,但这些方式却存在着诸多问题和隐患,那些默认自动安装的第三方软件是不是我们需要的暂且不说,就其安全性就很值得怀疑。前段时间就听说某某著名版本的装机光盘内含有恶意代码并以此谋利,而且我自己下载测试的其它几款装机光盘都或多或少的含有各类恶意软件和插件,有一个甚至直接被杀毒软件查出病毒,看来现在在装机光盘中做手脚的现象已是非常普遍了。为了简化装机步骤,我们如果能够通过编程的方法来快速制作出自己的无人值守装机光盘,随时将各类自己常用的工具随时集成进去,将繁琐的手工操作自动化,那就可以真正的做到方便与安全兼顾了。当然,如果将恶意程序集成进去,那么此时杀软还没安装,顺利运行起来就不是难事了。
首先要了解的是手动在安装光盘中集成软件的方法。微软提供的集成方法是利用批处理来完成补丁程序和其他程序的调用和自动安装,批处理的运行又依靠于Winnt.sif中RunOnceE功能来实现。这个Winnt.sif文件将在安装系统的过程中提供所有预先输入好的应答信息。其过程是先把所有需要自动安装的补丁或程序放到安装光盘的“$OEM$/$1/文件安装目录(如:install)”目录下,再编写一个或多个批处理来让他们依次执行安装。在安装过程中,安装程序会先把“$1”目录下所有文件都拷贝到硬盘系统盘下,然后以Winnt.sif中的RunOnceE字段来执行文件。唯一可以改名的文件夹只有“install”目录,我们可以把它改为自己喜欢的名字,本文默认使用“install”。不论你使用什么名称,但要确保使用的名称跟你在批处理文件中的名称是统一的。
Winnt.sif文件可以由Setup Manager(setupmgr.exe)工具来生成,该程序是可用来创建winnt.sif应答文件向导模式的工具。本文中我们所讨论的是如何将自己的程序集成到安装光盘中并自动运行,因此主要关心的是winnt.sif文件中与自动运行第三方应用程序相关的项,这些项主要包括:
1、winnt.sif文件的[Data]字段。
将该字段下的UnattendedInstall设置为Yes,则会进行一次无人值守的安装。
2、winnt.sif文件的[Unattended]字段。在该字段中添加以下内容:
OemPreinstall=Yes
OemPreinstall项设置为Yes是为了让系统在安装过程中从$OEM$/$1/文件夹下安装额外的程序,这样安装程序就会知道这次的安装会发布其他程序,而预先把相应的安装文件复制到磁盘中以便安装。
3、winnt.sif文件的[GuiRunOnce]字段。
在winnt.sif文件的[GuiRunOnce]字段下指定要执行的批处理文件(*.cmd 或者 *.bat),添加批处理文件的路径位置。可使其在安装程序安装好操作系统并使用管理员帐户登录系统后运行这些批处理。在这一过程中我们可以安装Hotfix补丁程序、应用程序、删除不想要的墙纸和屏幕保护等。
可以看出,实现程序自动安装的关键就在于Winnt.sif文件,该文件为从光盘安装系统的无人职守方式用脚本,其存在于I386 目录下,该文件的详解格式和说明在此处就不再赘述,大家可以在网上找到更详细的资料。
如何编写在winnt.sif文件下[GuiRunOnce]字段中指定运行的批处理文件呢,下面是一个编写好的批处理“applications.cmd”文件内容(本文中批处理名称采用applications.cmd):
applications.cmd:
CLS
@echo off
ECHO.
ECHO 安装我的文件mytest
ECHO 请稍等...
start /wait %systemdrive%/install/Applications/mytest.exe /S
ECHO.
ECHO 删除安装过程中的临时文件...
RD /S /Q %systemdrive%/install
ECHO.
EXIT
在上面文件中我们可以添加多个需要安装的程序。源程序的路径也可以根据情况更改。最后别忘了把批处理文件的路径添加到winnt.sif文件的[GuiRunOnce] 字段!当然,如果你的程序或其他第三方软件没有静默安装参数就需要你自己手动去写自动安装的脚本了。
现在以Windows XP SP2光盘为例,将整个制作过程分成以下几个阶段:
1、 将Windows XP SP2光盘内容解压至硬盘某一目录;
2、 创建winnt.sif文件;
3、 更改winnt.sif文件;
4、 创建“$OEM$/$1/...“安装目录;
5、 复制欲安装程序到安装目录;
6、 创建批处理文件;
7、 添加运行程序的批处理命令;
8、 将更改后的Windows XP SP2内容重新打包成系统光盘。
下面我们开始编程将制作过程的第2步到第7步的六个步骤自动化。本程序采用VC6.0编写,在虚拟机VM6.0下测试成功。编好的软件的界面如图1所示:
 
图1 程序运行界面
其中“选择目录”按钮是用来选择在硬盘上解压好的windows安装文件目录的。如将windowsxpsp2光盘解压到了D盘的XP目录下,则此处应该选择的目录就是“D:/XP”。而“选择文件”按钮是用以指定需要随系统一起安装运行的程序。“开始”按钮是用以自动完成以上需要手工操作的制作步骤。该程序编写过程中主要涉及的是与文件和字符串操作相关的知识。在“选择目录”按钮下的重点代码如下:
Char  FilePath[255];
BROWSEINFO   BroInfo;  
ITEMIDLIST   *pidl;  
BroInfo.hwndOwner   =   this->m_hWnd;  
BroInfo.pidlRoot   =   NULL;  
BroInfo.pszDisplayName   =   szDir;  
BroInfo.lpszTitle   =   "选择要添加的文件夹";  
BroInfo.ulFlags   =   BIF_RETURNONLYFSDIRS|BIF_DONTGOBELOWDOMAIN;  
BroInfo.lpfn   =   NULL;  
BroInfo.lParam   =   0;  
BroInfo.iImage   =   0;  
pidl   =   SHBrowseForFolder(&BroInfo);  
if(pidl   ==   NULL)   return;  
SHGetPathFromIDList(pidl, FilePath);
m_CatalogName=FilePath;
//判断输入的目录是否存在
if (!PathFileExists(szDir))
{
 MessageBox("目录不存在","注意",MB_OK);
 return;
}
以上代码的主要作用是利用SHBrowseForFolder函数来实现选择一个目录的功能。在VC6.0中没有提供打开目录对话框控件,我们可以通过以上方式实现。
在“选择文件”按钮下的主要代码为:
CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szFilter,NULL);
//通过模态对话框显示文件对话框
if (dlg.DoModal()==IDOK)
{  m_FilePathName=dlg.GetPathName();   //获取文件路径
   m_RichEditProcInfo.SetSel(-1,-1);   //设置RICHEDIT内容,将指针设置到编辑框最后
   m_RichEditProcInfo.ReplaceSel("文件路径:");//替换编辑框最后的内容,在最后添加内容
   m_RichEditProcInfo.ReplaceSel(m_FilePathName);
m_RichEditProcInfo.ReplaceSel("/r/n");
   UpdateData(FALSE);  //用获取的文件路径更新编辑框内容。
}
以上代码主要实现通过文件对话框选择exe可执行文件和RichEdit控件内容的功能。
在“开始”按钮下,首先通过以下代码获得当前应用程序所在目录:
CString path_directory,path_txt;   //path_directory:路径    path_txt:路径+文件名 
GetModuleFileName(NULL,path_txt.GetBuffer(MAX_PATH),MAX_PATH);     //得到当前执行程序的路径 
path_txt.ReleaseBuffer();  
int path_directory_length = path_txt.ReverseFind('//'); //在path_txt中找到最后一个"/"
path_directory = path_txt.Left(path_directory_length + 1);
以下代码是通过文件操作来修改自动创建成功的WINNT.sif文件。
FILE *SifFile;
if((SifFile = fopen(SifFilePath,"at+")) == NULL)    //文本文件,允许读和追加
{
   return;
}
fseek(SifFile,0L,SEEK_END);
fputs("/r/n", SifFile);
fputs("[GuiRunOnce]/r/n", SifFile);
fputs("%systemdrive%//install//applications.cmd/r/n", SifFile);
fclose(SifFile);
其余如怎么创建运行程序的批处理文件等代码大家可以参见光盘中的源代码,这里就不再赘述。
最后的步骤就是把解压到硬盘上的XP目录下的所有文件都刻录到光盘上,别忘了要做成的是可以引导系统的光盘。为了节省时间一个简单的方法是:使用一个空白的可引导的XP ISO文件,在WinISO中打开它,然后把我们用程序处理过的解压到硬盘上的XP目录下的内容拖动到WinISO界面上,然后保存ISO。这样的ISO文件就可以在常见的刻录软件中以光盘镜像的形式刻录了。而你也可以在Virtual PC / VMWare等虚拟机软件中载入ISO文件做测试。图2所示的就是系统自动安装完成后出现的界面,可以看到我们自己指定的程序自动运行了。
 
程序中还存在这一些不足,如该程序没有考虑到有安装参数和需要交互的安装程序的问题,同时只能添加一个自动执行的程序。不过这些问题都可以通过简单的程序修改来解决,这里只是做一个示例,有问题欢迎大家到黑防论坛上一起交流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值