验证微软和微软提供给第三方的数字签名

【51单片机】AT24C02(江科大、爱上半导体) I2C总线(Inter IC BUS)是由Philips公司开发的一种通用数据总线· 两根通信线:SCL(Serial Clock)、SDA (Serial Data)· 同步、半双工,带数据应答· 通用的I2C总线,可以使各种设备的通信标准统一,对于厂家来说,使用成熟的方案可以缩短芯片设计周期、提高稳定性,对于应用者来说,使用通用的通信协议可以避免学习各种各样的自定义协议,降低了学习和应用的难度。 阅读详情

验证微软和微软提供给第三方的签名 ,看MSDN内容好多啊!不过下面的程序对已签名的文件验证是没有问题的。




// WinTrustSignature.cpp : Defines the entry point for the console application.

//


#include "stdafx.h"
// GetFileSignature.cpp : Defines the entry point for the console application.
//




#include "stdafx.h"




/*
 * An example of file signature verification using WinTrust API
 * Derived from the sample vertrust.cpp in the Platform SDK
 *
 * Copyright (c) 2009 Mounir IDRASSI <mounir.idrassi@idrix.fr>. All rights reserved.
 *
 * This program is distributed in the hope that it will be useful, 
 * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
 * or FITNESS FOR A PARTICULAR PURPOSE.
 * 
 */




#ifndef UNICODE
#define UNICODE
#endif




#ifndef _UNICODE
#define _UNICODE
#endif




#define _WIN32_WINNT 0x0500
#define WINVER       0x0500




#include <windows.h>
#include <Softpub.h>
#include <Wincrypt.h>
#include <tchar.h>
#include <stdlib.h>




#pragma comment(lib, "Crypt32.lib")
#pragma comment(lib, "Wintrust.lib")




LPTSTR GetCertificateDescription(PCCERT_CONTEXT pCertCtx)
{
   DWORD dwStrType;
   DWORD dwCount;
   LPTSTR szSubjectRDN = NULL;




   dwStrType = CERT_X500_NAME_STR;
   dwCount = CertGetNameString(pCertCtx,
      CERT_NAME_RDN_TYPE,
      0,
      &dwStrType,
      NULL,
      0);
   if (dwCount)
   {
      szSubjectRDN = (LPTSTR) LocalAlloc(0, dwCount * sizeof(TCHAR));
      CertGetNameString(pCertCtx,
         CERT_NAME_RDN_TYPE,
         0,
         &dwStrType,
         szSubjectRDN,
         dwCount);
   }




   return szSubjectRDN;
}








