在C代码中安全嵌入字符串(安全字符串,安全字符*)

Safely embedding a string in C code (Secure string, Secure char*)

本文关键字:安全 字符串 字符 代码      更新时间:2023-10-16

我有一个dll(ansi c),它定义了一些字符串。

__declspec(dllexport) char* GetSomeString()
{
    return "This is a test string from TestLib.dll";
}

当编译时,这个字符串在"记事本"中仍然可见。我对C还很陌生,所以我想知道,有没有一种方法可以安全地存储字符串文字?

我应该使用一个resx文件(例如),它有一些加密的值,或者什么是最好的方法?

感谢


编辑1:伪代码中的场景基本如下:if(主机名)返回主机名其他的return"Literal String"';

这是一个"文字字符串",我希望看到在某种程度上"安全"。。

如果你想保密,就不要把你的秘密放在别人的电脑上。

请参阅我的相关答案,软件许可的#1定律

Eric Lippert的类似答案

首先,由于您的可执行文件1需要在内存中解码该文本,任何确定足够的攻击者都可以执行同样的操作;通常,这就像在启动后(或需要使用我们想要的字符串后)冻结进程、创建内存转储并在其上使用string等实用程序一样容易。有一些方法可以缓解这个问题(例如,在使用敏感字符串后立即将其使用的内存清零),但由于您的代码位于潜在攻击者拥有所有权限的机器上,你只能设置障碍:最终你的可执行文件完全掌握在攻击者手中。

也就是说,如果你担心的只是"不把重要的字符串留在空气中",你可以在整个dll上运行一个可执行的打包器/加密器。这就像在解决方案中添加一个构建后步骤一样简单,打包器将压缩/加密整个可执行文件映像,并构建一个可执行文件,该可执行文件在启动时将解密并在内存中运行。

这种方法的优点是不需要对代码进行任何更改:只需在编译的dll上运行upx,就可以获得压缩的dll,不需要XOR或散布在代码中的奇怪文字。

当然,这是一个相当弱的安全性(基本上,它只会防止用记事本或十六进制编辑器窥探可执行文件),但同样,将关键的"秘密"存储在将要分发的可执行文件中首先是个坏主意。


  1. 在整个答案中,I"可执行文件"的含义很广,即也包括dll

您可能想将硬编码密码存储在库中,对吧?您可以将字符串与某个值进行异或,然后存储它,然后读取它并再次进行异或。这是最简单的方法,但它不能保护您的字符串免受任何类型的反汇编/反向工程的影响。