vs2019 - signtool签名和验签的手工操作

文章目录

    • vs2019 - signtool签名和验签的手工操作
    • 概述
    • 笔记
    • 导入根证书
    • 时间戳服务器的选择
    • code sign - 签名
    • 文件在代码签名(code sign)前后的区别
    • 签名后, 查看属性, 是正常的.
    • 用signtool命令行进行验签
    • 移除签名
    • END

vs2019 - signtool签名和验签的手工操作

概述

signtool是进行code sign用的工具. 装了vs2019后自带(SDK中的工具).
code sign 是代码签名, 是用证书对PE文件进行签名.
前面实验用openssl已经生成了自签名的证书, 现在用vs2019自带的signtool试试code sign的签名和验签.
对PE文件进行了代码签名后, 在程序中的逻辑, 就可以判断自己程序的PE有没有被第三方改过.

笔记

打开vs2019本地x64命令行, 可以直接运行signtool.

D:\my_dev\my_local_git_prj\study\openSSL\exp\signtool_case>signtool /?
Usage: signtool <command> [options]Valid commands:sign       --  Sign files using an embedded signature.timestamp  --  Timestamp previously-signed files.verify     --  Verify embedded or catalog signatures.catdb      --  Modify a catalog database.remove     --  Remove embedded signature(s) or reduce the size of anembedded signed file.For help on a specific command, enter "signtool <command> /?"

但是signtool没有看版本的命令行参数, 也不知道运行的是哪个版本的signtool, 只能从环境变量的包含路径去猜测.
在vs2019x64本地命令行中查看PATH变量的值.

set path

整理PATH的值, 看看路径集合

Path=
C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\\Extensions\Microsoft\IntelliCode\CLI;
C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.29.30133\bin\HostX64\x64;
C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\VC\VCPackages;
C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\CommonExtensions\Microsoft\TestWindow;
C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer;
C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\bin\Roslyn;
C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Team Tools\Performance Tools\x64;
C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Team Tools\Performance Tools;
C:\Program Files (x86)\Microsoft Visual Studio\Shared\Common\VSPerfCollectionTools\vs2019\\x64;
C:\Program Files (x86)\Microsoft Visual Studio\Shared\Common\VSPerfCollectionTools\vs2019\;
C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools\x64\;
C:\Program Files (x86)\HTML Help Workshop;
C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\CommonExtensions\Microsoft\FSharp\Tools;
C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\Tools\devinit;
C:\Program Files (x86)\Windows Kits\10\bin\10.0.22000.0\x64;
C:\Program Files (x86)\Windows Kits\10\bin\x64;
C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\\MSBuild\Current\Bin;
C:\Windows\Microsoft.NET\Framework64\v4.0.30319;
C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\;
C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\Tools\;
C:\Program Files\Eclipse Foundation\jdk-8.0.302.8-hotspot\bin;
C:\Python311\Scripts\;C:\Python311\;
# ...

将everything找到的signtool.exe的列表导出为日志.