int _tmain(int argc, _TCHAR* argv[])
{
   GUID guidAction = WINTRUST_ACTION_GENERIC_VERIFY_V2;
   WINTRUST_FILE_INFO sWintrustFileInfo;
   WINTRUST_DATA      sWintrustData;
   HRESULT            hr;




   if (argc != 2)
   {
      _tprintf(_T("Usage: VerifyExeSignature file_name\n"));
      return -1;
   }




   memset((void*)&sWintrustFileInfo, 0x00, sizeof(WINTRUST_FILE_INFO));
   memset((void*)&sWintrustData, 0x00, sizeof(WINTRUST_DATA));




   sWintrustFileInfo.cbStruct = sizeof(WINTRUST_FILE_INFO);
   sWintrustFileInfo.pcwszFilePath = argv[1];
   sWintrustFileInfo.hFile = NULL;




   sWintrustData.cbStruct            = sizeof(WINTRUST_DATA);
   sWintrustData.dwUIChoice          = WTD_UI_NONE;
   sWintrustData.fdwRevocationChecks = WTD_REVOKE_NONE;
   sWintrustData.dwUnionChoice       = WTD_CHOICE_FILE;
   sWintrustData.pFile               = &sWintrustFileInfo;
   sWintrustData.dwStateAction       = WTD_STATEACTION_VERIFY;




   hr = WinVerifyTrust((HWND)INVALID_HANDLE_VALUE, &guidAction, &sWintrustData);




   if (TRUST_E_NOSIGNATURE == hr)
   {
      _tprintf(_T("No signature found on the file.\n"));
   }
   else if (TRUST_E_BAD_DIGEST == hr)
   {
      _tprintf(_T("The signature of the file is invalid\n"));
   }
   else if (TRUST_E_PROVIDER_UNKNOWN == hr)
   {
      _tprintf(_T("No trust provider on this machine can verify this type of files.\n"));
   }
   else if (S_OK != hr)
   {
      _tprintf(_T("WinVerifyTrust failed with error 0x%.8X\n"), hr);
   }
   else
   {
      _tprintf(_T("File signature is OK.\n"));




      // retreive the signer certificate and display its information
      CRYPT_PROVIDER_DATA const *psProvData     = NULL;
      CRYPT_PROVIDER_SGNR       *psProvSigner   = NULL;
      CRYPT_PROVIDER_CERT       *psProvCert     = NULL;
      FILETIME                   localFt;
      SYSTEMTIME                 sysTime;




      psProvData = WTHelperProvDataFromStateData(sWintrustData.hWVTStateData);
      if (psProvData)
      {
         psProvSigner = WTHelperGetProvSignerFromChain((PCRYPT_PROVIDER_DATA)psProvData, 0 , FALSE, 0);
         if (psProvSigner)
         {
            FileTimeToLocalFileTime(&psProvSigner->sftVerifyAsOf, &localFt);
            FileTimeToSystemTime(&localFt, &sysTime);




            _tprintf(_T("Signature Date = %.2d/%.2d/%.4d at %.2d:%2.d:%.2d\n"), sysTime.wDay, sysTime.wMonth,sysTime.wYear, sysTime.wHour,sysTime.wMinute,sysTime.wSecond);




            psProvCert = WTHelperGetProvCertFromChain(psProvSigner, 0);
            if (psProvCert)
            {
               LPTSTR szCertDesc = GetCertificateDescription(psProvCert->pCert);
               if (szCertDesc)
               {
                  _tprintf(_T("File Signer = %s\n"), szCertDesc);
                  LocalFree(szCertDesc);
               }
            }




            if (psProvSigner->csCounterSigners)
            {
               _tprintf(_T("\n"));
               // Timestamp information
               FileTimeToLocalFileTime(&psProvSigner->pasCounterSigners[0].sftVerifyAsOf, &localFt);
               FileTimeToSystemTime(&localFt, &sysTime);




               _tprintf(_T("Timestamp Date = %.2d/%.2d/%.4d at %.2d:%2.d:%.2d\n"), sysTime.wDay, sysTime.wMonth,sysTime.wYear, sysTime.wHour,sysTime.wMinute,sysTime.wSecond);               
               psProvCert = WTHelperGetProvCertFromChain(&psProvSigner->pasCounterSigners[0], 0);
               if (psProvCert)
               {
                  LPTSTR szCertDesc = GetCertificateDescription(psProvCert->pCert);
                  if (szCertDesc)
                  {
                     _tprintf(_T("Timestamp Signer = %s\n"), szCertDesc);
                     LocalFree(szCertDesc);
                  }
               }
            }
         }
      }
   }
   
   sWintrustData.dwUIChoice = WTD_UI_NONE;
   sWintrustData.dwStateAction = WTD_STATEACTION_CLOSE;
   WinVerifyTrust((HWND)INVALID_HANDLE_VALUE, &guidAction, &sWintrustData);




return 0;
}
蓝桥杯学习笔记二:AT24C02学习 AT24C02与I2C通信过程的具体学习,附按键次数 获取的实验 阅读详情

相关推荐

IIC协议详解--Linux下I2C读取AT24C02例程

I2C 是很常见的一种总线协议, I2C是NXP公司设计的,I2C 使用两条线在主控制器和从机之间进行数据通信。一条是 SCL(串行时钟线),另外一条是 SDA(串行数据线),因为I2C这两条数据线是开漏输出的,所以需要接上拉电阻,总线空闲的时候 SCL 和 SDA 处于高电平。I2C 总线标准模式下速度可以达到 100Kb/S,快速模式下可以达到 400Kb/S。感兴趣的可以读《I2C总线规范和用户手册》

weixin_37553721的博客 2696

Time-stamp service-开源

