用AutoIT编写的验证windows下可执行程序(*.exe)的数字签名有效性的自动化脚本

leader要求写一个验证数字签名有效性的程序

一开始打算用VC写的,后来发现貌似没办法从可执行程序中取到数字签名的地址

后来想到了抓窗口这种不是办法的办法

于是便开始学AutoIT啦~

 

废话不多说,程序主要实现了:

从配置文件Profile.txt中读取要验证的文件所在的路径dir

自动化脚本会逐个打开该目录下所有*.exe的文件的属性窗口

首先判断是否有“数字签名”标签页,若无,则fail

有的话则先后取出数字签名的名称、签名时间和证书的有效期(同样是通过抓窗口得到)

然后验证签名时间是否在证书有效期内,若不在,则fail

最后将每个文件的验证结果写入LogFile.txt

 

OK...附上源码~希望看过的童鞋可以提出你们宝贵的意见~

可以是这个程序,也可以是关于软件自动化的~O(∩_∩)O~

#cs ----------------------------------------------------------------------------

 AutoIt Version: 3.3.6.1
 Author:         myName

 Script Function:
    Template AutoIt script.

#ce ----------------------------------------------------------------------------

; Script Start - Add your code below here

#include <Date.au3>
#include <File.au3>

$profile=FileOpen("Profile.txt", 0)
If $profile = -1 Then
    MsgBox(0, "Error", "Unable to open profile.")
    Exit
EndIf
   
While 1
    $line = FileReadLine($profile)
    If @error = -1 Then ExitLoop
    ;MsgBox(0, "Line read:", $line)
    Run(@ComSpec & " /c " & 'explorer '& $line, "", @SW_HIDE)
;    MsgBox(0, "", $line)
    WinWaitActive("", $line)
    ListFile($line)
    WinClose("", $line)
WEnd

FileClose($profile)

#cs -----------------------------------------
 遍历指定的文件夹
#ce -----------------------------------------
Func ListFile($Path)
        $file = _FileListToArray($Path, "*.exe", 1)
        ;If Not IsArray($folder) Then Return 0
        For $i = 1 To $file[0]
                ;MsgBox(0, '', $Path & "/" & $file[$i])
                ;MsgBox(0, "", $file[$i])
                Main($file[$i])
        Next
EndFunc

#cs -----------------------------------------
 Main
#ce -----------------------------------------
Func Main($filename)
    Send($filename & "!{ENTER}")
    WinWaitActive($filename & " 属性")
    If HasDigitalSignatureOrNot($filename) = False Then
        MsgBox(64, "test", "没有数字签名")
        $logfile=FileOpen("LogFile.txt", 1)
        FileWriteLine($logfile, "FileName: " & $filename)
        FileWriteLine($logfile, "验证结果: Failed 该文件没有数字签名")
        FileWriteLine($logfile, @CRLF)
        FileClose($logfile)
        WinClose($filename & " 属性")
    Else
        $name=GetDSName($filename)
        $time=GetDSTime($filename)
        Send("!v")
        WinWaitActive("证书", "常规")
        Send("^{TAB}")
        $starttime=GetCertificateStartDate()
        $lasttime=GetCertificateLastDate()
        ;MsgBox(64, "证书", "有效期从 " & $starttime & " 到 " & $lasttime)
        $result=VerifyDS($name, $time, $starttime, $lasttime)
        WriteLogFile($result, $filename, $name, $time, $starttime, $lasttime)
        CloseWindow($filename)
    EndIf
EndFunc

#cs -----------------------------------------
 得到文件属性的数字签名标签页
 [循环次数]
 [没有数字签名标签页的话就表示没有签名 Return False 否则Return True]
#ce -----------------------------------------
Func HasDigitalSignatureOrNot($filename)
    $n=0
    While $n < 7
        $Text=WinGetText($filename & " 属性")
        $Value=StringSplit($Text,@CRLF)
        For $i=1 To $Value[0]
            If StringRegExp($Value[$i], "数字签名") Then
                ;MsgBox(64,"Title",$Value[$i])
                Return True
            EndIf
        Next
    ;    MsgBox(64, "T", $i)
        Send("^{TAB}")
        $n = $n + 1
    WEnd
    Return False
EndFunc

#cs -----------------------------------------
 得到数字签名的名称
