5

隐藏代码中文字值的主要现有方法是什么,以便仅使用 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;
    }

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

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

4

3 回答 3

3

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

详细说明:

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

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

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

decryptedData = decryptStr(MY_ENCRYPTED_CONSTANT)
useDecrypted(decryptedData)

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

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

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

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

于 2011-10-08T02:04:53.423 回答
0

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

于 2011-09-29T08:24:26.493 回答