首页
社区
课程
招聘
[求助]关于PE文件的数字签名
发表于: 2014-4-7 11:58 20531

[求助]关于PE文件的数字签名

2014-4-7 11:58
20531
我想验证一个PE文件的数字签名是否可靠,能有什么实现的方法,而不使用WindowsAPI- WinVerifyTrust,CryptQueryObject, ,因为考虑到Hook WinVerifyTrust/CryptQueryObject,能自己解析吗?如果自己解析的话,是不是得熟悉一下PKCS#7的格式,哪位大神能给我一些提示,不胜感激,语言不限,C#,C,Python都可以

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (20)
雪    币: 35
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
算了,暂时找不到解决办法,考虑的项目的进度,目前采用WinVerifyTrust。同时对WinVerifyTrust这个函数的完整性进行检测, 检测是否被Hook
2014-4-12 22:58
0
雪    币: 18
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
第三方签名,和微软的签名,这个api是不是都可以检测到?
2014-4-12 23:45
0
雪    币: 209
活跃值: (138)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
这个函数只能监测带有数字签名区的文件的签名,而实际上系统的dll很多都没有签名区,但也是在外部签名了的
2014-4-13 09:17
0
雪    币: 35
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
是的, 我手动更改了某公司的一个文件, WinVerifyTrust就验证数字签名被破坏了。
2014-4-15 21:11
0
雪    币: 35
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
对啊, 系统文件没有数字签名区,但是确实有签名的内容,用WinVerifyTrust可以验证,但是CryptQueryObject无法获取到证书的内容,不知道前辈是否有什么方法,可以获取到签名的内容(我要把他显示出来在界面上),比如发布人,时间戳等,我能读取到PE文件中签名的块,但是不知道里面具体结构怎么解析,PKCS#7的资料太少,看的不是很懂
2014-4-18 11:53
0
雪    币: 35
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
对啊, 系统文件没有数字签名区,但是确实有签名的内容,用WinVerifyTrust可以验证,但是CryptQueryObject无法获取到证书的内容,不知道前辈是否有什么方法,可以获取到签名的内容(我要把他显示出来在界面上),比如发布人,时间戳等,我能读取到PE文件中签名的块,但是不知道里面具体结构怎么解析,对应的数据结构是什么,PKCS#7的资料太少,看的不是很懂
2014-4-18 11:54
0
雪    币: 30050
活跃值: (2377)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
PE结构有个参数表示参数表示了该PE的签名在PE的偏移和签名的大小,如果为0说明不存在签名。

签名的流程其实很简单,其实就是计算HASH(有MD5和SHA1等算法),对于驱动还必须计算校验和。如果PE的体积不为16整除,后面还需要加0填充。

      InitializeChecksum(FChecksum);
      InitializeMD5(MD5);
      InitializeSHA1(SHA1);
      ......
      if (wMagic = $020B) then //这个是PE64文件,结构不一样
      begin
       //PE32+ . Optional Variable   16
       //,  SizeOfStackReserve, SizeOfStackCommit,
       //SizeOfHeapReserve  SizeOfHeapCommit  DWORD,
       //64  .
       FDelta64bit := $10;
      end;
      FStream.Seek(StreamPos, soFromBeginning);
      。。。。。。。。。

计算完毕后,用PKCS7格式封装,然后一般是放在PE尾部。最后修改PE结构,指明该签名的文件偏移和大小。

校验也是一样的。

而对于交叉签名(也就是WIN64的驱动必须),实际上也是一样的,只不过是一个PE存在多个证书而已。
时间戳其实也是一样,就是一个证书。递交HASH后,返回的其实就是PKCS格式的了。

大概应该如此,很多年前玩过一次,不大记得了。可惜代码是DELPHI的,对你没有用处。
2014-4-23 23:10
0
雪    币: 30050
活跃值: (2377)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
以前最喜欢玩这个,直接文件操作证书:









上传的附件:
2014-4-23 23:20
0
雪    币: 478
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
[QUOTE=bestbird;1277413]以前最喜欢玩这个,直接文件操作证书:









[/QUOTE]
求分享啊
2014-4-24 12:53
0
雪    币: 30050
活跃值: (2377)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
玩具而已。。。很久以前学习证书时搞来玩的,就不献丑了。
2014-4-25 13:07
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
鸟神,分享一下嘛
2014-4-25 13:23
0
雪    币: 120
活跃值: (160)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
[QUOTE=bestbird;1277413]以前最喜欢玩这个,直接文件操作证书:









[/QUOTE]

神器。求分享。
2014-4-25 13:31
0
雪    币: 242
活跃值: (16)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
14
verisign class 6这个根证书表示没见过,自己加的吧 ~
2014-4-25 16:11
0
雪    币: 10867
活跃值: (2843)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
[QUOTE=bestbird;1277413]以前最喜欢玩这个,直接文件操作证书:









[/QUOTE]

神器呀, 求分享!!
2014-4-30 13:33
0
雪    币: 1
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
我一开始也被那帖唬住了。仔细看才发现原来根证书是自己添加的。
2014-5-1 10:41
0
雪    币: 30050
活跃值: (2377)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
17
其实就是自定义签名了。
根证书其实也就存储在操作系统,直接修改那数据库就好了。当然,系统是允许两个根证书的名称是一样的,但是指纹必须不一样,否则新的会覆盖旧的。所以verisign class 6,1,2,3,其实没有区别的。看你想弄个什么名称而已。
只不过是,这些完全不依赖系统的什么PKI函数或OPENSSL,而是直接writefile,readfile而已。
2014-5-1 13:01
0
雪    币: 1
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
能过64位系统的签名验证吗?
2014-5-1 23:05
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
[QUOTE=bestbird;1277413]以前最喜欢玩这个,直接文件操作证书:









[/QUOTE]

大神,求分享啊,这么厉害的神器~~~!
2014-5-3 18:26
0
雪    币: 2
活跃值: (55)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
鸟神大佬把工具代码发出来啊,别自己用啊
2021-7-2 05:19
0
雪    币: 2
活跃值: (55)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
bestbird 玩具而已。。。很久以前学习证书时搞来玩的,就不献丑了。
鸟神大佬把工具代码发出来啊,别自己用啊
2021-7-2 05:20
0
游客
登录 | 注册 方可回帖
返回
//