Java逆向记录(二),Javassist的使用

思路:修改目标代码

在分析了字符串之后,找到了一些关键字符串,比如验证,发送激活请求后的代表激活信息的JsonObject,随后用javassist进行修改

1
2
//gradle/maven 引入依赖
compile group: 'org.javassist', name: 'javassist', version: '3.25.0-GA'

具体代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@Test
public void modify() throws NotFoundException, CannotCompileException, IOException {
final ClassPool pool = ClassPool.getDefault();
final CtClass ctClass = pool.get("要修改的类");
//需要修改的方法
final CtMethod d = ctClass.getDeclaredMethods("d")[1];
final CtMethod a = ctClass.getDeclaredMethods("a")[2];
final CtMethod b = ctClass.getDeclaredMethods("b")[2];
//方法体写在 {} 内部,其中,类需要写全限定名,即:Date类需要写java.util.Date
d.setBody(
"{\n" +
" Response res = new Response();\n" +
" res.setValid(Boolean.valueOf(true));\n" +
" res.setEncrptString(\"3.1415926\");\n" +
" return res;\n" +
" }\n" +
" ");
a.setBody("{return true;}");
//$1,代表方法的第一个参数
b.setBody("{$1.setValid(true);$1.k(new java.util.Date(2099,1,1,1,1));super.b($1);}");
//写入文件
ctClass.toBytecode(new DataOutputStream(new FileOutputStream("D:/a.class")));
}

插入 错误日志打印方法

1
2
3
4
5
6
7
8
9
10
11
12
13
CtMethod method = CtMethod.make("public static void write(Exception e) {\n" +
" java.io.File file = new java.io.File(\"D:/error.log\");\n" +
" try {\n" +
" if (!file.exists()) {\n" +
" file.createNewFile();\n" +
" }\n" +
" e.printStackTrace(new java.io.PrintStream(new java.io.FileOutputStream(file)));\n" +
" } catch (java.io.IOException ex) {\n" +
" ex.printStackTrace();\n" +
" }\n" +
" }", ctClass);
ctClass.addMethod(method);
ctClass.toBytecode(new DataOutputStream(new FileOutputStream("D:/b.class")));

遇到的坑

遇到的坑大概是写类的时候得写全路径名,然后方法体必须包含在{}内部