C:\Program Files (x86)\Microsoft SDKs\ClickOnce\SignTool\signtool.exe
C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages\microsoft.windows.sdk.buildtools\10.0.19041.8\bin\10.0.19041.0\x64\signtool.exe
C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages\microsoft.windows.sdk.buildtools\10.0.19041.8\bin\10.0.19041.0\x86\signtool.exe
C:\Program Files (x86)\Windows Kits\10\App Certification Kit\signtool.exe
C:\Program Files (x86)\Windows Kits\10\bin\10.0.17763.0\arm\signtool.exe
C:\Program Files (x86)\Windows Kits\10\bin\10.0.17763.0\arm64\signtool.exe
C:\Program Files (x86)\Windows Kits\10\bin\10.0.17763.0\x64\signtool.exe
C:\Program Files (x86)\Windows Kits\10\bin\10.0.17763.0\x86\signtool.exe
C:\Program Files (x86)\Windows Kits\10\bin\10.0.19041.0\arm\signtool.exe
C:\Program Files (x86)\Windows Kits\10\bin\10.0.19041.0\arm64\signtool.exe
C:\Program Files (x86)\Windows Kits\10\bin\10.0.19041.0\x64\signtool.exe
C:\Program Files (x86)\Windows Kits\10\bin\10.0.19041.0\x86\signtool.exe
C:\Program Files (x86)\Windows Kits\10\bin\10.0.22000.0\arm\signtool.exe
C:\Program Files (x86)\Windows Kits\10\bin\10.0.22000.0\arm64\signtool.exe
C:\Program Files (x86)\Windows Kits\10\bin\10.0.22000.0\x64\signtool.exe
C:\Program Files (x86)\Windows Kits\10\bin\10.0.22000.0\x86\signtool.exe
C:\Windows\Prefetch\SIGNTOOL.EXE-229E1730.pf
C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages\microsoft.windows.sdk.buildtools\10.0.19041.8\bin\10.0.19041.0\x64\signtool.exe.manifest
C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages\microsoft.windows.sdk.buildtools\10.0.19041.8\bin\10.0.19041.0\x86\signtool.exe.manifest
C:\Program Files (x86)\Windows Kits\10\App Certification Kit\signtool.exe.manifest
C:\Program Files (x86)\Windows Kits\10\bin\10.0.17763.0\arm\signtool.exe.manifest
C:\Program Files (x86)\Windows Kits\10\bin\10.0.17763.0\arm64\signtool.exe.manifest
C:\Program Files (x86)\Windows Kits\10\bin\10.0.17763.0\x64\signtool.exe.manifest
C:\Program Files (x86)\Windows Kits\10\bin\10.0.17763.0\x86\signtool.exe.manifest
C:\Program Files (x86)\Windows Kits\10\bin\10.0.19041.0\arm\signtool.exe.manifest
C:\Program Files (x86)\Windows Kits\10\bin\10.0.19041.0\arm64\signtool.exe.manifest
C:\Program Files (x86)\Windows Kits\10\bin\10.0.19041.0\x64\signtool.exe.manifest
C:\Program Files (x86)\Windows Kits\10\bin\10.0.19041.0\x86\signtool.exe.manifest
C:\Program Files (x86)\Windows Kits\10\bin\10.0.22000.0\arm\signtool.exe.manifest
C:\Program Files (x86)\Windows Kits\10\bin\10.0.22000.0\arm64\signtool.exe.manifest
C:\Program Files (x86)\Windows Kits\10\bin\10.0.22000.0\x64\signtool.exe.manifest
C:\Program Files (x86)\Windows Kits\10\bin\10.0.22000.0\x86\signtool.exe.manifest

结合这2个日志, 看看运行的是哪个路径中的signtool.exe
看起来好像是 C:\Program Files (x86)\Windows Kits\10\bin\10.0.22000.0\x64\signtool.exe
自己写个exe, 换掉 C:\Program Files (x86)\Windows Kits\10\bin\10.0.22000.0\x64\signtool.exe, 再运行signtool, 看看是不是这个exe.

// exe_show_path.cpp#include <iostream>int main(int argc, char** argv)
{int i = 0;printf("fake exe for test\n");for (i = 0; i < argc; i++){printf("param[%d] = [%s]\n", i, argv[i]);}return 0;
}
D:\my_dev\my_local_git_prj\study\openSSL\exp\signtool_case>signtool
fake exe for test
param[0] = [signtool]

这就验证了, 在vs2019x64本地命令行中运行的signtool.exe确实是 C:\Program Files (x86)\Windows Kits\10\bin\10.0.22000.0\x64\signtool.exe

看一下signtool.exe的版本信息, 版本为10.0.22000.832
在这里插入图片描述

导入根证书

如果是买的证书, 就不用导入根证书, win10证书库中就有大CA的根证书.
像自己做实验的自签名根证书, 就需要自己导入win10, 否则验签不过.
在win10中导入证书时, 说是只支持6种, 其实也支持*.PEM
在这里插入图片描述
在这里插入图片描述
将文件过滤器改为*.*, 然后导入自己的自签名根证书.
在这里插入图片描述

