在C代码中安全嵌入字符串(安全字符串,安全字符*)
Safely embedding a string in C code (Secure string, Secure char*)
我有一个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或散布在代码中的奇怪文字。
当然,这是一个相当弱的安全性(基本上,它只会防止用记事本或十六进制编辑器窥探可执行文件),但同样,将关键的"秘密"存储在将要分发的可执行文件中首先是个坏主意。
- 在整个答案中,I"可执行文件"的含义很广,即也包括dll
您可能想将硬编码密码存储在库中,对吧?您可以将字符串与某个值进行异或,然后存储它,然后读取它并再次进行异或。这是最简单的方法,但它不能保护您的字符串免受任何类型的反汇编/反向工程的影响。
- 以线程安全的方式转换 C/C++ 中时区名称字符串的时区偏移量
- 返回从字符串文本创建的静态string_view是否安全?
- 是否有一种安全的方法可以断言字符串视图是否以 null 终止?
- 为什么在构造函数中将字符串分配给指针是安全的?
- 是否有很好的C 实现安全字符串
- 最快和/或最安全的方法,在C 中加入两个宽字符串
- 假设浮点数或双 NaN 将始终作为字符串"nan"是否安全?
- std::串联的字符串引用是安全的
- 如何在C++中使类型安全字符串"definition"对象?
- 插入没有空终止符空间的字符串是否安全?
- 在 C++98 中写入单个字符串以"线程安全"吗
- 将 const 引用传递给临时字符串对象在 C++ 中安全吗?
- 这种反转字符串的方式安全吗?
- 为什么我可以通过这样的字符串参数?这种样式安全吗?
- 从字符串中读取溢出双倍作为'inf'的安全方法
- 键入安全字符串参数
- 在C代码中安全嵌入字符串(安全字符串,安全字符*)
- Android NDK安全字符串
- C++DLL中的线程安全字符串缓冲区变量
- C++/MFC/ATL 线程安全字符串读/写