在.class文件中替换"字符串"是否安全?或者最好重新编译?

c0r*_*0rp 4 java regex sed disassembly

主要问题是:在*.class文件(java编译的类)中更改一些"字符串"信息是否安全.

我在做的是:

使用正则表达式我试图找到一些编译项目中的所有IP地址蜇"

find . -type f | xargs grep -E "[0-9]{3}\.[0-9]{3}\.1\.[0-9]{0,3}"
Run Code Online (Sandbox Code Playgroud)

这个命令告诉我一些二进制文件与我的正则表达式匹配.它指出这个二进制文件是.jar.class.当我打开这些.class文件时,vi我可以看到很多奇怪的字符,还有像这样的二进制垃圾中的" http://192.168.1.111 ".

我的最后一项任务是将所有IP地址(使用sed -i)替换为FQDN.

安全吗?或者只有工作解决方案来反汇编所有项目并重新编译?


答案后添加.

我这样测试:

创建Change.java

public class Change {

    public static String CHANGE_ME="SOME_TEST_STRING";

    public static void main (String[] argv){
        System.out.println(CHANGE_ME);
    }
}
Run Code Online (Sandbox Code Playgroud)

运行它,并在终端中看到它

$ java Change
SOME_TEST_STRING
Run Code Online (Sandbox Code Playgroud)

编译并运行替换:

sed -i 's/SOME_TEST_STRING/AAAAA/g' Change.class

在此之后再次运行

$ java Change 
Exception in thread "main" java.lang.ClassFormatError: Illegal UTF8 string in constant pool in class file Change
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:455)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:367)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:495)
Run Code Online (Sandbox Code Playgroud)

Win*_*ute 7

不,那不安全.它太安全了,它在太阳系之外.重新编译项目.

但是,您可以使用sed替换源代码中的IP.这很有可能奏效.