C: 抑制来自二进制的系统调用

C: Suppress system calls from binary

我的代码中有这样的东西:

system("a system call");

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

我正在用

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

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

您可以 "encrypt" 字符串并存储加密版本。然后当程序需要这个ASCII字符串的时候,解密。

最简单的加密器是使用随机位模式进行按位异或。要解密,只需使用完全相同的随机位模式执行相同的按位异或。

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

这里是简单的加解密函数。这些不是加密安全的,但足以实现目标。 您可以使用全局常量作为键。

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++);
}

我们不知道您在哪个操作系统上编写代码。但我猜它是 Linux(或至少一些 POSIX)。

那么我的建议是 避免 system(3) and use something else, such as fork(2), execve(2), waitpid(2); take time to read Advanced Linux Programming 了解详细信息(它们对您来说可能很棘手)。

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

顺便说一句,通过模糊来实现安全是错误的。

最后,一些术语:system(3) is a standard C library function (very poorly named, it should have been called command), it is not a system call, which are listed (on Linux) in syscalls(2)