【问题标题】:C: Suppress system calls from binaryC:抑制来自二进制文件的系统调用
【发布时间】:2015-05-29 05:18:24
【问题描述】:

我的代码中有如下内容:

system("a system call");

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

我正在用

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

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

【问题讨论】:

  • 在哪个操作系统上?请编辑您的问题以改进它!
  • 没有标准的方法来做到这一点。您可以使用您喜欢的任何手动技术,大概是在编译之前加密或屏蔽字符串的文本,并在调用函数之前在运行时解密或取消屏蔽文本。但一般来说,工作量大于价值(而且它提供的安全性相当低),

标签: c string gcc binary


【解决方案1】:

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

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

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

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

最后,一点术语:system(3) 是一个standard C library 函数(名字很糟糕,应该叫command),它不是system call,列出(在Linux 上)在syscalls(2)

【讨论】:

    【解决方案2】:

    您可以“加密”字符串并存储加密版本。然后当程序需要 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++);
    }
    

    【讨论】:

    • s/encryption/encraption。有一个 gnu C 函数:memfrob().
    • @EOF,感谢您的提示。但是,我会避免使用memfrob(),因为每个字节都与常量 42 异或。以蛮力方式撤消太容易了。
    • 天啊,你是对的!我所有的加密方案都在直线下降,如果我每次都为我的单字母加密选择不同的单字节密钥就好了。哦,好吧,现在太晚了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-09
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多