【发布时间】:2015-02-20 14:51:41
【问题描述】:
主要问题是:在*.class 文件(java 编译的类)中更改一些“字符串”信息是否安全。
我正在做的是:
使用正则表达式,我试图在某个已编译项目中查找所有 IP 地址字符串"
find . -type f | xargs grep -E "[0-9]{3}\.[0-9]{3}\.1\.[0-9]{0,3}"
这个命令告诉我一些二进制文件与我的正则表达式匹配。它指出这个二进制文件是.jar 和.class。当我使用vi 打开那些.class 文件时,我可以在这个二进制垃圾中看到很多奇怪的字符以及类似“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);
}
}
运行它并在终端中看到它
$ java Change
SOME_TEST_STRING
编译并运行替换:
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)
【问题讨论】:
-
当你重新编译时,我会切换到使用
properties文件,然后你可以随意更改它而无需重新编译 -
@ChrisThompson 谢谢你的好主意
标签: java regex sed disassembly