求个思路:如何判断一个EXE是安装程序还是应用程序?

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

大家帮忙想下思路,实在是无法下手。郁闷了好多天。
...全文
1151 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
gavinma 2010-07-03
  • 打赏
  • 举报
回复
不知道Delphi里能不能判断pe文件的内容啊,可以的话应该可以区分的 像安装文件啊 自解压文件啊 (sfx)里面的内容要比实际的应用程序要多出很多字节,如果你想判断安装文件的话可以看看pe中有关你安装包的一些标志(你用的什么工具打包安装程序的 应该会有标志的)
亮剑_ 2010-07-01
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 lclwcf 的回复:]
程序的图标不知道能不能判断,那些安装图标的应该可以确认是安装程序。但是提取图标再对比不知道麻烦不?
[/Quote]
且不说图标也就是图像的对比本身就是一个难题,单是有枚举出所谓“安装程序”的图标基本上也是不可能的
因为我可以自己随便画一个图标,用于我的安装程序
亮剑_ 2010-07-01
  • 打赏
  • 举报
回复
1、首先要明确的一点是安装程序的定义
比如用ZIP/RAR制作的自解压程序算不算安装程序

2、要做一点类似模式识别的研究工作,类似杀毒软件识别病毒木马
找到各种安装程序样本,找出它们的共同点,提取特征码

3、简单一点,可从制作安装程序的方法入手
把常见的打包软件和安装包格式查一下,如MSI、InstallShield、Wise。。。
这里面各种五花八门的自定义“安装程序”要自动判断有难度
lclwcf 2010-07-01
  • 打赏
  • 举报
回复
确实如楼上所说,图像的准确度太低了,以前做过图像识别的程序,非常麻烦还容易出错,读出图标后要先灰度处理消除色差影响,然后获取特征点,然后再比较。感觉比较悬。
麦客来了 2010-07-01
  • 打赏
  • 举报
回复
提出图标的代码如下(需要引用一下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;


基于图标,读取图标信息来判断准确度更低了。
lclwcf 2010-07-01
  • 打赏
  • 举报
回复
程序的图标不知道能不能判断,那些安装图标的应该可以确认是安装程序。但是提取图标再对比不知道麻烦不?
lclwcf 2010-07-01
  • 打赏
  • 举报
回复
确实,我自己只看文件名,也很难判断一个程序是不是安装程序,除非运行了才可以判断。
难道判断这个要用很高深的方法?可以程序判定一部分,然后再人工筛选。但是目前是这一部分都比较难挑得出来。成功率太低了
麦客来了 2010-07-01
  • 打赏
  • 举报
回复
另外还可以
1. 判定一下文件大小,一般安装包会比较大
2. 判定文件名称,名称包含'install' 'setup'字符串

这两个判定都不太准

类似这样的处理,将每种判定设置一个合理的权值,将所有判定执行一下,获得权值和,权值和在达到一定的分数,就认为是安装包或应用程序
亮剑_ 2010-07-01
  • 打赏
  • 举报
回复
这个比较难,因为生成安装程序的方法太多,不太容易找到一个通用的方法
4楼的可以参考一下
lclwcf 2010-07-01
  • 打赏
  • 举报
回复
UniExtract这个软件研究过,问题是UniExtract不能判断是不是安装程序,它是调用的PEiD.exe查壳,然后,再用别的软件来解包,我碰到过NSIS壳,但不是安装程序的例子。
感觉从PE上来分析更加可靠些。
如果是运行后能判断,也可以试下。运行后,当然能程序判断,这个估计也有点困难。查运行后窗体的名称??
谢谢大家,希望再多提些思路。
Frank.WU 2010-07-01
  • 打赏
  • 举报
回复
; 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
Frank.WU 2010-07-01
  • 打赏
  • 举报
回复
附加一句: UniExtract 是个开源软件
麦客来了 2010-07-01
  • 打赏
  • 举报
回复
1. 扩展名是MSI的,基本上是安装程序
可以再判断一下程序头
2. 安装包与应用程序的尾部一般不同,应用程序的尾部很多空字节,安装包的尾部一般不是空字节(使用UE看一下)
3. 常见的打包软件不清楚有没有写打包软件信息
4. 一些安装软件的属性页中有Setup的字符串

综合起来进行判断,应该可以提高识别的准确性。
nkym0626 2010-07-01
  • 打赏
  • 举报
回复
运行一下就知道了啊
林石公 2010-07-01
  • 打赏
  • 举报
回复
嗯,那啥,运行一下就知道鸟
Frank.WU 2010-07-01
  • 打赏
  • 举报
回复
有个软件叫 UniExtract ,你可以研究一下,反正我是不知道,可能要研究 PE 格式。
  • 打赏
  • 举报
回复
1、你的程序中执行这个EXE;
2、弹出对话框问操作人员:请问这是一个安装程序吗?【是】【否】
3、获取返回值,进行下一步操作……

5,913

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