#ce -----------------------------------------
Func GetDSName($filename)
    ControlClick($filename & " 属性", "数字签名", 101, "", 2, 141, 34)
    WinWaitActive("数字签名详细信息", "常规")
    $name=ControlGetText("数字签名详细信息", "名称:", 100)
    ;MsgBox(64, "数字签名", "名称=" & $name)
    Return $name
EndFunc

#cs -----------------------------------------
 得到数字签名的签名时间
#ce -----------------------------------------
Func GetDSTime($filename)
    ControlClick($filename & " 属性", "数字签名", 101, "", 2, 141, 34)
    WinWaitActive("数字签名详细信息", "常规")
    $time=ControlGetText("数字签名详细信息", "签名时间:", 102)
    ;MsgBox(64, "数字签名", "签名时间=" & $time)
    Return $time
EndFunc

#cs -----------------------------------------
 得到证书有效期的开始时间
#ce -----------------------------------------
Func GetCertificateStartDate()
    ControlClick("证书", "证书属性", 101, "", 1, 90, 120)
    $starttime=ControlGetText("证书", "证书属性", 102)
    Return $starttime
EndFunc

#cs -----------------------------------------
 得到证书有效期的结束时间
#ce -----------------------------------------
Func GetCertificateLastDate()
    ControlClick("证书", "证书属性", 101, "", 1, 42, 135)
    $lasttime=ControlGetText("证书", "证书属性", 102)
    Return $lasttime
EndFunc

#cs -----------------------------------------
 把文件的数字签名信息写入LogFile
#ce -----------------------------------------
Func WriteLogFile($result, $filename, $name, $time, $starttime, $lasttime)
    $logfile=FileOpen("LogFile.txt", 1)
    FileWriteLine($logfile, "FileName: " & $filename)
    FileWriteLine($logfile, "数字签名信息:")
    FileWriteLine($logfile, "--名称: " & $name)
    FileWriteLine($logfile, "--签名时间: " & $time)
    FileWriteLine($logfile, "证书信息:")
    FileWriteLine($logfile, "--有效期从 " & $starttime & " 到 " & $lasttime)
    FileWriteLine($logfile, "验证结果: " & $result)
    FileWriteLine($logfile, @CRLF)
    FileClose($logfile)
EndFunc

#cs -----------------------------------------
 验证数字签名的签名时间是否过期
 [验证数字签名名称和时间的有效性]
#ce -----------------------------------------
Func VerifyDS($name, $time, $starttime, $lasttime)
    ;验证$name
    ;$time
    ;$startime
    ;$lasttime
    If $name = "" Or $name = "不可用" Then
        $result="Failed: 无效的数字签名名称"
        Return $result
    ElseIf Not StringRegExp($time, ".*年.*月.*日") Then
        $result="Failed: 无效的数字签名时间"
        Return $result
    ElseIf Not StringRegExp($starttime, ".*年.*月.*日") Then
        $result="Failed: 无效的证书有效期"
        Return $result
    ElseIf Not StringRegExp($lasttime, ".*年.*月.*日") Then
        $result="Failed: 无效的证书有效期"
        Return $result
    EndIf
       
    $time=StringRegExpReplace($time,"年|月","/")
    $time=StringRegExpReplace($time,"日","")
    $time=StringRegExpReplace($time, "[^0-9/:[:blank:]]", "")
   
    $starttime=StringRegExpReplace($starttime,"年|月","/")
    $starttime=StringRegExpReplace($starttime,"日","")
    $starttime=StringRegExpReplace($starttime, "[^0-9/:[:blank:]]", "")
   
    $lasttime=StringRegExpReplace($lasttime,"年|月","/")
    $lasttime=StringRegExpReplace($lasttime,"日","")
    $lasttime=StringRegExpReplace($lasttime, "[^0-9/:[:blank:]]", "")
   
    $num1=_DateDiff('D', $starttime, $time)
    $num2=_DateDiff('D', $lasttime, $time)
;    MsgBox(0, "result", $result1 & @CRLF & $result2)
    If $num1 > 0 And $num2 < 0 Then
        $result="Pass"
    Else
        $result="Failed: 数字签名时间不在证书有效期内"
    EndIf
    Return $result
EndFunc

#cs -----------------------------------------
 程序结束关闭打开的窗口
#ce -----------------------------------------
Func CloseWindow($filename)
    WinClose("证书")
    WinClose("数字签名详细信息")
    WinClose($filename & " 属性")
EndFunc

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值