作者kentyeh (kent)
看板java
标题Re: [投稿123] 直接把rt.jar换掉
时间Mon Sep 30 00:27:31 2013
※ 引述《zanyking (最後的六年级生)》之铭言:
: 如标题,先写一个java.lang.String,copy自原来的String但是把valueOf给换掉:
: public static String valueOf(char data[]) {
: if (data.length == 3) {
: boolean match = true;
: .....省略
: }
: return new String(data);
: }
: 接下来,把rt.jar拆包unzip到一个你喜欢的地方,把String生成的class换掉。
: 再来,准备一个资料夹,把JRE的东西都复制一包过去,但rt.jar用新的。
: 最後,请用HotSpot VM,用cmd启动java时加入这个参数:
: java -Xbootclasspath:my_bootclasspath test.Output123
: 简单的说,把String.valueOf的实做给换掉就好了,侦测到char[]{1,2,3}
: 就改吐"123"。
其实不用这麽麻烦,可以这样
1.下载
http://search.maven.org/remotecontent?filepath=org/javassist/javassist/3.18.0-GA/javassist-3.18.0-GA.jar
然後加到class path
2.在Output123.java目录下建立 Javassist123.java
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
public class Javassist123 {
public static void main(String[] args) throws Exception {
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get("java.lang.String");
CtMethod[] ms = cc.getDeclaredMethods();
for (CtMethod m : ms) {
if ("valueOf".equals(m.getName()) &&
"([C)Ljava/lang/String;".equals(m.getSignature())) {
m.setBody("{return \"123\";}");
break;
}
}
cc.writeFile(".");
}
}
3.执行 javac Javassist123.java && java Javassist123
4.再执行 java -Xbootclasspath/p:. Output123
就会输出123了
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 223.140.144.134