我如何通过c#解析.cat(Windows系统目录)文件

问题描述 投票:0回答:1

我正在尝试通过 C# 解析 .cat 文件。为此,我使用 winapi 中的 CRYPTOCAT 函数。但这个方法对我来说很难:(而且我无法从中反映一些结构和方法。你能帮助我吗?我需要使用什么,这个过程会更简单。

这是我的代码:

static IntPtr WrapperUse(string fileName)
        {
            var hCatalog = CryptCATOpen(fileName.ToCharArray(), 2, 0, 0x200, 0x00000001);
            unsafe
            {
                var storePtr = CryptCATStoreFromHandle(hCatalog);
                var store = Marshal.PtrToStructure(storePtr, typeof(CRYPTCATSTORE));
                IntPtr pMemberPtr = IntPtr.Zero;
                var pMember = CryptCATEnumerateMember(hCatalog, pMemberPtr);


            }
            return hCatalog;
        }

        [DllImport("Wintrust.dll")]
        private static extern IntPtr CryptCATOpen(char[] pwszFileName, uint fdwOpenFlags, uint hProv,
            uint dwPublicVersion, uint dwEncodingType);

        [DllImport("Wintrust.dll")]
        private unsafe static extern IntPtr CryptCATStoreFromHandle(IntPtr hCatalog);

        [DllImport("Wintrust.dll")]
        [return: MarshalAs(UnmanagedType.Struct)]
        private static extern unsafe CRYPTCATMEMBER CryptCATEnumerateMember(IntPtr hCatalog,
            IntPtr pPrevMember);

    }
    [StructLayout(LayoutKind.Sequential)]
    public unsafe struct CRYPTCATSTORE
    {
        public UInt32 cbStruct;
        public UInt32 dwPublicVersion;
        [MarshalAs(UnmanagedType.LPWStr)]
        public string pwszP7File;
        public UIntPtr hProv;
        public uint dwEncodingType;
        public uint fdwStoreFlags;
        public IntPtr hReserved;
        public IntPtr hAttrs;
        public IntPtr hCryptMsg;
        public IntPtr hSorted;

    }

    [StructLayout(LayoutKind.Sequential)]
    public unsafe struct CRYPTCATMEMBER
    {
        public uint cbStruct;
        [MarshalAs(UnmanagedType.LPWStr)]
        public string pwszReferenceTag;
        [MarshalAs(UnmanagedType.LPWStr)]
        public string pwszFileName;

        //fixed byte gSubjectType[16]; //GUID
        [MarshalAs(UnmanagedType.Struct)]
        public GUID gSubjectType;
        public uint fdwMemberFlags;
        public IntPtr pIndirectData;
        public uint dwCertVersion;
        public uint dwReserved;
        public IntPtr hReserved;
        [MarshalAs(UnmanagedType.Struct)]
        public CRYPT_ATTR_BLOB sEncodedIndirectData;
        [MarshalAs(UnmanagedType.Struct)]
        public CRYPT_ATTR_BLOB sEncodedMemberInfo;
    }

    [StructLayout(LayoutKind.Sequential)]
    public unsafe struct GUID 
    {
        public UInt32 Data1;
        public ushort Data2;
        public ushort Data3;
        public fixed byte Data4[8];
    }


    [StructLayout(LayoutKind.Sequential)]
    public unsafe struct CRYPT_ATTR_BLOB
    {
        public uint cbData;
        //[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
        //[MarshalAs(UnmanagedType.AsAny)]
        public byte[] pbData;

    }

谢谢

c# winapi cryptography
1个回答
0
投票

除非您想编写自己的二进制解析器,否则您将需要使用复杂的 DllLoads。

但是,有一个旧的 github 项目可能可以工作(Windows 中的 crypt api 可能没有改变)。它没有LISENCE,所以企业使用不好。它也是基于旧框架,因此本地升级到更高版本的 .net 的副本会有所帮助。 https://github.com/arul-gupta/CatalogAPI/

还有另一个类似的问题,其大部分代码与上面相同,但针对特定答案,可能需要调整。 从.cat文件中获取安全目录标签的“指纹”值

© www.soinside.com 2019 - 2024. All rights reserved.