吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3302|回复: 29
收起左侧

[原创] Mybatis Log逆向

  [复制链接]
天堂的风 发表于 2023-11-10 11:52
本帖最后由 天堂的风 于 2024-12-13 10:12 编辑

贴一个免费的Mybatis Log插件:https://github.com/Link-Kou/intellij-mybaitslog.git

进入正题
下载 Mybatis Log插件(2023.10.1版本)
3.png

下载crf:https://github.com/leibnitz27/cfr
反编译 mybatis-log.jar

java -jar cfr-0.152.jar mybatis-log.jar --renamedupmembers true --hideutf false >> mybatis-log.txt

从这个按钮入手
1.png

当我们点击它时会调用 createToolWindowContent 方法,
发现只有当 bl2 == null 时才会跳转到 block14 ,然后执行 E.a(project, toolWindow);
所以我们只需要让 e_0.a(); 方法返回 null 就行。
2.png

然后去分析 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点

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方法

R类createToolWindowContent方法

D类actionPerformed方法,ifne修改为ifeq

D类actionPerformed方法

D类actionPerformed方法

k类lambda$new$0方法,ifne修改为ifeq

k类lambda$new方法

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");
}

免费评分

参与人数 7吾爱币 +11 热心值 +5 收起 理由
Hmily + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
hutuo + 1 + 1 谢谢@Thanks!
月光飞阿 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
绺子 + 1 用心讨论,共获提升!
eyesQAQ + 1 跟弄pdf那个差不多
ZJWY + 1 谢谢@Thanks!
vvvwxf + 1 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 天堂的风 发表于 2023-11-10 16:58
wuai006qw 发表于 2023-11-10 16:50
学习到了,有点不太明白,jar包解码之后,修改完对应的文件之后,怎么在形成jar包呢?

使用javassist生成修改后的class文件
用7zip等压缩软件对jar文件进行替换
或者使用jar uvf 命令替换即可
yyyy5 发表于 2024-12-12 16:50
天堂的风 发表于 2024-12-12 16:12
应该是插件配置的问题,点击插件的图标,在插件的设置里面重新勾选一下 New Line With --,然后确定保存

重新勾选之后确实不报错了,但是插件还是不生效,调试了各种参数都没用,从这个地址下的:https://plugins.jetbrains.com/plugin/13905-mybatis-log/versions/stable
我试试用idea下载插件,然后修改试试
飘零的殇 发表于 2023-11-10 15:43
vvvwxf 发表于 2023-11-10 15:51
我是真的好想当一个伸手党
你好早安啊 发表于 2023-11-10 16:36
记得有免费的
wuai006qw 发表于 2023-11-10 16:50
学习到了,有点不太明白,jar包解码之后,修改完对应的文件之后,怎么在形成jar包呢?
tomliu 发表于 2023-11-10 16:57
学习到了, 这就打开idea试试看
qinghuai 发表于 2023-11-10 17:35
学到了,立马安装一个,哈哈
孤狼微博 发表于 2023-11-11 01:33
我趴这里了等个投喂的
chaohen 发表于 2023-11-11 20:31
大佬厉害,可以很秀
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-1-10 16:33

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表