代码之家  ›  专栏  ›  技术社区  ›  Esteban Araya

我怎样才能反向工程一个安装程序与鬼安装程序编写?

  •  1
  • Esteban Araya  · 技术社区  · 15 年前

    我有一个没有源代码的安装程序。我需要“包装”这个安装程序或编辑它添加更多的文件。最好的方法是什么?如标题所述,安装程序是由Ghost安装程序编写的。

    1 回复  |  直到 15 年前
        1
  •  2
  •   mkmurray    15 年前

    因为它不是MSI,所以不能使用 Orca to edit the installer itself . 我已经写了 custom install actions 之前也为我的MSI安装程序。

    由于您对Ghost安装程序没有太多的控制(如果有的话),我可能会编写一个自定义的可执行文件来补充安装程序,它可以在安装程序之前或之后运行。这将创建一些额外的文件来分发给您的客户,但您可以将整个文件作为zip存档分发。

    首先,如果要以与Visual Studio确保安装先决条件相同的方式创建非托管引导程序,可以使用以下脚本通过msbuild执行此操作:

    <Project ToolsVersion="3.5" DefaultTargets="BuildBootstrapper" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    
      <ItemGroup>
        <BootstrapperFile Include="Microsoft.Net.Framework.2.0">
          <ProductName>Microsoft .NET Framework 2.0</ProductName>
        </BootstrapperFile>
      </ItemGroup>
    
      <Target Name="BuildBootstrapper">
        <GenerateBootstrapper
          ApplicationFile="CustomInstallerExecutable.exe"
          ApplicationName="Pretty Title of Application Goes Here"
          BootstrapperItems="@(BootstrapperFile)"
          ComponentsLocation="Relative" />
      </Target>
    
    </Project>
    

    这将生成一个“setup.exe”,它是安装程序的任何引导程序的实际文件名。事实上,如果您想确保用户不会意外地跳过引导程序直接转到安装程序,那么可以将Ghost安装程序隐藏在“bin”文件夹中,或者隐藏在zip档案根目录之外的某个文件夹中。这样一来,他们唯一直观的选择就是“setup.exe”。如果为了客户的利益需要非常清楚的话,还包括“readme.txt”。

    这个引导程序还需要确保客户端以.NET 2.0框架作为先决条件,这样您的“customInstaller executable.exe”就可以用.NET而不是非托管语言编写。实际上,这个msbuild脚本将把.NET 2.0框架安装程序放到新创建的引导程序旁边(因为“componentslocation”属性的“relative”值)。如果您担心增加Ghost安装程序下载给客户的原始下载量,您可以使用其他属性值来帮助用户通过Web获取.NET框架。

    现在,您的“customInstaller可执行文件.exe”(用漂亮的托管C_编写)可以在运行Ghost安装程序之前(或之后)将额外的文件放到计算机上。我以前编写过一些代码来从.NET可执行文件运行msi:

    string msiString = "blahBlah.msi";
    
    // Kick off Update installer
    ProcessStartInfo startInfo = new ProcessStartInfo(
        "cmd.exe",
        "/c start /wait msiexec.exe /i " + msiString);
    startInfo.WorkingDirectory = "bin";
    startInfo.WindowStyle = ProcessWindowStyle.Hidden;
    
    Process process = new Process
    {
        StartInfo = startInfo,
        EnableRaisingEvents = true
    };
    process.Exited += new EventHandler(process_Exited);
    
    process.Start();
    

    我认为你可以做一些非常类似的事情来调用你的幽灵安装程序,而不是一个微星。如果在ghost安装程序之前运行此.NET可执行文件,则只需调用ghost安装程序进程,然后退出“customInstaller可执行文件.exe”进程,而不必等待进程.exited事件触发。此事件等待将更多地用于运行“安装后”逻辑。

    祝你好运,希望这对你有所帮助。