【问题标题】:How to hide literals in code如何在代码中隐藏文字
【发布时间】:2011-09-29 08:21:15
【问题描述】:

在代码中隐藏文字值的主要现有方法是什么,以便仅使用 hexdumper 或反编译器就不容易追踪它们?

例如,而不是这样编码:

    static final int MY_VALUE = 100;

我们可以:

    static final int MY_VALUE = myFunction1();

    private int myFunction1(){
        int i = 23;
        i += 8 << 4;
        for(int j = 0; j < 3; j++){
            i-= (j<<1);
        }
        return myFunction2(i);
    }

    private int myFunction2(int i){
        return i + 19;
    }

这只是我们尝试做的一个例子。 (是的,我知道,编译器可能会对其进行优化并预先计算常量)。

免责声明:我知道这根本不会提供任何额外的安全性,但它会使逆向工程的代码更加晦涩(或有趣)。这样做的目的只是迫使攻击者调试程序,并在上面浪费时间。请记住,我们这样做只是为了好玩。

【问题讨论】:

  • 您的示例足以隐藏实际值。解决方案的另一半是剥离可执行文件以删除符号,从而更难进行逆向工程(但也更难调试),或者至少使用不显示您试图隐藏某些内容的函数名称。
  • 您的示例代码很复杂但无条件。在(显然)外部因素上添加条件可能是一种有用的附加混淆技术。就像在一些初始化代码中将全局设置为零,然后检查它是否是偶数,如果不是,对i 进行不同的(无用的,从未达到过的)计算。

标签: literals security-by-obscurity hard-coding


【解决方案1】:

由于您试图隐藏在程序的简单转储中可见的文本,因此您可以使用某种简单的加密来混淆您的程序并隐藏该文本以防窥探。

详细说明:

  1. 访问ROT47.com 并在线编码您的文本。您还可以使用this web site 进行更通用的 ROTn 编码。
  2. 用编码文本替换字符串常量的内容。
  3. 在需要时使用代码中的解码器将文本转换回其原始形式。 ROT13 Wikipedia article 包含一些关于实现的注释,这里是 StackOverflow 上的 Javascript implementation of ROTn。使其适应您使用的任何语言都很简单。

为什么要使用众所周知的弱加密 ROT47?

最后,您的代码将如下所示:

decryptedData = decryptStr(MY_ENCRYPTED_CONSTANT)
useDecrypted(decryptedData)

无论您的密码有多强大,任何配备调试器的人都可以在useDecrypted() 上设置断点并恢复明文。因此,密码的强度无关紧要。然而,使用类似 Rot47 的东西有两个明显的优势:

  1. 您可以在线对文本进行编码,无需编写专门的程序来对文本进行编码。
  2. 解密非常容易实施,因此您不会将时间浪费在对客户没有任何价值的事情上。
  3. 任何阅读您代码的人(您的同事或 5 年后的您自己)都会立即知道这不是真正的安全,而是默默无闻的安全。
  4. 对于任何窥探编译程序的人来说,您的文本仍会显示为乱码,因此任务完成。

【讨论】:

  • 我在考虑文本而不是整数。 Rot13 在我看来太标准了。
  • 由于您无法真正对配备调试器的人隐藏这些字符串,因此您将它们隐藏在不经意的好奇眼中。因此,任何弱加密都可以。不想要标准的 Rot13?添加一个额外的 XOR 或其他东西......
  • 我认为这是唯一通用的解决方案。对文本文字应用转换,例如 RotN 或类似的。与整数相同。
【解决方案2】:

运行一些生命变体游戏进行大量迭代,然后根据最终状态向量做出控制流决策。

如果你的程序实际上是为了做一些有用的事情,你可以提前计划好你想要的分支并选择状态向量的位来适应(“我想要一个真实的,第 17 位是打开的,所以让条件..")

【讨论】:

  • 一个有趣的想法,一些示例实现会很好。
【解决方案3】:

您也可以将编译后的代码的一部分用作数据,然后对其稍作修改。这在虚拟机执行的程序中很难做到,但在 asm 或 c 等语言中是可行的。

【讨论】:

  • 不,只读取一些操作指令或参数(在程序中隐藏数据是问题)。自行修改代码也会造成混淆,但与题目无关。
猜你喜欢
  • 2018-05-26
  • 1970-01-01
  • 1970-01-01
  • 2012-08-07
  • 1970-01-01
  • 1970-01-01
  • 2014-04-10
  • 2013-12-28
  • 2022-12-01
相关资源
最近更新 更多