【问题标题】:Openssl in Windows Kernel ModeWindows 内核模式下的 Openssl
【发布时间】:2022-01-13 09:50:08
【问题描述】:

有没有办法在 Windows 内核模式下使用 OpenSSL 库?我想制作一个windows过滤器驱动程序来拦截读写操作并对缓冲区进行加密和解密。我已经制作了一个可以用一些任意内容替换缓冲区的驱动程序,但现在我需要加密原始内容。我试图在项目中包含 OpenSSL dll-s,我可以编译和安装驱动程序,但是当我尝试启动它时,我得到了这个错误 发生了系统错误 2。 系统找不到指定的文件。

这是进行加密的代码。我知道使用静态密钥不安全,但它只是用于测试。

void encrypt_aes_ctr(unsigned char* key, unsigned char* iv, unsigned char* data, unsigned char* out_data,int in_len,int*out_len)
{
   int  len;
   EVP_CIPHER_CTX* ctx = EVP_CIPHER_CTX_new();;
   EVP_EncryptInit_ex(ctx, EVP_aes_256_ctr(), NULL, key, iv);
   EVP_EncryptUpdate(ctx, out_data, out_len, data, in_len);
   EVP_EncryptFinal_ex(ctx, out_data + *out_len, &len);
   *out_len += len;
}

这是我在 SwapPreWriteBuffers 函数中进行的调用

unsigned char key[32] = { 1,2,3,4,5,6,7,8,9,10,11,12,1,2,3,4,5,6,7,8,9,10,11,12,1,2,3,4,5,6,7,8 };
unsigned char iv[16] = { 1,2,3,4,5,6,7,8,9,10,11,12,1,2,3,4 };
int len;
encrypt_aes_ctr(key, iv, origBuf, newBuf, writeLen, &len);

【问题讨论】:

  • 请发布您收到的完整错误消息。
  • 这是完整的错误信息。我用来启动驱动程序的命令是 net start
  • 那么错误信息并没有指定找不到哪个文件?该文件是否是您的驱动程序本身?
  • 不,它没有指定文件。我确信该文件不是驱动程序本身,因为如果我使用相同的代码启动驱动程序但删除了 encrypt_aes_ctr 函数调用,我不会收到任何错误。我认为丢失的文件是 openssl 库
  • 我在网上查到net start命令是用来启动一个服务的。我发现这个帖子看起来很相似。见stackoverflow.com/a/19845423/4688321

标签: c encryption openssl kernel driver


【解决方案1】:

您应该使用CNG API,它是 Microsoft Standard API For Crypto。

例如Encrypt

Here 是在内核(随机)中使用 BCrypt 的代码示例

【讨论】:

  • 这非常有用,谢谢。现在我得想办法让用户态——内核态通信。我在 microsoft 文档上找到了执行此操作的函数,例如 FltCreateCommunicationPort,但我不知道如何使用它们。有没有示例代码?
  • 内核模式到用户模式通常是通过IO操作完成的(Read\Write\IOCTL)
猜你喜欢
  • 2012-01-12
  • 2011-10-31
  • 2014-06-17
  • 1970-01-01
  • 1970-01-01
  • 2011-06-08
  • 1970-01-01
  • 1970-01-01
  • 2011-02-27
相关资源
最近更新 更多