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