文本字符串是嵌入式软件中的漏洞吗?
多年来,台式计算机的安全性一直备受关注。一旦机器连接到互联网,本质上就存在某种攻击的可能性。此类渗透可能是为了窃取数据、破坏系统或以某种方式改变其操作。保护手段是众所周知的并且被广泛应用。嵌入式系统似乎总是不受此类问题的影响,因为它们很少联网,而且它们的代码通常在某种 ROM 中。事情变了。大部分现代系统都连接到 Internet,将代码复制到 RAM 中并从那里执行是常见的做法。这意味着安全性现在是一个重要的嵌入式软件设计考虑因素。
英语是一种很好的交流工具。它是一种非常有表现力的语言,可以非常精确和微妙地进行交流。然而,在日常讲话中,我们大多数人都很懒惰,经常使用没有 100% 准确率的单词。我在这里想到的例子是安全 和安全 几乎可以互换使用,就好像它们是同义词一样。我认为我听到的最好的定义是这样的:安全是保护世界免受设备影响的过程;安全是保护设备免受外界影响。安全是我今天的主题。
如果一个系统真的需要完全防弹,就需要工业级加密。这通常需要特定的硬件支持,虽然很容易获得,但对于不需要如此高安全性的应用程序来说可能被认为是过度的。在这种情况下,还有其他选择,这就是我想要探索的。
如果黑客可以访问设备的内存内容,他们就可以开始弄清楚它做了什么以及它是如何做的。这是改变其操作的第一阶段。代码可以被反汇编,因此可以揭示逻辑。如果没有加密,几乎无法防止这种情况发生。黑客可能会做的下一件事是查看数据的 hex/ASCII 转储,看看他们能在那里找到什么有意义的。他们正在寻找模式和可识别的结构。这是可以采取一些预防措施的地方。虽然加密可能不是一种选择,但混淆是可能的。
数据混淆的目标是通过简单地使数据不易被识别来延迟或阻止黑客。扫描内存转储,最容易发现的事情之一是文本字符串。所以,这就是我将在这里重点讨论的内容。
在 C/C++ 代码中,文本字符串通常只是包含以空字节结尾的 ASCII 代码的字节序列。这很容易发现,所以我会改变它。首先,每个字符串的第一个字节不是空终止符,而是一个长度说明符。字符串的字符会稍微打乱它们的数据,让它们看起来不那么熟悉——我要做的就是交换每个字节的两个半字节。我需要有一个实用程序,我将向其中提供纯文本字符串,并为具有适当初始化的数组生成声明。这是此实用程序的核心功能:
void scramble(int index, unsigned char *input){ unsigned char *charpointer, character; printf("unsigned char string%d[%d] ={0x%02x,", index, strlen(input)+1, strlen(input));字符指针 =输入; while(*charpointer) { character =*charpointer++;字符 =((字符 &0x0f) <<4) | ((字符 &0xf0)>> 4); printf("0x%02x", 字符); if (*charpointer) printf(","); } printf("}; // \"%s\"\n", input);}
如果我向这个函数传递一个索引 4 和一个字符串“Hello world”(原来是?),输出将是:
unsigned char string4[12] ={0x0b, 0x84, 0x56, 0xc6, 0xc6, 0xf6, 0x02, 0x77, 0xf6, 0x27, 0xc6, 0x46}; // “你好世界”
我可以将其复制并粘贴到我的代码中,然后我需要做的就是编写一个函数来在需要显示文本时对其进行解读。不是给每个字符串一个索引号,我可以通过替换 index 给它一个任意名称 带字符串的参数。请注意,生成的代码在某种程度上是自文档化的,因为注释以可读的形式显示字符串,但是,当然,这仅出现在源代码中。如果黑客可以访问您的源代码,那么您已经有足够的麻烦,我无法进一步提供帮助!
下面是一些代码来说明解扰过程:
void main(){ unsigned char temp, buffer[50]; int count =string4[0], index=0; while(count--) { temp =string4[index+1]; temp =((temp &0x0f) <<4) | ((温度 &0xf0)>> 4);缓冲区[索引] =温度;指数++; } 缓冲区[索引] =0; printf("-%s-\n", 缓冲区);}
每个字节中半字节的交换是可以完成加扰的许多不同方式之一。另一种可能性是,例如,将每个字符向左旋转三位。这里有一些代码可以做到这一点:
unsigned char leftrotate3(unsigned char c){ c =(c <<3) | (c>> 5);返回 c;}
我概述的混淆技术逐个字符地打乱字符串。可以对整个字符串进行处理。例如,将字符串视为一长串位并将其向左旋转任意数字。我会把这个算法的编码留给更热心的读者。
值得注意的是,本地化所有文本字符串的副作用是,为其他语言制作不同版本的软件非常简单。
我必须重申并强调,数据混淆远非万无一失,充其量只会减慢严重的黑客的速度。如果不出意外,解扰码可以被反汇编。这种技术的诀窍是使混淆成为难以追踪的线索。如果您确实需要更高的安全性,则必须考虑完全加密。
嵌入式