MASM32编程通过WMI获取杀毒软件信息

简介: MASM32编程通过WMI获取杀毒软件信息

Windows XP SP2 开始提供安全中心,杀毒软件会向安全中心注册报道,这样windows就可以检测到系统中是否安装了杀毒软件。

 如何在自己的程序中实现这个功能呢?

 网上找到的大多是通过WMI来实现的VBScript脚本代码,咱用MASM32来实现之。

 完整的代码如下:

 (源代码+EXE下载:

 1、

 2、 http://purpleendurer.ys168.com

 

;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; 文 件 名:WmiAntiVir.asm (控制台程序)

; 功    能: 通过WMI获取反病毒软件信息和软件更新时间

; 开发环境:Win XP PRO SP3 + MASM32 v8

; 作    者:PurpleEndurer, 2010-04-19,广西河池

;

; log

; --------------------------------------------------

; 2010-05-24 开始编写

;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

.586
.MODEL FLAT,STDCALL
OPTION CASEMAP:NONE
INCLUDE /masm32/include/windows.inc
INCLUDE /masm32/include/kernel32.inc
INCLUDELIB /masm32/lib/kernel32.lib
INCLUDE /masm32/include/ole32.inc
INCLUDELIB /masm32/lib/ole32.lib
INCLUDE /masm32/include/user32.inc
INCLUDELIB /masm32/lib/user32.lib
INCLUDE /masm32/include/masm32.inc
INCLUDELIB /masm32/lib/masm32.lib

EnumAntiVir proto


;ssssssssssssssssssssssss
;.const
;ssssssssssssssssssssssss

EOAC_NONE   EQU 0
COINIT_MULTITHREADED equ 00h

; located in RpcDce.h
RPC_C_AUTHN_LEVEL_DEFAULT   EQU 0
RPC_C_IMP_LEVEL_DEFAULT     EQU 0
RPC_C_IMP_LEVEL_IMPERSONATE EQU 3

GUID2 STRUC
     dd1 DWORD ?
     dw1 WORD ?
     dw2 WORD ?
     db1 BYTE ?
     db2 BYTE ?
     db3 BYTE ?
     db4 BYTE ?
     db5 BYTE ?
     db6 BYTE ?
     db7 BYTE ?
     db8 BYTE ?
GUID2 ENDS

IWbemLocator STRUCT
    lpVtbl DWORD   ?
IWbemLocator ENDS

IWbemLocatorVtbl STRUCT
    QueryInterface DWORD   ?
    AddRef         DWORD   ?
    Release        DWORD   ?
    ConnectServer  DWORD   ?
IWbemLocatorVtbl ENDS

IWbemServices STRUCT
    lpVtbl DWORD   ?
IWbemServices ENDS

IWbemServicesVtbl STRUCT
    QueryInterface             DWORD   ?
    AddRef                     DWORD   ?
    Release                    DWORD   ?
    OpenNamespace              DWORD   ?
    CancelAsyncCall            DWORD   ?
    QueryObjectSink            DWORD   ?
    GetObject                  DWORD   ?
    GetObjectAsync             DWORD   ?
    PutClass                   DWORD   ?
    PutClassAsync              DWORD   ?
    DeleteClass                DWORD   ?
    DeleteClassAsync           DWORD   ?
    CreateClassEnum            DWORD   ?
    CreateClassEnumAsync       DWORD   ?
    PutInstance                DWORD   ?
    PutInstanceAsync           DWORD   ?
    DeleteInstance             DWORD   ?
    DeleteInstanceAsync        DWORD   ?
    CreateInstanceEnum         DWORD   ?
    CreateInstanceEnumAsync    DWORD   ?
    ExecQuery                  DWORD   ?
    ExecQueryAsync             DWORD   ?
    ExecNotificationQuery      DWORD   ?
    ExecNotificationQueryAsync DWORD   ?
    ExecMethod                 DWORD   ?
    ExecMethodAsync            DWORD   ?
IWbemServicesVtbl ENDS

IEnumWbemClassObject STRUCT
    lpVtbl          DWORD   ?
IEnumWbemClassObject ENDS

IEnumWbemClassObjectVtbl STRUCT
    QueryInterface DWORD   ?
    AddRef         DWORD   ?
    Release        DWORD   ?
    Reset          DWORD   ?
    Next           DWORD   ?
    NextAsync      DWORD   ?
    Clone          DWORD   ?
    Skip           DWORD   ?
IEnumWbemClassObjectVtbl ENDS

IWbemClassObject STRUCT
    lpVtbl DWORD   ?
IWbemClassObject ENDS

IWbemClassObjectVtbl STRUCT
    QueryInterface          DWORD   ?
    AddRef                  DWORD   ?
    Release                 DWORD   ?
    GetQualifierSet         DWORD   ?
    Get                     DWORD   ?
    Put                     DWORD   ?
    Delete                  DWORD   ?
    GetNames                DWORD   ?
    BeginEnumeration        DWORD   ?
    Next                    DWORD   ?
    EndEnumeration          DWORD   ?
    GetPropertyQualifierSet DWORD   ?
    GetObjectText           DWORD   ?
    SpawnDerivedClass       DWORD   ?
    SpawnInstance           DWORD   ?
    CompareTo               DWORD   ?
    GetPropertyOrigin       DWORD   ?
    InheritsFrom            DWORD   ?
    GetMethod               DWORD   ?
    PutMethod               DWORD   ?
    DeleteMethod            DWORD   ?
    BeginMethodEnumeration  DWORD   ?
    NextMethod              DWORD   ?
    EndMethodEnumeration    DWORD   ?
    GetMethodQualifierSet   DWORD   ?
    GetMethodOrigin         DWORD   ?
IWbemClassObjectVtbl ENDS


SAFEARRAYBOUND struct
    cElements   dd ?    ;这一维有多少个元素?
    lLbound     dd ?    ;它的索引从几开始?
SAFEARRAYBOUND ends
 
SAFEARRAY struct
    cDims       dw ?    ;Count of dimensions in this array.这个数组有几维?
    fFeatures   dw ?    ;Flags used by the SafeArray routines documented below. 数组有什么特性?
    cbElements  dd ?    ;Size of an element of the array. Does not include size of pointed-to data.
                        ;数组的每个元素有多大?
    cLocks      dd ?    ;Number of times the array has been  locked without corresponding unlock.
                        ;这个数组被锁定过几次?
    pvData      dd ?    ;Pointer to the data. 数组里的数据放在什么地方?
    rgsabound   SAFEARRAYBOUND <> ;One bound for each dimension.真数组
SAFEARRAY ends

;ssssssssssssssssssssssss
.DATA
;ssssssssssssssssssssssss
    g_wszNameSpace WORD "r", "o", "o", "t", "/", "S", "e", "c", "u", "r", "i", "t", "y"/
  , "C", "e", "n", "t", "e", "r", 0
    g_wszQueryLanguage WORD "W", "Q", "L", 0

    WBEM_FLAG_CONNECT_USE_MAX_WAIT  EQU     80h
    WBEM_FLAG_FORWARD_ONLY          EQU     20h
    WBEM_FLAG_RETURN_IMMEDIATELY    EQU     10h
    WBEM_INFINITE                   EQU     -1
    WBEM_E_INVALID_QUERY            EQU     80041017h
    WBEM_E_INVALID_QUERY_TYPE       EQU     80041018h

    IID_IWbemLocator                GUID2   <0dc12a687h,0737fh,011cfh,088h,04dh,000h,0aah,000h,04bh,02eh,024h>

    IID_IEnumWbemClassObject        GUID2   <027947e1h,0d731h,011ceh,0a3h,057h,000h,000h,000h,000h,000h,001h>

    IID_IWbemClassObject            GUID2   <0dc12a681h,0737fh,011cfh,088h,04dh,000h,0aah,000h,04bh,02eh,024h>

    ; located in WbemProv.h

    CLSID_WbemAdministrativeLocator GUID2   <0cb8555cch,09128h,011d1h,0adh,09bh,000h,0c0h,04fh,0d8h,0fdh,0ffh>

    locator     IWbemLocator            <>
    service     IWbemServices           <>
    enumerator  IEnumWbemClassObject    <>
    processor   IWbemClassObject        <>

    retCount    DWORD   ?

    var_val     DWORD   ?
                DWORD   ?
                DWORD   ?
                DWORD   ?

    g_szAppInfo db "通过WMI获取反病毒软件信息", 0dh ,0ah
                db "作  者:PurpleEndurer, 2010-05-24,广西河池", 0dh ,0ah, 0

    g_wszSelectAntiVirus WORD "S","E","L","E","C","T"," ","*"," ","F","R","O","M"," "
    g_wszAntiVirus WORD "A", "n", "t", "i", "V", "i", "r", "u", "s", "P", "r", "o", "d", "u", "c", "t", 0

 ; class AntiVirusProduct
 ; {
 ;     [key, Not_Null] string instanceGuid;
 ;     [Not_Null] string displayName;
 ;     [Not_Null] boolean productUptoDate;
 ;     boolean onAccessScanningEnabled;
 ;     boolean productHasNotifiedUser;
 ;     boolean productWantsWscNotifications;
 ;     uint8 productState;
 ;     string companyName;
 ;     string versionNumber;
 ;     string pathToSignedProductExe;
 ; };

    g_szdisplayName db 0dh, 0ah, "displayName:", 0
    g_wszdisplayName WORD "d", "i", "s", "p", "l", "a", "y", "N", "a", "m", "e", 0

    g_szcompanyName db  0dh, 0ah, "companyName:", 0
    g_wszcompanyName WORD "c", "o", "m", "p", "a", "n", "y", "N", "a", "m", "e", 0

    g_szinstanceGuid db  0dh, 0ah, "instanceGuid:", 0
    g_wszinstanceGuid WORD "i", "n", "s", "t", "a", "n", "c", "e", "G", "u", "i", "d", 0

    g_szpathToSignedProductExe db 0dh, 0ah, "pathToSignedProductExe", 0
    g_wszpathToSignedProductExe word "p", "a", "t", "h", "T", "o", "S", "i", "g", "n", "e", "d", "P", "r", "o", "d", "u", "c", "t", "E", "x", "e", 0
   
    g_szversionNumber db  0dh, 0ah, "versionNumber:", 0
    g_wszversionNumber WORD "v", "e", "r", "s", "i", "o", "n", "N", "u", "m", "b", "e", "r", 0

    g_szonAccessScanningEnabled db  0dh, 0ah, "onAccessScanningEnabled:", 0
    g_wszonAccessScanningEnabled WORD "o", "n", "A", "c", "c", "e", "s", "s"/
  , "S", "c", "a", "n", "n", "i", "n", "g", "E", "n", "a", "b", "l", "e", "d", 0

    g_szproductUptoDate db  0dh, 0ah, "productUptoDate:", 0    ;自动更新
    g_wszproductUptoDate WORD "p", "r", "o", "d", "u", "c", "t", "U", "p", "t", "o", "D", "a", "t", "e", 0

    g_szPerSCr db "%S"
    g_szCrLf   db 0dh, 0ah, 0
    g_szPerXCr db "%x", 0dh, 0ah, 0
    g_szFail   db "Fail", 0dh, 0ah, 0

    g_szFalse  db "FALSE", 0
    g_szTrue   db "TRUE", 0

;ssssssssssssssssssssssss
.CODE
;ssssssssssssssssssssssss
start:

    invoke CoInitializeEx, NULL, COINIT_MULTITHREADED

    invoke CoInitializeSecurity, NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT,/
                RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL

    invoke CoCreateInstance, ADDR CLSID_WbemAdministrativeLocator, NULL,/
                CLSCTX_INPROC_SERVER, ADDR IID_IWbemLocator, ADDR locator

    invoke StdOut, ADDR g_szAppInfo

    invoke EnumAntiVir

    invoke CoUninitialize
    invoke ExitProcess, 0


;======================================================
wmiConnectServer proc
;======================================================
    mov esi, locator
    lodsd
    push OFFSET service
    push NULL
    push NULL
    push WBEM_FLAG_CONNECT_USE_MAX_WAIT
    push NULL
    push NULL
    push NULL
    push OFFSET g_wszNameSpace
    push DWORD PTR [locator]
    call DWORD PTR [eax][IWbemLocatorVtbl.ConnectServer]

    ret
wmiConnectServer endp


;======================================================
wmiExecQuery proc lpwszSQL: LPWSTR
;======================================================
    mov esi, service
    lodsd
    push OFFSET enumerator
    push NULL
    push WBEM_FLAG_FORWARD_ONLY or WBEM_FLAG_RETURN_IMMEDIATELY
    push lpwszSQL
    push OFFSET g_wszQueryLanguage
    push DWORD PTR [service]
    call DWORD PTR [eax][IWbemServicesVtbl.ExecQuery]

    ret
wmiExecQuery endp


;======================================================
wmiNext proc
;======================================================
    mov esi, enumerator
    lodsd
    push OFFSET retCount
    push OFFSET processor
    push TRUE
    push WBEM_INFINITE
    push DWORD PTR [enumerator]
    call DWORD PTR [eax][IEnumWbemClassObjectVtbl.Next]

    ret
wmiNext endp


;======================================================
wmiGet proc lpwszItem: LPWSTR
;======================================================
    mov esi, processor
    lodsd
    push NULL
    push NULL
    push OFFSET var_val
    push 0
    push lpwszItem
    push DWORD PTR [processor]
    call DWORD PTR [eax][IWbemClassObjectVtbl.Get]

    ret
wmiGet endp


;======================================================
writeWmiArray proc
;======================================================
    LOCAL szbuf[256]: byte

    mov ecx, [var_val + 8]
    mov esi,[ecx].SAFEARRAY.pvData
    mov edi,[ecx].SAFEARRAY.rgsabound.cElements

    .repeat ; while edi
        push esi
        push edi

        mov ecx, [esi]
        invoke wsprintf, ADDR szbuf, ADDR g_szPerSCr, ecx
        invoke StdOut, ADDR szbuf

        pop edi
        dec edi

        pop esi
        add esi,4
    .until edi==0 ;endw

    ret
writeWmiArray endp


;======================================================
writeWmiStr proc lpszItem: LPSTR, lpwszItem: LPWSTR, lpszFmt: LPSTR
;======================================================
    LOCAL szbuf[256]: byte

    invoke RtlZeroMemory, addr szbuf, sizeof szbuf
    invoke StdOut, lpszItem
    invoke wmiGet, lpwszItem
    test eax, eax
    .if ZERO?
        mov eax, [var_val]
        cmp eax, VT_EMPTY
        je  @writeWmiStrRet
        cmp eax, VT_NULL
        je  @writeWmiStrRet

        .IF eax==VT_BSTR
            invoke wsprintf, ADDR szbuf, lpszFmt, [var_val + 8]
            invoke StdOut, ADDR szbuf
        .ELSE
            .if eax==VT_ARRAY
                invoke writeWmiArray
            .else
                .IF eax==VT_BOOL
                    mov eax, [var_val + 8]
                    and eax, 0ffffh
                    .if eax==VARIANT_TRUE
                        push OFFSET g_szTrue
                    .else
                        push OFFSET g_szFalse
                    .endif
                    call StdOut
                .ENDIF
            .endif
        .ENDIF
    .else
        invoke StdOut, ADDR g_szFail
    .endif

@writeWmiStrRet:
    ret
writeWmiStr endp


;======================================================
EnumAntiVir proc
;======================================================
    invoke wmiConnectServer
    test   eax, eax
    jnz    @EnumAntiVirRet

    invoke wmiExecQuery, OFFSET g_wszSelectAntiVirus
    test   eax, eax
    jnz    @EnumAntiVirRet

@EnumAntiVirNext1:

    invoke wmiNext
    test   eax, eax
    jnz    @EnumAntiVirRet

    invoke writeWmiStr, ADDR g_szdisplayName, ADDR g_wszdisplayName, ADDR g_szPerSCr
    invoke writeWmiStr, ADDR g_szcompanyName, ADDR g_wszcompanyName, ADDR g_szPerSCr
    invoke writeWmiStr, ADDR g_szinstanceGuid, ADDR g_wszinstanceGuid, ADDR g_szPerSCr
    invoke writeWmiStr, ADDR g_szpathToSignedProductExe, ADDR g_wszpathToSignedProductExe, ADDR g_szPerSCr
    invoke writeWmiStr, ADDR g_szversionNumber, ADDR g_wszversionNumber, ADDR g_szPerSCr
    invoke writeWmiStr, ADDR g_szonAccessScanningEnabled, ADDR g_wszonAccessScanningEnabled, ADDR g_szPerSCr
    invoke writeWmiStr, ADDR g_szproductUptoDate, ADDR g_wszproductUptoDate, ADDR g_szPerSCr

    jmp @EnumAntiVirNext1

@EnumAntiVirRet:
    ret
EnumAntiVir endp


END
相关文章
|
10天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
6天前
|
机器学习/深度学习 算法 大数据
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
2024“华为杯”数学建模竞赛,对ABCDEF每个题进行详细的分析,涵盖风电场功率优化、WLAN网络吞吐量、磁性元件损耗建模、地理环境问题、高速公路应急车道启用和X射线脉冲星建模等多领域问题,解析了问题类型、专业和技能的需要。
2506 14
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
|
6天前
|
机器学习/深度学习 算法 数据可视化
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
2024年中国研究生数学建模竞赛C题聚焦磁性元件磁芯损耗建模。题目背景介绍了电能变换技术的发展与应用,强调磁性元件在功率变换器中的重要性。磁芯损耗受多种因素影响,现有模型难以精确预测。题目要求通过数据分析建立高精度磁芯损耗模型。具体任务包括励磁波形分类、修正斯坦麦茨方程、分析影响因素、构建预测模型及优化设计条件。涉及数据预处理、特征提取、机器学习及优化算法等技术。适合电气、材料、计算机等多个专业学生参与。
1519 14
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
|
8天前
|
编解码 JSON 自然语言处理
通义千问重磅开源Qwen2.5,性能超越Llama
击败Meta,阿里Qwen2.5再登全球开源大模型王座
531 13
|
1月前
|
运维 Cloud Native Devops
一线实战:运维人少,我们从 0 到 1 实践 DevOps 和云原生
上海经证科技有限公司为有效推进软件项目管理和开发工作,选择了阿里云云效作为 DevOps 解决方案。通过云效,实现了从 0 开始,到现在近百个微服务、数百条流水线与应用交付的全面覆盖,有效支撑了敏捷开发流程。
19282 30
|
1月前
|
人工智能 自然语言处理 搜索推荐
阿里云Elasticsearch AI搜索实践
本文介绍了阿里云 Elasticsearch 在AI 搜索方面的技术实践与探索。
18836 20
|
1月前
|
Rust Apache 对象存储
Apache Paimon V0.9最新进展
Apache Paimon V0.9 版本即将发布,此版本带来了多项新特性并解决了关键挑战。Paimon自2022年从Flink社区诞生以来迅速成长,已成为Apache顶级项目,并广泛应用于阿里集团内外的多家企业。
17524 13
Apache Paimon V0.9最新进展
|
8天前
|
人工智能 自动驾驶 机器人
吴泳铭:AI最大的想象力不在手机屏幕,而是改变物理世界
过去22个月,AI发展速度超过任何历史时期,但我们依然还处于AGI变革的早期。生成式AI最大的想象力,绝不是在手机屏幕上做一两个新的超级app,而是接管数字世界,改变物理世界。
458 48
吴泳铭:AI最大的想象力不在手机屏幕,而是改变物理世界
|
1天前
|
云安全 存储 运维
叮咚!您有一份六大必做安全操作清单,请查收
云安全态势管理(CSPM)开启免费试用
354 4
叮咚!您有一份六大必做安全操作清单,请查收
|
2天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。