Intellij Mybatis 插件破解教程

背景

Intellij上的mybatis插件是一个十分优秀的插件,但是需要付费。在网上搜索一番之后,发现果然有破解版,遂来研究一番破解原理。

环境

  • 操作系统:mac os 10.11.6
  • Intellij版本:2016.2
  • mybatis插件版本:2.87
  • 破解工具:
    • JBE:java字节码修改工具
    • JD-GUI:java反编译工具

工具介绍

JD-GUI

该工具的使用方式很简单。具体界面如下:

JBE

jbe是基于jclasslib的字节码修改工具,十分强大。假设我们要修改某个方法对应的字节码,具体步骤如下图所示:

  1. 首先点击图中数字1所指的icon,选择你要修改的class文件。
  2. 然后点击Methods,可以看到该class文件中的类所含有的方法列表。
  3. 点击我们需要修改的方法,然后点击code。
  4. 在右边区域我们可以看到Code Editor。点击进入之后,我们就可以修改字节码了。
  5. 修改完成之后点击图中数字6所指的save method保存字节码,此时对应的class文件会同步更新。

破解步骤

思路

软件破解的一般思路,都是hack进校验license的函数,修改里面的校验逻辑。有个小技巧可以帮助我们更快地定位校验激活码的函数:我们可以全局地搜一下"license"、"activate"、"key"以及"valid"等词语,搜索出来的代码一般都是跟处理激活码有关的。

详细步骤

  1. 首先安装没有破解的mybatis插件,然后退出Intellij。在mac os下,插件位于~/Library/Application\ Support/IntelliJIdea2016.2/mybatis_plus/lib。主要的代码位于mybatis_plus.jar中。
  2. 我们通过JD-GUI打开mybatis_plus.jar,观察代码结构。通过观察以及研究网上他人提供的破解版之后,我们发现一共需要修改以下4个类:
    • com.seventh7.mybatis.service.JavaService
    • com.seventh7.mybatis.util.JavaUtils
    • com.seventh7.mybatis.ref.RefProject
    • com.seventh7.mybatis.ref.license.ActivationDriver

JavaService修改

修改stop方法,原来的方法:

我们需要将这段代码逻辑删去,我们通过jbe修改字节码,原来的字节码如下:

aload_0
iconst_1
putfield com/seventh7/mybatis/service/JavaService/stopped Z
invokestatic com/seventh7/mybatis/setting/MybatisSetting/getInstance()Lcom/seventh7/mybatis/setting/MybatisSetting;
getstatic com/seventh7/mybatis/ref/license/LicenseData/EMPTY Lcom/seventh7/mybatis/ref/license/LicenseData;
invokevirtual com/seventh7/mybatis/setting/MybatisSetting/setLicenseData(Lcom/seventh7/mybatis/ref/license/LicenseData;)V
goto 9
astore_1
return

我们将不需要的字节码全部删去,只留下return语句:

return

保存之后我们再看反编译之后的stop方法如下:

我们可以看到,原来的逻辑都被删除了。

JavaUtils修改

修改refValid方法,原来的方法如下:

最直观的做法是在方法的最后将valid和validated重置为true,原来的字节码较长,只截取了return valid的字节码:

......
getstatic com/seventh7/mybatis/util/JavaUtils/valid Z
ireturn

所以我们需要在getstatic之前添加重置为true的字节码:

......
iconst_1
putstatic com/seventh7/mybatis/util/JavaUtils/validated Z
iconst_1
putstatic com/seventh7/mybatis/util/JavaUtils/valid Z
getstatic com/seventh7/mybatis/util/JavaUtils/valid Z
ireturn

iconst_1表示将常量1推入操作数栈,然后通过putstatic修改validated和valid的值。保存之后我们再看反编译之后的refValid方法如下:

RefProject修改

修改notifyLicenseInvalid方法,原来方法如下:

修改这个方法的思路和修改JavaService一样,将代码逻辑删除即可,最后的方法如下:

ActivationDriver修改

修改activate方法,原来方法如下:

这段代码的修改可能会比较复杂,我直接参考了网上别人的思路。我们需要删去原来代码中通过http请求校验license的逻辑,并且返回一个自己mock的ActivationResult对象。我们观察原来的字节码:

