【问题标题】:Obfuscate Strings in Java在 Java 中混淆字符串
【发布时间】:2017-05-16 18:16:06
【问题描述】:

我正在做一个项目,我需要隐藏特定的 URL 调用,我不希望看到这个 URL 这里是 URL 调用的示例方法

public void example(View view) {
    goToUrl("example.com");
}

【问题讨论】:

    标签: java obfuscation


    【解决方案1】:

    你真的不能。您可以混淆方法名称,因为最终不需要知道原始方法名称。你可以只使用混淆。在这里,您最终确实需要知道真实的 URL。所以需要有一个不混淆的功能。这意味着您可以从那里轻松获得结果。或者您知道,只需通过代理跟踪传出 HTTP 请求使用的 url。

    【讨论】:

    • 我无法将字符串 url 混淆为数组数据?我看到有人用它混淆了字符串链接。
    • 你可以——它会阻止任何了解逆向工程的人大约一分半钟。如果他累了,又不努力。如果系统需要知道原始文件(就像这里所做的那样),那么你就是在通过混淆来浪费你的时间。
    【解决方案2】:

    在将近 2 年后回顾这个问题,这个问题已经引起了很多关注,我发现了一些我最终用于字符串混淆的混淆器,但是每个混淆器都可以被破解。这是我的加密字符串的混淆器列表,我将从列出付费混淆器开始。

    1. Zelix 克拉斯大师

    他们的官方网站是https://zelix.com

    在我看来,这是 jar 或 android 最好的 java 混淆器之一。 然而它并不像预期的那样便宜,因为混淆器有多好。

    如果您是小型开发人员,单个许可证可能需要花费 239 美元;如果您是开发人员团队 (Comapany),则需要花费 479 美元。

    可以看到功能列表here

    2。 DexGuard

    他们的官方网站是https://www.guardsquare.com/en

    DexGuard 是由 Proguard 背后的人制作的混淆器

    在我看来,这是第二好的混淆器。名称混淆比 Zelix 上的名称混淆要好得多。

    我不确定他们的定价,因为我从未使用过它,但我已经看到它被用于应用程序。您如何请求定价here

    免费混淆器。

    您可以找到免费的替代品,例如 StringCareParanoid

    它们不如我上面列出的那个,有java基础知识的人用这两个工具破解你的程序最多需要5秒。

    【讨论】:

    • 为什么免费工具比其他工具更容易破解?付费的有什么免费的没有的?
    【解决方案3】:

    一种可能性是对需要混淆的字符串使用带有移位操作的整数数组。但正如其他人已经提到的,这只是一种隐藏纯字符串的机制。通过一些努力,它可以很容易地被解码。

    Gettign int 数组代码

    public static String getIntArrayCode(String string) {
    
            int[] result = new int[string.length()];
            for (int i = 0; i < string.length(); i++) {
    
                int numericValue = Character.codePointAt(string, i);
                result[i] = numericValue << 3;
            }
            
            StringBuffer arrayCode = new StringBuffer();
            arrayCode.append("new int[]{");
            for (int i = 0; i < result.length; i++) {
                arrayCode.append(result[i]);
                if (i < result.length - 1) {
                    arrayCode.append(",");
                }
            }
    
            arrayCode.append("}");
    
            return arrayCode.toString();
        }
    

    这个int数组需要复制到代码中。

    为了不混淆,使用方法

    public static String getString(int[] data) {
            StringBuffer test = new StringBuffer();
            for (int i = 0; i < data.length; i++) {
                int t = data[i] >> 3;
                test.append((char) t);
            }
            return test.toString();
        }
    

    用法:

    //"Hello12345&%$";
    int []data1 = new int[]{1152,1616,1728,1728,1776,784,800,816,832,848,608,592,576};
    System.out.println(getString(data1));
    

    混淆应用程序(例如:使用 Proguard )将有助于在某种程度上隐藏解码功能。

    【讨论】:

      【解决方案4】:

      对于混淆字符串,您现在可以使用新的 gradle 插件 + 库,请在此处查看

      https://github.com/MichaelRocks/paranoid

      现在还有一个新插件也可以混淆资源,请在下面查看

      https://github.com/shwenzhang/AndResGuard

      分享让更多的开发者可以使用它,因此越来越多的开发者将为这些插件的进一步开发做出贡献,因此我们可以共同改进这些插件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-12-22
        • 2010-11-02
        • 1970-01-01
        • 2016-06-10
        • 2014-04-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多