该软件实现时间戳服务。 (主要实现分层时间戳协议。此协议在已发表的论文中提出,可以在此软件包中找到。)代码可以帮助您构建时间戳服务器。

STM32——AT24C02(EEPROM )

AT24C02是一种2 Kb(256 × 8)串行电子可擦可编程只读存储器(EEPROM)芯片,支持标准I2C总线通信协议。AT24C02的编程操作是以页为单位完成的,每次最多可编程8个连续字节。具体来说,AT24C02的一页大小为8个字节,每次写入数据时,需要确保写入的数据不跨页。因此,如果要在AT24C02中写入10个字节的数据,需要先将前8个字节写入一个页,再将后两个字节写入另一个页。

ITach666的博客 3032

对Windows 平台下PE文件数字签名的一些研究

Windows平台上PE文件的数字签名有两个作用:确保文件来自指定的发布者和文件被签名后没有被修改过。因此有些软件用数字签名来验证文件是否来自家厂商以及文件的完整性,安全软件也经常通过验证文件是否有数字签名来防误报。但是因为windows对于常用的数字签名验证API- WinVerifyTrust实现的问题,以及一些并不恰当的示例代码,很多地方在验证数字签名时存在卡慢或者安全性不高的问题。本文将介...

snowfoxmonitor的专栏 7776

江科大51单片机笔记【12】AT24C02(I2C总线)

AT24C02是一种可以实现掉电不丢失的存储器,可用于保存单片机运行时想要永久保存的数据信息存储介质:EPROM通讯接口:I2C总线容量:256字节I2C总线(intel IC BUS)是有飞利浦公司开发的一种通用数据总线两根通信线:SCL(serial clock)、SDA(serial data)同步、半双工、带数据应答。

2301_80195807的博客 2182

proteus I2C Debugger 查看 AT24C02写入读取

I2C Debugger仪器,在仿真调试期中,该仪器可以显示I2C数据传送时间、S(START状态)、Sr(ReStart状态)、A(Ask响应)、N (No ask状态)、P(Stop状态)、数据(同时显示数据的16进制值和每位的值)。start_time() --> write_addr(1, sec),写入数据,查看I2C Debugger日志。start_time函数,最开始调用 read_addr(1),读取存储的数据,查看I2C Debugger日志。

a3676212的专栏 2118

获取文件数字签名证书信息

验证文件数字签名是否有效可以使用函数 WinVerifyTrust 取得文件数字签名证书信息需要使用函数 CryptQueryObject。// FileSign.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include #include #include #include #include #pragma comment(lib, "

云守护的专栏 1万+

2025蓝桥杯(单片机)备赛--扩展外设之I2C的重要应用--AT24C02(七)

I2C的详细讲解之AT24C02的应用,超详细!!!

m0_75014814的博客 2184

获取windows下执行文件签名和证书信息

获取证书信息验证文件数字签名是否有效可以使用函数 WinVerifyTrust,可以用:取得文件数字签名证书信息需要使用函数 CryptQueryObject,再用CertFindCertificateInStore获取证书Cert也可以通过,WTHelperProvDataFromStateData WTHelperGetProvSignerFromChain WTHelperGetProvCe...

weixin_34232617的博客 6030

STM32F103 I2C软件模拟(AT24C02)

有关I2C通信协议我们在《通信协议-I2C》已经进行了详细的介绍,因此这一节不再重复介绍。 一、软件/硬件I2C 想要控制STM32产生I2C方式的通讯,可以采用软件模拟或硬件I2C这两种方式。 1.1 软件模拟 所谓软件模拟,即直接使用CPU内核按照I2C协议的要求控制GPIO输出高低电平。 如控制产生I2C的起始信号时, 先控制作为SCL线的GPIO引脚输出高电平, 然后控制作为SDA线的G...

Graceful_scenery的博客 1916

AT89C51使用I2C总线扩展AT24C02

I2C总线扩展AT24C04AT24C04简介电路原理图C代码仿真效果   使用C51扩展24C04,在24C04中写入数据"Qing Ye Mu Rong!",再从24C04中读取"Qing Ye Mu Rong!"并保存在C51内存之中。LED灯亮表示写入成功,根据存取状态返回值判断。 AT24C04简介 24C02是一个2K位串行CMOS 的EEPROM,内部含有256个8位字节。 引脚简介: VCC和VSS是芯片的电源和地,电压的工作范围为:+1.8V~+6.0V。 A0、A1、A2是