时间戳服务器的选择

code sign签名和验签时, 都需要时间戳服务器.
选大厂的时间戳服务器即可(e.g. digicert的 http://timestamp.digicert.com)

code sign - 签名

signtool sign /v /f my_app_cert.p12 /p pwd_exp_333333 /fd SHA256 /tr http://timestamp.digicert.com /td SHA256 case1.exe
D:\my_dev\my_local_git_prj\study\openSSL\exp\signtool_case>signtool sign /v /f my_app_cert.p12 /p pwd_exp_333333 /fd SHA256 /tr http://timestamp.digicert.com /td SHA256 case1.exe
The following certificate was selected:Issued to: my_appIssued by: my_root_caExpires:   Mon Feb 03 17:18:58 2025SHA1 hash: 83289266D9F2287F176A3D78FD292D9D36D297B9Done Adding Additional Store
Successfully signed: case1.exeNumber of files successfully Signed: 1
Number of warnings: 0
Number of errors: 0

文件在代码签名(code sign)前后的区别

大概看, 就是签名数据在文件尾部附加的, 在PE文件头部好像改了一个签名数据的位置索引值.
用BC4能大概看出来.
在这里插入图片描述

签名后, 查看属性, 是正常的.

在这里插入图片描述

用signtool命令行进行验签

必须要加/pa参数, 否则验签失败

signtool verify /all /debug /pa case1.exe
signtool verify /all /debug /pa case1.exeVerifying: case1.exeSignature Index: 0 (Primary Signature)
Hash of file (sha256): 4A247E0316FFE69969F1E764AF3B2C70913FC86F76B051A6F50F660BA5DA5EA3Signing Certificate Chain:Issued to: my_root_caIssued by: my_root_caExpires:   Wed Feb 01 17:05:22 2034SHA1 hash: B9B9F8C9F2AD14D630244E672871B9BB6F9C40E0Issued to: my_appIssued by: my_root_caExpires:   Mon Feb 03 17:18:58 2025SHA1 hash: 83289266D9F2287F176A3D78FD292D9D36D297B9The signature is timestamped: Sun Feb 11 11:31:18 2024
Timestamp Verified by:Issued to: DigiCert Assured ID Root CAIssued by: DigiCert Assured ID Root CAExpires:   Mon Nov 10 08:00:00 2031SHA1 hash: 0563B8630D62D75ABBC8AB1E4BDFB5A899B24D43Issued to: DigiCert Trusted Root G4Issued by: DigiCert Assured ID Root CAExpires:   Mon Nov 10 07:59:59 2031SHA1 hash: A99D5B79E9F1CDA59CDAB6373169D5353F5874C6Issued to: DigiCert Trusted G4 RSA4096 SHA256 TimeStamping CAIssued by: DigiCert Trusted Root G4Expires:   Mon Mar 23 07:59:59 2037SHA1 hash: B6C8AF834D4E53B673C76872AA8C950C7C54DF5FIssued to: DigiCert Timestamp 2023Issued by: DigiCert Trusted G4 RSA4096 SHA256 TimeStamping CAExpires:   Sat Oct 14 07:59:59 2034SHA1 hash: 66F02B32C2C2C90F825DCEAA8AC9C64F199CCF40Successfully verified: case1.exeNumber of signatures successfully Verified: 1
Number of warnings: 0
Number of errors: 0

可以看到, 用signtool验签也是成功的.

移除签名

对于已有签名的PE, 再进行签名, 在某些情况下可能有问题. 可以移除已有签名后, 再进行新的签名.
移除签名再签名的场景(进行2进制patch后, 原始签名再验签是过不去的, 必须移除原始签名, 再重新签名才行)

signtool remove /v /s case1.exe
D:\my_dev\my_local_git_prj\study\openSSL\exp\signtool_case>signtool remove /v /s case1.exeRemoving signature on file: D:\my_dev\my_local_git_prj\study\openSSL\exp\signtool_case\case1.exe
Successfully committed changes to the file: D:\my_dev\my_local_git_prj\study\openSSL\exp\signtool_case\case1.exeNumber of files successfully processed: 1
Number of warnings: 0
Number of errors: 0

在这里插入图片描述
移除签名后, 将cas1.exe和最开始的未签名的备份比较一下, 可以看到是相同的.
在这里插入图片描述
用BC4比较, 可以看到还是有2进制区别, 不过那个不同的地方, 可能是签名数据位置偏移的残留.
移除签名后, 应该和原始备份一样才对.
重新做了一次实验, 将exe_for_sign_x64.exe.org的拷贝命名为case1.exe.
对case1.exe进行code sign签名, 然后看看是否签名正常, 然后移除签名, 然后再2进制比较case1.exe和exe_for_sign_x64.exe.org.
还是发现有2进制区别, 估计是signtool的bug.
在这里插入图片描述
也不能算是signtool有bug, 假设有2进制区别的地方是签名数据的文件内部偏移. 签名移除后, 因为用不到签名数据了, 这个签名数据偏移位置写啥都行(反正都用不到了), signtool哪知道原始文件这个位置是什么值, 如果真的写成 0x 00 00 00, 也不见得就和原始文件相同.

END

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2779196.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

linux优化空间完全卸载mysql——centos7.9

文章目录 ⭐前言⭐linux命令使用&#x1f496; 基础命令&#x1f496; 内存优化&#x1f496; 完全删除mysql ⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;linux优化空间&完全卸载mysql——centos7.9。 linux内存分配 在Linux中&#xff0c;内存分配是通过几种…

Linux---网络基础

计算机中的常见概念 协议&#xff08;Protocol&#xff09;&#xff1a; 协议是计算机网络中用于通信的规则和约定的集合。它规定了数据传输的格式、序列、错误检测和纠正方法等。常见的网络协议包括TCP/IP、HTTP、FTP等。 IP地址&#xff08;IP Address&#xff09;&#xf…

Python3集合 set 心得

Python3集合 set 心得 本文是个人在学习中的一些心得&#xff0c;不能保证文中的内容准确&#xff0c;欢迎大家批评指正。 集合 set 是Python中的一种数据容器&#xff0c;集合有2种定义方式。 1、花括号 {} &#xff0c;花括号内加入集合的元素&#xff0c;元素之间用逗号 …

通过Dynamo删除Revit中族参数探究

起因是这样的&#xff0c;有位同事想在项目中直接删除revit族的参数&#xff0c;而不打开族&#xff0c;避免因为重载族&#xff0c;造成一些管件连接断开&#xff0c;于是就有了下面这些研究&#xff0c;当然是因为我没办法实现这个想法&#xff0c;所以这次可以分享下研究的过…

linux系统定时任务管理

crontab使用 一、crontab简介 crontab 这个指令所设置的工作将会循环的一直进行下去&#xff01;可循环的时间为分钟、小时、每周、每月或每年等。crontab 除了可以使用指令执行外&#xff0c;亦可编辑 /etc/crontab 来支持。 至于让 crontab 可以生效的服务则是 crond 这个服…

39 MDK 的编译过程及文件类型全解

文章目录 39.1 编译过程39.1.1 编译过程简介 39.2 程序的组成、存储与运行39.3 编译工具链39.3.1 MDK编译文件39.3.2 设置环境变量39.3.3 运行39.3.4 armcc、armasm 及 armlink39.3.4.1 armcc39.3.4.2 查询具体的MDK编译选项的具体信息39.3.4.3 armasm39.3.4.4 armlink39.3.4.5…

“OLED屏幕,色彩绚丽,画面清晰,让每一帧都生动无比。“#IIC协议【上】

"OLED屏幕&#xff0c;色彩绚丽&#xff0c;画面清晰&#xff0c;让每一帧都生动无比。"#IIC协议【上】 前言预备知识1.IIC协议初识1.1 IIC协议概述1.2 IIC协议的特点1.3 IIC协议的构成 2. IIC起始信号和终止信号2.1起始型号和终止信号时序图分析2.2起始信号函数和终…

JAVA学习笔记9

1.Java API 文档 1.java类的组织形式 2.字符类型(char) 1.基本介绍 ​ *字符类型可以表示单个字符&#xff0c;字符类型是char&#xff0c;char是两个字节&#xff08;可以存放汉字&#xff09;&#xff0c;多个字符我们用字符串String ​ eg:char c1 ‘a’; ​ char c2…

【Android】使用Android Studio运行Hello World项目

文章目录 1. JDK的安装与配置2. Android Studio的安装3. 运行Hello World项目3.1 新建项目3.2 修改项目配置3.2.1 修改UI界面3.2.2 配置 Android SDK 3.3 添加并运行虚拟设备3.4 运行项目 1. JDK的安装与配置 想要使用Android Studio&#xff0c;必须先配置Java环境&#xff0…

vue3初识

目录 一、前言二、主观感受三、vue3初探 原文以及该系列教程文章后续可点击这里查看&#xff1a;vue初识 一、前言 Vue.js是一款流行的前端框架&#xff0c;最初由尤雨溪&#xff08;Evan You&#xff09;于2014年创建&#xff0c;非常的年轻。官网为vue3&#xff0c; 但要注…

Learn LaTeX 015 - LaTex Typeset 抄录

https://www.douyin.com/user/self?modal_id7306721102380764453&showTabpost GitHub address: https://github.com/yasenstar/learn_latex Gitee address: https://gitee.com/yasenstar/learn_latex

windows 查看磁盘空间 treesizefree

https://downloads.jam-software.de/treesize_free/TreeSizeFreeSetup.exe

Hugging Face 刚刚推出了一款开源的 AI 助手制造工具,直接向 OpenAI 的定制 GPT 挑战

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

清空队列的方法

注意&#xff1a;C中的队列queue自身不支持clear操作&#xff0c;但双端队列deque是支持clear操作的。 方法一&#xff1a;直接用空的队列对象赋值 代码&#xff1a; queue<int> q; qqueue<int>(); 方法二&#xff1a;遍历出队列 代码&#xff1a; while(!q…

C#系列-使用 Minio 做图片服务器实现图片上传 和下载(13)

1、Minio 服务器下载和安装 要在本地安装和运行 MinIO 服务器&#xff0c;你可以按照以下 步骤进行操作&#xff1a; 1. 访问 MinIO 的官方网站&#xff1a;https://min.io/&#xff0c;然后 点击页面上的”Download”按钮。 2. 在下载页面上&#xff0c;选择适合你操作系统的 …

AJ-Report 【开源的一个BI平台】

AJ-Report是全开源的一个BI平台&#xff0c;酷炫大屏展示&#xff0c;能随时随地掌控业务动态&#xff0c;让每个决策都有数据支撑。     多数据源支持&#xff0c;内置mysql、elasticsearch、kudu驱动&#xff0c;支持自定义数据集省去数据接口开发&#xff0c;目前已支持30…

【JS逆向六】(下)逆向解密某网站返回的密文的值 仅供学习

逆向日期&#xff1a;2024.02.07 使用工具&#xff1a;Node.js 文章全程已做去敏处理&#xff01;&#xff01;&#xff01; 【需要做的可联系我】 可使用AES进行解密处理&#xff08;直接解密即可&#xff09;&#xff1a;在线AES加解密工具 1、打开某某网站(请使用文章开头的…

2024年1月23日 Go生态洞察:开发者对Go的反馈分享

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a;…

鸿蒙开发系列教程(十五)--gesture 手势事件

gesture 手势事件 手势操作是指在移动设备上使用手指或手势进行与应用程序交互的方式。手势操作可以包括点击、滑动、双击、捏合等动作&#xff0c;用于实现不同的功能和操作。 gesture 常规手势 参考代码&#xff1a; Entry Component struct Test03 {build() {Column() {…

Stable Diffusion 模型下载:ToonYou(平涂卡通)

文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十 下载地址 模型介绍 ToonYou 是一个平涂风格的卡通模型&#xff0c;它的画风独特、光感强烈、画面表现力强、场景结构完整&#xff0c;一张张图犹如动画电影截图&#xff0c;非常值得推…