因项目需要,要把文件夹下的安装程序剔除出来,个人曾经尝试的方法:
1、查壳器查打包软件。结果:失败。打包软件打出来的不一定是安装程序,安装程序也不一定由打包软件打成。
2、分解EXE内部是否含多个资源文件,这个方法还没有研究出来,应该是类似杀毒软件一样,扫描至文件内部,看否由多个文件组成,也不能确认。
3、名称判断:如一般含SETUP名称的为安装程序。这个基本比较准确,但是应对面太窄。大家帮忙想下思路,实在是无法下手。郁闷了好多天。

解决方案 »

  1.   

    有个软件叫 UniExtract ,你可以研究一下,反正我是不知道,可能要研究 PE 格式。
      

  2.   

    1. 扩展名是MSI的,基本上是安装程序
       可以再判断一下程序头
    2. 安装包与应用程序的尾部一般不同,应用程序的尾部很多空字节,安装包的尾部一般不是空字节(使用UE看一下)
    3. 常见的打包软件不清楚有没有写打包软件信息
    4. 一些安装软件的属性页中有Setup的字符串综合起来进行判断,应该可以提高识别的准确性。
      

  3.   

    附加一句: UniExtract 是个开源软件
      

  4.   

    ; Extract contents from known file types
    ;
    ; UniExtract uses four methods of detection (in order):
    ; 1. File extensions for special cases
    ; 2. Binary file analysis of files using TrID
    ; 3. Binary file analysis of PE (executable) files using PEiD
    ; 4. File extensions
    ;
    ; If detection fails, extraction is always attempted 7-Zip and InfoZip
      

  5.   

    UniExtract这个软件研究过,问题是UniExtract不能判断是不是安装程序,它是调用的PEiD.exe查壳,然后,再用别的软件来解包,我碰到过NSIS壳,但不是安装程序的例子。
    感觉从PE上来分析更加可靠些。
    如果是运行后能判断,也可以试下。运行后,当然能程序判断,这个估计也有点困难。查运行后窗体的名称??
    谢谢大家,希望再多提些思路。
      

  6.   

    另外还可以
    1. 判定一下文件大小,一般安装包会比较大
    2. 判定文件名称,名称包含'install' 'setup'字符串这两个判定都不太准类似这样的处理,将每种判定设置一个合理的权值,将所有判定执行一下,获得权值和,权值和在达到一定的分数,就认为是安装包或应用程序
      

  7.   

    提出图标的代码如下(需要引用一下ShellApi.pas单元)
    function getShellInfo(const Filename: string; const SmallIcon: Boolean = false):
      TSHFILEINFO;
    var
      Flags: Integer;
    begin
      Flags := SHGFI_DISPLAYNAME or SHGFI_TYPENAME or SHGFI_ICON or
        SHGFI_ATTRIBUTES;
      if SmallIcon then
        Flags := Flags or SHGFI_SMALLICON
      else
        Flags := Flags or SHGFI_LARGEICON;
      FillChar(Result, SizeOf(TSHFILEINFO), 0);
      SHGetFileInfo(Pchar(Filename), 0, Result, Sizeof(Result), Flags);
    end;
    基于图标,读取图标信息来判断准确度更低了。
      

  8.   

    1、首先要明确的一点是安装程序的定义
    比如用ZIP/RAR制作的自解压程序算不算安装程序2、要做一点类似模式识别的研究工作,类似杀毒软件识别病毒木马
    找到各种安装程序样本,找出它们的共同点,提取特征码3、简单一点,可从制作安装程序的方法入手
    把常见的打包软件和安装包格式查一下,如MSI、InstallShield、Wise
    这里面各种五花八门的自定义“安装程序”要自动判断有难度
      

  9.   

    1、你的程序中执行这个EXE;
    2、弹出对话框问操作人员:请问这是一个安装程序吗?【是】【否】
    3、获取返回值,进行下一步操作……
      

  10.   

    不知道Delphi里能不能判断pe文件的内容啊,可以的话应该可以区分的 像安装文件啊 自解压文件啊 (sfx)里面的内容要比实际的应用程序要多出很多字节,如果你想判断安装文件的话可以看看pe中有关你安装包的一些标志(你用的什么工具打包安装程序的 应该会有标志的)