青烨慕容 2734

验证pe文件数字签名

// exam5.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include #include #include #include #include "mscat.h" #pragma comment (lib, "WinTrust.lib") BOOL CheckFileTrust(LPCTSTR lpFileName); BOOL C

一步一步 5240

树莓派的I2C - AT24C02 EEPROM 芯片

学习树莓派的I2C模块,理解Linux i2c device driver

清风冰竹 5472

端口被占用的解决方案

在windows命令行窗口下执行: 运行–cmd C:\>netstat -aon|findstr "8080"TCP 127.0.0.1:80 0.0.0.0:0 LISTENING 2448端口被进程号为2448的进程占用,继续执行下面命令:C:\>tasklist|findstr "2448"thread.e...

weixin_34183910的博客 159

AT32F421实战:I2C驱动AT24C02 EEPROM存储与数据回传

本文详细介绍了AT32F421微控制器通过I2C接口驱动AT24C02 EEPROM的实战过程,涵盖硬件连接、I2C初始化、跨页存储处理及串口数据验证等关键步骤。重点解析了AT24C02的读写操作、错误处理与性能优化技巧,为嵌入式开发提供实用指南。

j2k3l4的博客 977

STM32单片机基础13——使用硬件I2C读写EEPROM(AT24C02)

本篇详细的记录了如何使用STM32CubeMX配置STM32L431RCT6的硬件I2C外设读取EEPROM数据(以AT24C02为例)。 1. 准备工作 硬件准备 开发板 首先需要准备一个开发板,这里我准备的是STM32L4的开发板(BearPi): EEPROM 小熊派开发板左边的接口是E53接口,用来连接E53接口的扩展板,每个扩展板都板载了一块EEPROM用来保存信息,如图: ...

小熊派开源社区的博客 2648

win7 64位驱动程序数字签名补丁

关于win7 64位 驱动程序数字签名的问题,昨天研究了一个下午,总结如下: 1、开机按F8,选择禁止驱动程序签名强制。 2、以管理员身份运行cmd,输入gpedit.msc,进入组策略,选择用户配置-管理模块-系统-驱动程序安装-驱动程序的代码签名,选择已启用-忽略。 3、管理员运行cmd,输入 bcdedit/set testsigning on进入测试模式。 4、管理员运行cmd,输入bcdedit.exe -set loadoptions DDISABLE_INTEGRITY_CHECKS。 5、下载签名工具Windows 64Signer V1.2,签名,具体方法不再描述。 以上5种办法,经过反复试验,其实都不能解决根本问题,网上说有签名补丁,但又不知道什么补丁,找了半天也没找到,最后在以为IT好友的帮助下,在微软官网上找到了补丁,安装重启电脑,一切OK,反复测试都没有问题。

微软驱动数字签名失败解决补丁

Windows无法验证文件数字签名而无法启动,无法验证此驱动的数字签名的网络上的解决方案一般都是下面几种: 第一种: 开机时按F8键,在弹出的菜单中有 禁用驱动程序签名强制 选项,使用上下键选中之后,再按回车键确认,进入系统。 第二种 点击“开始”-运行,输入gpedit.msc然后点击“确定”。组策略编辑器中选择“用户配置”中的“管理模板”然后在管理模板中点击“系统”打开;“设备驱动程序的代码签名”窗口中,选择“已启用”,然后下方这里可以选择“忽略”,点击“确定”。这样我们就禁用了驱动程序签名强制。 以上方案都是治标不治本的方法,国内的百度搜索出来的基本是这种方式,其实最根本的原因是比较新的数字签名加密使用的SHA256加密方式,而window7 sp1是不支持的,不过微软已经开放了补丁,不过对于大多数window开发者没有打补丁的习惯,只要打完补丁数字签名即可生效

上一篇: 如何判断车距
下一篇: Inside windows vista User Account Control 用户账户控制
wcppcw
博客等级 码龄18年 1粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值