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

时间:2013-11-21 18:07:38

标签: c++ c windows dll

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

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

编译时,此字符串仍然可以在“记事本”中看到。我对C很新,所以我想知道,有没有办法安全地存储字符串文字?

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

由于


编辑1: 该场景在伪代码中基本上如下:     如果(主机名)         返回主机名     其他         返回“Literal String”';

这是“文字字符串”,我希望以某种方式看到“安全”..

3 个答案:

答案 0 :(得分:5)

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

请参阅我的相关回答The #1 Law of Software Licensing

Eric Lippert's similar answer

答案 1 :(得分:4)

首先,由于您的可执行文件 1 需要在内存中解码该文字,任何足够的攻击者都能够做到这一点;通常它就像在启动后冻结进程一样简单(或者在需要使用我们想要的字符串之后),创建内存转储并使用string之类的实用程序。有一些方法可以缓解这个问题(例如,在使用它之后立即将敏感字符串使用的内存归零),但由于您的代码位于潜在攻击者具有所有权限的计算机上,因此您只能设置障碍:最终可执行文件完全在攻击者的手中。

话虽如此,如果你的担心只是“不留下重要的字符串 en plein air ”,你可能只需在你的整个dll上运行一个可执行的打包器/加密器。这就像在解决方案中添加构建后步骤一样简单,打包器将压缩/加密整个可执行映像并构建一个可执行文件,在启动时将解密并在内存中运行。

这种方法的优点是不需要对代码进行任何更改:只需在已编译的dll上运行upx,就可以得到压缩的dll,不需要在代码中分散异或文字。< / p>

当然,这是非常弱的安全性(基本上它只是用记事本或十六进制编辑器防止在可执行文件中窥探),但同样,在将要分发的可执行文件中存储关键“秘密”是不好主意。


  1. 在整个答案中,“可执行文件”的意思是广义的 - 即包括dll。

答案 2 :(得分:1)

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