查看: 12859|回复: 67
收起左侧

[讨论] 再谈对已安装安软的识别及功能实现

  [复制链接]
langsileaa
发表于 2011-5-3 21:34:31 | 显示全部楼层 |阅读模式
本帖最后由 langsileaa 于 2011-5-7 22:11 编辑

       对于360卫士,无论是否安装,我想多数卡饭都知道有一个功能:检测已安装的杀毒软件,以及病毒库是否过期。至于其它软件是否有,个人未关注过,所以就拿360卫士来举例子了。
       本无意谈论这个话题,因为谈论起来,肯定是口水淹帖。卡饭牛人多的是,个人小白一个,只是来卡饭学习的。谈太专业的东西,很怕由于自己的认知存在错误,反而是班门弄斧了。况且卡饭毕竟只是个安全爱好者论坛,非专业开发开发交流社区,发太专业的开发相关帖子,是否合适。前几天发了一个浏览器识别的帖子,当中也提起过杀软的识别。最终还是开个帖,但仅仅从程序开发人员的角度来阐述及实现这个功能。技术讨论可以,口水用户请绕行!
       首先上张图,仅为直观些,务口水。图为网上随便拉的一张:是以前无法识别毒霸的。




       这里想先问问各位卡饭,如果让你编写杀软识别的问题,你会从何处入手呢?标识库?还是别的方法?

       几年前写一个工具,要获取很多硬件信息,所以研究过不少资料。最后发现解决这个问题其实很简单,微软自身已经提供接口,直接读取就行,也就是利用WMI接口。VISTA SP1以上系统,貌似安全中心协议已变更,root\securitycenter 被停止使用(未作详细调查)。这里仅讨论XP系统下的WMI 。引用 MSDN 中部分对WMI的解释:
WMI是windows NT核心系列操作系统的管理系统核心(新的vista系统使用与之类似的相关标准和新的标准-----mmzz);对于其他的Win32操作系统,WMI是一个有用的插件。WMI以CIMOM为基础,CIMOM即公共信息模型对象管理器(Common Information Model Object Manager),是一个描述操作系统构成单元的对象数据库,为MMC和脚本程序提供了一个访问操作系统构成单元的公共接口。有了WMI,工具软件和脚本程序访问操作系统的不同部分时不需要使用不同的API;相反,操作系统的不同部分都可以插入WMI,工具软件和WMI可以方便地读写WMI。


        关于WMI的更多信息,可自行百度or Google

        由于目前的反病毒厂商的反病毒产品使用的都是自己的标准,因此,要想同时被安全中心识别就要与微软进行底层的技术合作。我们关心的杀软如果未做微软系统兼容性认证,在wmi就不会有注册信息。也就是不被微软安全中心所识别,外在体现就是系统安全中心是否正确识别。
        所以当360卫士无法识别所安装的杀软时,应该先去系统安全中心看看。如果安全中心正确识别,然后可以选择反馈给官方。无益的口水什么问题都解决不了。
        抓图所用的系统中安装有微点和金山毒霸。我们看看安全中心的识别:




       检测到安装有多个防病毒软件,并且可能过期或关闭。来看看毒霸的信息:



       416日的病毒库,提示过期正确。升级下病毒库再看:





    安全中心显示的信息毕竟有限,如果我们想多了解些呢?
    当然是直接去看WMI:开始-运行-cmd-回车-wbemtest-连接-输入root\SecurityCenter-回车-枚举类别-递归-确定-双击AntiVirusProduct就可以查看杀毒软件的所有属性。

















    如果看着晕头,好,推荐微软自家的工具:WMI Tools  官方下载地址:
http://www.microsoft.com/downloads/en/details.aspx?familyid=6430F853-1120-48DB-8CC5-F2ABDC3ED314&displaylang=en






    对于xp系统,使用管理员帐号登陆系统,安装结束后,点击开始->所有程序->WMI Tools->WMI CIM Studio,将调用默认的IE浏览器打开WMI Administrative tools(如果你用其他浏览器作为默认的浏览器,请到“程序访问和默认值”里将IE设为默认,否则它将不能正常工作。) 打开后,ie提示你是否执行活动内容(脚本和活动控件),点击“允许”。初次运行要求你载入初始类,我们不管它,使用root\securitycenter替换掉root\CIMV2 ,确认后装入类root\securitycenter。这时我们可以看见下方的“FireWallProduct”和“AntiVirusProduct”两个类已经被载入。选择其一,再点击右边上方instances(实例),可以看到当前系统已经安装的防火墙或杀软的实例GUID值和其它相关信息。

















    从WMI Tools 里面,我们可以清楚的看到系统存在的安软,防火墙等,并且有详细的属性信息。
    综上,我们可以知道,安装和微软做过兼容性认证的杀软是可以正确识别,以及在系统有存储信息的。所以直接读取信息,就可以完成我们的目标。
    可行性得到肯定,剩下的就是如何读取,至于采用何种语言实现,那是程序开发人员的问题。只要你所采用的语言可以实现功能。

    这里直接拿段VBS代码,运行后可以看到找出的安软信息:
  1. Set oWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\SecurityCenter")
  2. Set colItems = oWMI.ExecQuery("Select * from AntiVirusProduct")
  3. For Each objAntiVirusProduct In colItems
  4. msg = msg & "companyName: " & objAntiVirusProduct.companyName & vbCrLf
  5. msg = msg & "displayName: " & objAntiVirusProduct.displayName & vbCrLf
  6. msg = msg & "instanceGuid: " & objAntiVirusProduct.instanceGuid & vbCrLf
  7. msg = msg & "onAccessScanningEnabled: " & objAntiVirusProduct.onAccessScanningEnabled & vbCrLf
  8. msg = msg & "productUptoDate: " & objAntiVirusProduct.productUptoDate & vbCrLf
  9. msg = msg & "versionNumber: " & objAntiVirusProduct.versionNumber & vbCrLf
  10. msg = msg & vbCrLf
  11. Next
  12. WScript.Echo msg
