PE文件中,生成签名的时候会有一部分不参与签名hash计算,我们可以修改这部分而不破坏签名校验

下图中粗体的部分,就是签名的相关内容。灰色背景的部分,不参与签名的hash计算。

image-20230728172817882

证书表偏移位于数据目录中第5个结构,VirtualAddress是文件偏移,Size是证书表的大小

image-20230728172417155

按照偏移找到证书表开头,证书表前几个字节是一个WIN_CERTIFICATE结构体,其中前4个字节为证书的大小。每一个证书信息都需要按照8字节进行对齐

image-20230728172936635

下图中,最后两个字节是填充字节00,手动修改这一部分进行验证。

image-20230728173220505

签名正常

image-20230728173252026

追加字节,需要修改DataDirArray[4].Size、证书大小

26744->26752

0x6878 -> 0x6880

image-20230728173831485

image-20230728173630256

修改完成,签名正常

image-20230728173855222

代码实现

C++版本的SigFlip可以自动添加shellcode到签名文件中。

也有golang版本的,在此基础上进行了修改,只有修改签名驱动的hash功能

image-20230728174214362

修改的工具会在驱动的末尾添加 kfcvme50 的字符串

image-20230728174342869