相关疑难解决方法(0)

如何用二进制代码隐藏字符串?

有时,从二进制(可执行)文件中隐藏字符串很有用.例如,从二进制文件中隐藏加密密钥是有意义的.

当我说"隐藏"时,我的意思是在编译的二进制文件中更难找到字符串.

例如,这段代码:

const char* encryptionKey = "My strong encryption key";
// Using the key
Run Code Online (Sandbox Code Playgroud)

编译后生成一个可执行文件,其数据部分中包含以下内容:

4D 79 20 73 74 72 6F 6E-67 20 65 6E 63 72 79 70   |My strong encryp|
74 69 6F 6E 20 6B 65 79                           |tion key        |
Run Code Online (Sandbox Code Playgroud)

您可以看到我们的秘密字符串可以轻松找到和/或修改.

我可以隐藏字符串......

char encryptionKey[30];
int n = 0;
encryptionKey[n++] = 'M';
encryptionKey[n++] = 'y';
encryptionKey[n++] = ' ';
encryptionKey[n++] = 's';
encryptionKey[n++] = 't';
encryptionKey[n++] = 'r';
encryptionKey[n++] = 'o';
encryptionKey[n++] = 'n';
encryptionKey[n++] = …
Run Code Online (Sandbox Code Playgroud)

c++ obfuscation

64
推荐指数
8
解决办法
5万
查看次数

C11和开关盒标签中的常量表达式评估

关注这个问题为什么gcc不允许将const int作为case表达式?,什么促销类型用于switch-case表达式比较基本相同或者有没有办法在C中使用具有常量索引的常量数组作为开关案例标签?.

从第一个链接,我试图替换:

case FOO:                       // aka 'const int FOO = 10'
Run Code Online (Sandbox Code Playgroud)

用:

case ((int) "toto"[0]):         // can't be anything *but* constant
Run Code Online (Sandbox Code Playgroud)

这使 :

https://ideone.com/n1bmIb - > https://ideone.com/4aOSXR =在C++中工作

https://ideone.com/n1bmIb - > https://ideone.com/RrnO2R = C失败

我不太明白,因为"TOTO"字符串不能是任何东西,但一个常数之一,它甚至不是一个变量,它位于编译器内存的空白.我甚至没有玩C语言的'const'模糊逻辑(它实际上代表"只读,不是常数,你期望什么?"),问题是"数组访问"或"指针引用" "进入一个不用C语言评估的常量表达式,但在C++中做得很好.

我希望使用这个"技巧"来使用HASH_MACRO(str)从密钥标识符生成唯一的case标签值,最终使编译器在发生冲突时引发错误,因为找到了类似的标签值.

好的,好的,我被告知这些限制是为了简化语言工具(preproc,编译器,链接器)而C不是没有LISP,但你可以拥有全功能的LISP解释器/编译器,其大小只相当于C等价物的一小部分,所以这不是借口.

问题是:C11是否有"扩展",只允许这个"toto"东西在GCC,CLANG和...... MSVC中工作?我不想去C++路径(typedef的前向声明不再起作用)和嵌入式东西(因此编译时哈希计算用于时空失真).

是否有一种中间的"C +"语言更加"宽容"和"理解"嵌入更好一点,比如 - 赞美领主 - "作为位域成员的枚举",以及我们不能拥有的其他很好的东西(由于以外的原因)现实标准像沙漠太阳下的蜗牛一样演变?

#provemewrong,#changemymind,#norustplease

c c++ constants switch-statement constant-expression

-5
推荐指数
1
解决办法
433
查看次数