【问题标题】:C CryptUnprotectData crashes ProgramC CryptUnprotectData 崩溃程序
【发布时间】:2020-03-20 04:50:33
【问题描述】:

嗨,我正在尝试编写一个 C 程序来解密 Chrome 用来加密已保存密码的密钥。密钥用 CryptProtectData 加密,然后用 Base64 编码,我已经成功解码了密钥,现在我想用 CryptUnprotectData 解密它,但是当我尝试使用这个函数时,我的程序崩溃了,当我得到一个类似的问题保存加密数据的字节*的大小错误。有谁知道我做错了什么?

#include <stdio.h>
#include <base64.h>
#include <wincrypt.h>

void main()
{    
  //RFBBUEk = DPAPI    
  char B64[] = "BAAAA0Iyd3wEV0RGMegDAT8KX6wEAAAAYUduGi5FwQr1+XlafMqBZAAAAAAIAAAAAABBmAAAAAQAAIAAAALIvW98pXJMaQ0aJPpr40c12oSSRDg59tr+zaF+podlvAAAAAA6AAAAAAgAAIAAAAD2z5W4nMDHLOxthH8nXyxl+1hpRdY2BGHStxaDvgjSiMAAAAIKrcLbXw5WZCPjqyPtO/3QahMa0yMRC/CoMS/OoDw5j7fcZ8N31sIildXpN82egDEAAAAAvzHS7+Zf2IR05cggu1XHfNGknq3TKRHW37CVEktIHHu6yo1K0Q0r5YevYDUUNdhzlpJ+ynQUTBAS2Fa3PRR4V";
  int len = sizeof(B64);
  int * flen;
  char * ergebnis;
  ergebnis = unbase64(B64,len,flen);
  DATA_BLOB Input,Output;
  Input.pbData = (byte*)ergebnis;
  Input.cbData = *flen;
  CryptUnprotectData(&Input,NULL,NULL,NULL,NULL,0,&Output);
  printf("%s",(char*)Output.pbData);
  getchar();  
}


【问题讨论】:

  • 你是从你用来加密的同一台机器上解密的吗? stackoverflow.com/q/23201146
  • 您确定 CryptUnprotectData 是您的程序崩溃所在的行吗?
  • 是的,我使用加密数据的同一台机器,当我用 CryptUnprotectData 注释掉该行时,程序不会崩溃并等待我按 Enter,因为 getchar();
  • unbase64 是否以某种方式为flen 分配内存,因为它从未设置过它的值? (修辞,它不能)

标签: c


【解决方案1】:
  printf("%s",(char*)Output.pbData);

首先,您不检查CryptUnprotectData 是否成功。如果失败,您将指向垃圾的指针传递给printf

其次,您如何期望printf 知道要打印多少字节?你需要用Output.cbData做点什么。

最后,flen 永远不会被赋值。你将它所具有的任何无意义的、未初始化的值传递给unbase64,然后尝试使用该值。

【讨论】:

  • 你是说这不是一个以null结尾的C字符串吗?
  • @RobertHarvey 它不是一个以 null 结尾的 C 字符串。这就是为什么他必须将指针指向char*
  • 谢谢,我通过给 flen 一个值并在 CryptUnprotectData 成功时创建一个打印 OK 的 if 语句来让它工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-28
  • 1970-01-01
  • 1970-01-01
  • 2021-03-02
  • 2012-04-16
相关资源
最近更新 更多