aload_0
invokestatic org/apache/commons/lang/StringUtils/isBlank(Ljava/lang/String;)Z
ifeq 7
ldc "License key invalid"
invokestatic com/seventh7/mybatis/ref/license/ActivationResult/fail(Ljava/lang/String;)Lcom/seventh7/mybatis/ref/license/ActivationResult;
areturn
invokestatic com/intellij/openapi/util/Ref/create()Lcom/intellij/openapi/util/Ref;
astore_1
new com/seventh7/mybatis/ref/license/ActivationDriver$1
dup
aload_1
invokespecial com/seventh7/mybatis/ref/license/ActivationDriver$1/<init>(Lcom/intellij/openapi/util/Ref;)V
astore_2
invokestatic com/seventh7/mybatis/util/JavaUtils$SystemData/getInstance()Lcom/seventh7/mybatis/util/JavaUtils$SystemData;
astore_3
invokestatic com/seventh7/mybatis/ref/http/HttpPostBuilder/builder()Lcom/seventh7/mybatis/ref/http/HttpPostBuilder;
ldc "https://www.codesmagic.com/activate"
invokevirtual com/seventh7/mybatis/ref/http/HttpPostBuilder/url(Ljava/lang/String;)Lcom/seventh7/mybatis/ref/http/HttpPostBuilder;
ldc "no"
aload_0
invokevirtual com/seventh7/mybatis/ref/http/HttpPostBuilder/param(Ljava/lang/String;Ljava/lang/String;)Lcom/seventh7/mybatis/ref/http/HttpPostBuilder;
ldc "md5"
aload_3
invokevirtual com/seventh7/mybatis/util/JavaUtils$SystemData/getMacAddress()Ljava/lang/String;
invokevirtual com/seventh7/mybatis/ref/http/HttpPostBuilder/param(Ljava/lang/String;Ljava/lang/String;)Lcom/seventh7/mybatis/ref/http/HttpPostBuilder;
invokevirtual com/seventh7/mybatis/ref/http/HttpPostBuilder/build()Lorg/apache/http/client/methods/HttpPost;
astore 4
ldc2_w 1000
new com/seventh7/mybatis/ref/http/RetryFixedTimes
dup
iconst_3
invokespecial com/seventh7/mybatis/ref/http/RetryFixedTimes/<init>(I)V
invokestatic com/seventh7/mybatis/ref/http/HttpExecutorFactory/newRetryExecutor(JLcom/seventh7/mybatis/ref/http/RetryStrategy;)Lcom/seventh7/mybatis/ref/http/RetryHttpExecutor;
aload 4
aload_2
invokevirtual com/seventh7/mybatis/ref/http/RetryHttpExecutor/execute(Lorg/apache/http/client/methods/HttpUriRequest;Lcom/seventh7/mybatis/ref/http/HttpHandler;)V
aload_1
invokevirtual com/intellij/openapi/util/Ref/get()Ljava/lang/Object;
checkcast com/seventh7/mybatis/ref/license/ActivationResult
areturn

从第9行开始,也就是HttpHandler<LicenseData> httpHandler = new HttpHandler(),到第37行,也就是return (ActivationResult)ref.get();,这中间的代码我们都需要删除。然后我们插入下面的字节码:

new com/seventh7/mybatis/ref/license/LicenseData
dup
ldc "123"
ldc "123"
invokespecial com/seventh7/mybatis/ref/license/LicenseData/<init>(Ljava/lang/String;Ljava/lang/String;)V
astore_2
aload_1
aload_2
invokestatic com/seventh7/mybatis/ref/license/ActivationResult/success(Lcom/seventh7/mybatis/ref/license/LicenseData;)Lcom/seventh7/mybatis/ref/license/ActivationResult;
invokevirtual com/intellij/openapi/util/Ref/set(Ljava/lang/Object;)V

其中第1行到第6行,翻译成java代码为:

LicenseData localLicenseData = new LicenseData("123", "123");

这里我们自己模拟了一个License对象,然后从第7行到第10行,翻译成java代码为:

localRef.set(ActivationResult.success(localLicenseData));

这里我们将License对象转换成ActivationResult,并且将其set至ref对象中。总的字节码如下:

aload_0
invokestatic org/apache/commons/lang/StringUtils/isBlank(Ljava/lang/String;)Z
ifeq 7
ldc "License key invalid"
invokestatic com/seventh7/mybatis/ref/license/ActivationResult/fail(Ljava/lang/String;)Lcom/seventh7/mybatis/ref/license/ActivationResult;
areturn
invokestatic com/intellij/openapi/util/Ref/create()Lcom/intellij/openapi/util/Ref;
astore_1
new com/seventh7/mybatis/ref/license/LicenseData
dup
ldc "123"
ldc "123"
invokespecial com/seventh7/mybatis/ref/license/LicenseData/<init>(Ljava/lang/String;Ljava/lang/String;)V
astore_2
aload_1
aload_2
invokestatic com/seventh7/mybatis/ref/license/ActivationResult/success(Lcom/seventh7/mybatis/ref/license/LicenseData;)Lcom/seventh7/mybatis/ref/license/ActivationResult;
invokevirtual com/intellij/openapi/util/Ref/set(Ljava/lang/Object;)V
aload_1
invokevirtual com/intellij/openapi/util/Ref/get()Ljava/lang/Object;
checkcast com/seventh7/mybatis/ref/license/ActivationResult
areturn

修改之后的activate方法如下所示:

最后

做完了以上操作,重启intellij,就可以看到插件已被成功破解啦~

参考资料

感谢以下资料对我的帮助:

  1. 从Java代码到字节码
  2. mybatis破解教程
  3. 他人提供的破解版jar包
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,566评论 25 707
  • 背景 Charles是一款十分优秀的抓包软件,尤其是在mac操作系统下。Charles是一款商用软件,其体验版虽然...
    wooyoo阅读 6,405评论 1 9
  • 人生有时候转折只需要一个观念,从空虚到现在的踏实,只用了三个月就让我找到了自己想干什么。说句笑话,我就是特...
    Mrs简阅读 345评论 0 4
  • 绥德县文学艺术界联合会倡议书 7月26日,我县遭遇特大暴雨洪涝,灾害发生后,县委、县政府统筹部署,人民子弟兵全力抢...
    小马女士0424阅读 99评论 0 0
  • 下村勉的个人计算机智能助手-冥神,不错,不知道微软的cortna能不能加装自己需要的模块,可以更个性化地定制智能助...
    ArimaKisho阅读 319评论 0 0