18

可能重复:
在混淆代码中隐藏字符串

我试图隐藏我的应用程序的一些静态字符串,以使其更难反编译,这种方式就像密码算法名称等常量在混淆代码中更难找到。

我考虑过类似的事情:

String CONCAT= "concat"+"string";
String RAW_STRING= "raw_string";
String FROM_BYTES=new String("from_bytes".getBytes());
String FROM_CHARS=new String(new char[]{'f','r','o','m','_','c','h','a','r','s'});
String FROM_CHAR2=new String(new char[]{102,114,111,109,95,99,104,97,114,115,95,50});

最后两个选项似乎比原始选项“更暗”,但我想有更好的方法可以做到这一点。

我该如何改进呢?谢谢

4

2 回答 2

10

一方面,你不应该只写

String FROM_CHAR2=new String(new char[]{102,114,111,109,95,99,104,97,114,115,95,50});

char 数组实际上是一个字符串,这简直是天方夜谭。

您可以组合执行以下操作:

  1. 把你的“字符串”放在一个 int[] 数组中
  2. 甚至更好,将您的 String 分成几个 int 数组
  3. 在应用程序的各个阶段计算/操作数组的值,因此它的值只会在运行时的某个时间间隔内变得有效,从而保证不会通过反编译代码一目了然地破译它
  4. 在最终将数组转换为单个数组以传递给 String 构造函数之前,来回传递数组,通过局部变量,返回实例变量等
  5. 使用后立即将 String 设置为 null,只是为了减少实际 String 在运行时存在的时间
于 2012-10-27T16:06:08.310 回答
2

我宁愿使用解密算法在静态(类)初始化程序中设置值

class ...
  String CONCAT;

  static {
     CONCAT = uncrypt ("ahgsdhagcf");
  } 

其中uncrypt可能确实是一个很好的解密算法,或者 base64 解码稍微弱一些。

无论如何,您首先需要一个简单的程序来编码您的字符串。

于 2012-10-27T16:08:03.170 回答