使Java源代码无法编译但仍然是人类可读的

时间:2011-12-17 18:04:05

标签: java obfuscation

我想将我的Java源代码提供给另一个Java开发人员,以便他可以在他们无法编译它们的同时学习它们。我正在寻找一种简单但有效的单向算法,使我的源无法编译。我希望我能清楚地解释目标。

我的第一个想法是解析我的所有资源并使我的所有方法名称随机混合:

private double getAvailableCash() - > private double gEtaVailabLEcASh()

这很简单,重做也不容易,但并非不可能。你能告诉我一些其他的,希望更好的方法吗?

更新:

许多人评论/询问有人想要这样做的原因。假设以下情况:您必须在其他开发人员向您支付费用之前证明您已准备好提供高质量的解决方案,但您有充分理由不相信他。显示一个有效的编译演示是不够的,因为他想看看你的工作方式。如果您向他提供了可编辑的来源,您可能会在没有提供来源的情况下尽快收到您的付款。

无论如何,这对我来说似乎是一个非常有趣,有趣的问题,即使你们很多人也看到了很多评论和答案......: - )

8 个答案:

答案 0 :(得分:6)

我不知道你为什么要这样做,但无论如何......

perl -pi -e 'undef $/; s,^,\00,' $(find -name "*.java")

您甚至不需要更改代码!

这样做是将一个字节(0)添加到名为*.java的每个文件的开头。是的,这足以使文件无法编译!

撤消:

perl -pi -e 's,^\00,,' $(find -name "*.java")

关于$/的更多解释:它是perl用于从流中读取的输入分隔符。默认设置为换行符,这就是通常perl逐行读取的原因。这里没有定义,这意味着它一次读取整个文件。如果将其定义为空字符串,则将逐段读取。你可以把它定义为你喜欢的任何东西。

答案 1 :(得分:4)

如果它们是可读的,那么可能也不难让它成为可编辑的。此外,更改案例使其难以理解,但仍然是完全有效的代码。

鉴于看到算法等的价值远远超过将算法转换为代码的价值,因此不清楚为什么不给开发人员提供原始源代码。

答案 2 :(得分:2)

转换为Java之外的其他内容,例如伪代码。任何可读的东西都是可编译的。即使不是这样,你的算法也可以直接(或多或少)转换成Java。

您唯一的良好解决方案是具有法律约束力的协议。如果您不信任他们,请考虑不要与他们做生意。

你能做的最好的事情可能是剥掉像大括号(和其他标点符号)和去缩进的东西;这将使它无法编译,它并不总是显而易见的应该放回去等等。删除包和导入信息。删除访问信息并输入信息。删除getter和setter。删除try / catch块。删除评论。

这会让你有这样的事情:

Student

name;
address;

Student(name)
    this.name = name

username = ""
password = ""

checkUser(conn)
    result = null
    stmt = null

    stmt = conn.prepareStatement("SELECT * FROM tutor WHERE uid=?")
    stmt.setString(0, username)
    result = stmt.executeQuery()
    while (result.next())
    String psw1 = result.getString("psw1")
    if (password.equals(psw1))
    return "success"
    e.printStackTrace()
    close(conn, stmt, result)

    return "error"

getConnection()
    Class.forName("com.informix.jdbc.IfxDriver")
    conURL = "jdbc:informix-sqli://*********/fxg:INFORMIXSERVER=sgdbuat11;user=*****;password=******"
    return DriverManager.getConnection(conURL)
    e.printStackTrace()
    return null

close(conn, stmt, result)
    if (result != null) result.close()
    if (stmt != null)   stmt.close()
    if (conn != null)   conn.close()
    e.printStackTrace()

答案 3 :(得分:2)

如何删除所有分号和花括号?你可能会在这里或那里弄乱一个字符串文字,但是对于你想做的事情,这可能会很好。

或者,您可以编写一个目标为LOLCODE

的字节码反编译器

答案 4 :(得分:1)

如何从源文件中删除所有导入和包声明?

答案 5 :(得分:1)

从源代码创建PDF文件。并禁用复制pdf文档内容。也许您还应禁用文档打印。

答案 6 :(得分:1)

使用JavaDocs。它将打印一个很好的人类可读的代码描述,无法编译。

答案 7 :(得分:1)

使源代码成为验证码。你知道,打印不同颜色或纹理的字符,不同的字体,一些失真,一些旋转,添加随机线条,噪音,模糊等。