【问题标题】:Obfuscation: hide hardcoded values in java [duplicate]混淆:隐藏java中的硬编码值[重复]
【发布时间】:2012-10-17 14:13:36
【问题描述】:

可能重复:
hiding strings in Obfuscated code

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

我考虑过类似的事情:

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

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

我该如何改进呢?谢谢

【问题讨论】:

  • 我从来没有为 Android 编程过,但是我看不出问题的重点。如果用户不知道如何反编译,只能通过记事本阅读代码,你只是放了一些没用的算法名,他/他不知道真正涉及的是哪一个。如果她/他知道如何反编译,那么没有任何混淆可以阻止他/他用 System. out.println.
  • 我正在使用简单的 gradle 函数隐藏这种字符串。它只保护肉眼,但无论如何,总比没有好:gist.github.com/shomeser/68f4fe360be0edac95e4

标签: java android security proguard


【解决方案1】:

首先,你不应该只写

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. 在最终将数组转换为要传递给 String 构造函数的单个数组之前,来回传递数组,通过局部变量,传回实例变量等
  4. 使用后立即将String设置为null,只是为了减少实际String在运行时存在的时间

【讨论】:

  • #3 的任何模式或示例代码? #5 有什么帮助?
  • #5 有帮助,因为如果有人可以反编译您的代码,这意味着他们也可以运行它,将调试器标志放在适当的位置等。因此,您还应该防止运行时检查。这意味着您的实际 String 存在的时间越少,就越安全。
  • 对于#3,我自己还没有走到这一步,但你可以尝试this 使用jzlib之类的东西将你的字符串“压缩”成字节数组,并在需要时解压缩它们。不要使用 Android 的 zip 库,因为它的方法名称不能混淆,使整个企业非常明显。
  • 澄清一下,我使用 JZLib 压缩单个字符串,它确实有效,但它是为了减少数据大小而不是为了混淆。
  • 不过,当我用 System.out.println 替换密码实例化 std 库调用时,我不明白这如何工作。
【解决方案2】:

我更喜欢使用解密算法在静态(类)初始化程序中设置值 类似的东西

class ...
  String CONCAT;

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-04
    • 2016-06-05
    • 2014-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多