C:禁止二进制的系统调用

时间:2015-03-25 13:38:44

标签: c string gcc binary

我的代码中包含以下内容:

system("a system call");

但是,作为printfsystem()中的文本在二进制代码中是可读的。

我正在使用

编译.c
gcc -std=gnu99 code.c -o code

如何编译以抑制二进制代码中的可读字符串?

2 个答案:

答案 0 :(得分:4)

我们不知道您编写的操作系统。但我猜它是Linux(或者至少是一些POSIX)。

然后我的建议是避免system(3) 并使用其他内容,例如fork(2)execve(2)waitpid(2);花时间阅读Advanced Linux Programming了解详细信息(对您来说可能很棘手)。

顺便说一句,你天真地认为通过从你的二进制文件中删除字符串,人们将无法理解正在发生的事情。他们可以使用strace(1)并立即猜测程序运行的程序和参数(即使你加密了命令字符串等等)

顺便说一下,通过默默无闻的安全是错误的。

最后,一些术语:system(3)是一个standard C library函数(命名很差,它应该被称为command),它不是system call ,在syscalls(2)中列出(在Linux上)。

答案 1 :(得分:1)

你可以"加密"字符串并存储加密版本。然后当程序需要ASCII字符串时,解密它。

最简单的加密器是使用随机比特模式执行按位xor。要解密,只需执行相同的按位xor,即可获得相同的随机位模式。

您需要将字符串长度与加密的字节序列一起保存。

以下是简单的加密和解密功能。这些不是加密安全的,但足以达到目标。 您可以使用全局常量作为键。

void encrypt(char* str, unsigned long key)
{
  unsigned char* p = (unsigned char*)str, c;
  do
  {
    key = key * 214013L + 2531011L;
    c = *p;
    *p ^= (unsigned char)(key>>24);
    ++p;
  }
  while(c);
}

void decrypt(char* str, unsigned long key)
{
  unsigned char* p = (unsigned char*)str;
  do
  {
    key = key * 214013L + 2531011L;
    *p ^= (unsigned char)(key>>24);
  }
  while(*p++);
}