复制代码



VBS读取结果效果:







    如果有童鞋测试,可能会遇到一个问题:明明未安装某款杀软,但是读取到了。这里就要考虑一个残留的问题。偶这里就存在这个问题。微点已经卸载,但还会从WMI看到,并且被该VBS代码读取出来。通过搜索注册表,可以看到的确是存在残留信息的:








    更多残留可自行查找。既然存在残留问题,在程序实现时就要进行排除:
    随手写的程序,各位童鞋能看过去就行,别太较真,呵呵。可以读取安装杀软,以及实时监控状态是否开启:






pascal识别关键函数代码:

  1. function GetWMIProperty(WMIType, WMIProperty: string): string;
  2. var
  3.   Wmi, Objs, Obj: OleVariant;
  4.   Enum: IEnumVariant;
  5.   C: Cardinal;
  6. begin
  7.   try
  8.     Wmi := CreateOleObject('WbemScripting.SWbemLocator');
  9.     Objs := Wmi.ConnectServer('.', 'root\SecurityCenter').ExecQuery('Select * from ' + WMIType);
  10.     Enum := IEnumVariant(IUnknown(Objs._NewEnum));
  11.     Enum.Reset;
  12.     Enum.Next(1, Obj, C);
  13.     Obj := Obj.Properties_.Item(WMIProperty, 0).Value;
  14.     Result := Obj;
  15.   except
  16.     Result:='未检测到杀毒软件信息';
  17.   end;
  18. end;

  19. function GetAVName: ShortString;
  20. begin
  21.   try
  22.     result := GetWMIProperty('AntiVirusProduct', 'displayName');
  23.   except
  24.     result := '未知';
  25.   end;
  26. end;

  27. function GetAVState: Boolean;
  28. begin
  29.   try
  30.     result := lowercase(GetWMIProperty('AntiVirusProduct', 'onAccessScanningEnabled')) = 'true';
  31.   except
  32.     result := False;
  33.   end;
  34. end;
复制代码



调用部分:
  1. var
  2.   av: string;
  3. begin
  4.   av := GetAVName;
  5.   if av <> '未知' then
  6.   begin
  7.     Einfo.Lines.Add('杀毒软件:' + av);
  8.     if av<>'未检测到杀毒软件信息'  then begin
  9.       if GetAVState then
  10.         Einfo.Lines.Add('实时监控状态:开启')
  11.       else
  12.         Einfo.Lines.Add('实时监控状态:关闭');
  13.     end;   
  14.   end
  15.   else
  16.     Einfo.Lines.Add('没有检查的杀毒软件');
  17. end;
复制代码



源码及程序下载:


评分

参与人数 5魅力 +1 人气 +4 收起 理由
fweiger + 1 大牛啊
bbsss + 1 此帖还像个样子
sli + 1 魅力+1 人妻+1
皇甫暮云 + 1 再接再厉
c287432622 + 1 辛苦了。。。被利用了,也是个漏洞。。

查看全部评分

仙剑问情
发表于 2011-5-3 21:53:50 | 显示全部楼层
膜拜下!!!!!!
你可真够专业的。
hanfeilong
发表于 2011-5-3 22:33:38 | 显示全部楼层
楼主V5!!  你真的很专业啊!!
Kugoo015
头像被屏蔽
发表于 2011-5-3 22:42:26 | 显示全部楼层
表示需要一点专业知识才会来看……
landseer20
发表于 2011-5-3 22:44:07 | 显示全部楼层
潜水很久了,但是好贴要支持!!
塔木德
发表于 2011-5-3 22:45:34 | 显示全部楼层
不看了。。太多了。。
  只想知道 楼主想表达什么??
c287432622
头像被屏蔽
发表于 2011-5-3 22:53:56 | 显示全部楼层
表示看不懂。。。。
245867683
发表于 2011-5-3 22:55:16 | 显示全部楼层
帖子太专业了反而...
年下
发表于 2011-5-3 22:57:10 | 显示全部楼层
看不懂悲剧了
夏佈點
发表于 2011-5-3 23:19:39 | 显示全部楼层
够专业的。。。
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

手机版|杀毒软件|软件论坛| 卡饭论坛

Copyright © KaFan  KaFan.cn All Rights Reserved.

Powered by Discuz! X3.4( 沪ICP备2020031077号-2 ) GMT+8, 2025-2-4 21:51 , Processed in 0.129970 second(s), 19 queries .

卡饭网所发布的一切软件、样本、工具、文章等仅限用于学习和研究,不得将上述内容用于商业或者其他非法用途,否则产生的一切后果自负,本站信息来自网络,版权争议问题与本站无关,您必须在下载后的24小时之内从您的电脑中彻底删除上述信息,如有问题请通过邮件与我们联系。

快速回复 客服 返回顶部 返回列表