本帖最后由 天堂的风 于 2024-12-13 10:12 编辑
贴一个免费的Mybatis Log插件:https://github.com/Link-Kou/intellij-mybaitslog.git
进入正题
下载 Mybatis Log插件(2023.10.1版本)
从这个按钮入手
当我们点击它时会调用 createToolWindowContent 方法,
发现只有当 bl2 == null 时才会跳转到 block14 ,然后执行 E.a(project, toolWindow);
所以我们只需要让 e_0.a(); 方法返回 null 就行。
然后去分析 class e_0 这个类发下如下方法
// a方法在上面被调用,我们需要返回null
public static boolean a() {...}
// 下面四个方法经过分析我们直接将返回值修改为true就行
public static boolean b() {...}
private static boolean a(String string) {...}
private static boolean b(String string) {...}
private static boolean c(String string) {...}
这里借助 javassist 生成修改后的class文件
public static void hookMethod() throws Exception {
ClassPool classPool = ClassPool.getDefault();
classPool.appendClassPath("D:\\mybatis-log.jar");
CtClass ctClass = classPool.get("e");
CtMethod aMethod = ctClass.getDeclaredMethod("a", new CtClass[]{});
aMethod.setBody("return null;");
String methodBody = "return true;";
CtMethod a2Method = ctClass.getDeclaredMethod("a", new CtClass[]{classPool.get("java.lang.String")});
a2Method.setBody(methodBody);
CtMethod b2Method = ctClass.getDeclaredMethod("b", new CtClass[]{});
b2Method.setBody(methodBody);
CtMethod bMethod = ctClass.getDeclaredMethod("b", new CtClass[]{classPool.get("java.lang.String")});
bMethod.setBody(methodBody);
CtMethod cMethod = ctClass.getDeclaredMethod("c", new CtClass[]{classPool.get("java.lang.String")});
cMethod.setBody(methodBody);
ctClass.writeFile("writefile");
}
使用下面命令将生成好的 e.class 文件替换掉jar包中的e.class
[Java] 纯文本查看 复制代码 jar uvf mybatis-log.jar e.class
最后再移除收费提示,修改jar包META-INF/plugin.xml将下面代码删除即可
[Java] 纯文本查看 复制代码 <product-descriptor code="PMYBATISLOG" release-date="20200501" release-version="202051"/>
下载 Mybatis Log插件(2024.10.1版本)
还是使用cfr反编译 mybatis-log.jar,然后搜索 public void createToolWindowContent( 定位到需要hook的代码
java -jar cfr-0.152.jar mybatis-log.jar --renamedupmembers true --hideutf false >> mybatis-log.txt
这是反编译出了代码,只截取了部分:
hook点
上面的代码和2023版的差不多,我们看 v12 = v10.equals(I.a()); 其实就是之前的 bl = b12.eqeals(e_0.a());
那么我们还是让 v12 == null 然后将之前hook的 e 类修改为 I 即可,
因为我们将jar包META-INF/plugin.xml里面的 <product-descriptor code="PMYBATISLOG" 删除了,
代码里面有3个地方又调用了 .getProductCode() 是判断ProductCode 是否存在的,不存在就弹出错误通知,所以只能用 JByteMod 汇编修改了
搜过反编译出来的代码,发现有3个地方调用了.getProductCode()方法,既然我们删除了productCode,那么我们就对每个进行取反就行,
打开R类找到createToolWindowContent方法,搜索getProduct,修改ifne为ifeq
R类createToolWindowContent方法
D类actionPerformed方法,ifne修改为ifeq
D类actionPerformed方法
k类lambda$new$0方法,ifne修改为ifeq
k类lambda$new方法
再hook I 这个类,下面是新的hook代码:
public static void hookMethod() throws Exception {
ClassPool classPool = ClassPool.getDefault();
classPool.appendClassPath("D:\\vm\\mybatis-log.jar");
CtClass ctClass = classPool.get("mybatislog.I");
CtMethod aMethod = ctClass.getDeclaredMethod("a", new CtClass[]{});
aMethod.setBody("return null;");
String methodBody = "return true;";
CtMethod a2Method = ctClass.getDeclaredMethod("a", new CtClass[]{classPool.get("java.lang.String")});
a2Method.setBody(methodBody);
CtMethod b2Method = ctClass.getDeclaredMethod("b", new CtClass[]{});
b2Method.setBody(methodBody);
CtMethod bMethod = ctClass.getDeclaredMethod("b", new CtClass[]{classPool.get("java.lang.String")});
bMethod.setBody(methodBody);
CtMethod cMethod = ctClass.getDeclaredMethod("c", new CtClass[]{classPool.get("java.lang.String")});
cMethod.setBody(methodBody);
ctClass.writeFile("writefile");
}
|