Intellij Mybatis 插件破解教程

背景

Intellij上的mybatis插件是一個十分優(yōu)秀的插件涕刚,但是需要付費。在網(wǎng)上搜索一番之后乙帮,發(fā)現(xiàn)果然有破解版杜漠,遂來研究一番破解原理。

環(huán)境

  • 操作系統(tǒng):mac os 10.11.6
  • Intellij版本:2016.2
  • mybatis插件版本:2.87
  • 破解工具:
    • JBE:java字節(jié)碼修改工具
    • JD-GUI:java反編譯工具

工具介紹

JD-GUI

該工具的使用方式很簡單察净。具體界面如下:

JBE

jbe是基于jclasslib的字節(jié)碼修改工具驾茴,十分強大。假設(shè)我們要修改某個方法對應的字節(jié)碼氢卡,具體步驟如下圖所示:

  1. 首先點擊圖中數(shù)字1所指的icon锈至,選擇你要修改的class文件。
  2. 然后點擊Methods译秦,可以看到該class文件中的類所含有的方法列表峡捡。
  3. 點擊我們需要修改的方法,然后點擊code筑悴。
  4. 在右邊區(qū)域我們可以看到Code Editor们拙。點擊進入之后,我們就可以修改字節(jié)碼了阁吝。
  5. 修改完成之后點擊圖中數(shù)字6所指的save method保存字節(jié)碼砚婆,此時對應的class文件會同步更新。

破解步驟

思路

軟件破解的一般思路突勇,都是hack進校驗license的函數(shù)装盯,修改里面的校驗邏輯坷虑。有個小技巧可以幫助我們更快地定位校驗激活碼的函數(shù):我們可以全局地搜一下"license"、"activate"验夯、"key"以及"valid"等詞語猖吴,搜索出來的代碼一般都是跟處理激活碼有關(guān)的。

詳細步驟

  1. 首先安裝沒有破解的mybatis插件挥转,然后退出Intellij海蔽。在mac os下,插件位于~/Library/Application\ Support/IntelliJIdea2016.2/mybatis_plus/lib绑谣。主要的代碼位于mybatis_plus.jar中党窜。
  2. 我們通過JD-GUI打開mybatis_plus.jar,觀察代碼結(jié)構(gòu)借宵。通過觀察以及研究網(wǎng)上他人提供的破解版之后幌衣,我們發(fā)現(xiàn)一共需要修改以下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修改字節(jié)碼豁护,原來的字節(jié)碼如下:

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

我們將不需要的字節(jié)碼全部刪去,只留下return語句:

return

保存之后我們再看反編譯之后的stop方法如下:

我們可以看到欲间,原來的邏輯都被刪除了。

JavaUtils修改

修改refValid方法猎贴,原來的方法如下:

最直觀的做法是在方法的最后將valid和validated重置為true班缎,原來的字節(jié)碼較長她渴,只截取了return valid的字節(jié)碼:

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

所以我們需要在getstatic之前添加重置為true的字節(jié)碼:

......
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推入操作數(shù)棧达址,然后通過putstatic修改validated和valid的值沉唠。保存之后我們再看反編譯之后的refValid方法如下:

RefProject修改

修改notifyLicenseInvalid方法儡遮,原來方法如下:

修改這個方法的思路和修改JavaService一樣,將代碼邏輯刪除即可激率,最后的方法如下:

ActivationDriver修改

修改activate方法咆繁,原來方法如下:

這段代碼的修改可能會比較復雜慨仿,我直接參考了網(wǎng)上別人的思路牢硅。我們需要刪去原來代碼中通過http請求校驗license的邏輯减余,并且返回一個自己mock的ActivationResult對象。我們觀察原來的字節(jié)碼:

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();涨薪,這中間的代碼我們都需要刪除。然后我們插入下面的字節(jié)碼:

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對象轉(zhuǎn)換成ActivationResult末捣,并且將其set至ref對象中侠姑。總的字節(jié)碼如下:

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代碼到字節(jié)碼
  2. mybatis破解教程
  3. 他人提供的破解版jar包
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市邦邦,隨后出現(xiàn)的幾起案子安吁,更是在濱河造成了極大的恐慌,老刑警劉巖燃辖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鬼店,死亡現(xiàn)場離奇詭異,居然都是意外死亡黔龟,警方通過查閱死者的電腦和手機妇智,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門确沸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人俘陷,你說我怎么就攤上這事罗捎。” “怎么了拉盾?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵桨菜,是天一觀的道長。 經(jīng)常有香客問我捉偏,道長倒得,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任夭禽,我火速辦了婚禮霞掺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘讹躯。我一直安慰自己菩彬,他們只是感情好,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布潮梯。 她就那樣靜靜地躺著骗灶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪秉馏。 梳的紋絲不亂的頭發(fā)上耙旦,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機與錄音萝究,去河邊找鬼免都。 笑死,一個胖子當著我的面吹牛帆竹,可吹牛的內(nèi)容都是我干的绕娘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼馆揉,長吁一口氣:“原來是場噩夢啊……” “哼业舍!你這毒婦竟也來了抖拦?” 一聲冷哼從身側(cè)響起升酣,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎态罪,沒想到半個月后噩茄,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡复颈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年绩聘,在試婚紗的時候發(fā)現(xiàn)自己被綠了沥割。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡凿菩,死狀恐怖机杜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情衅谷,我是刑警寧澤椒拗,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站获黔,受9級特大地震影響蚀苛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜玷氏,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一堵未、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧盏触,春花似錦渗蟹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至诗宣,卻和暖如春膘怕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背召庞。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工岛心, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人篮灼。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓忘古,卻偏偏與公主長得像,于是被迫代替她去往敵國和親诅诱。 傳聞我的和親對象是個殘疾皇子髓堪,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,072評論 25 707
  • 背景 Charles是一款十分優(yōu)秀的抓包軟件,尤其是在mac操作系統(tǒng)下娘荡。Charles是一款商用軟件干旁,其體驗版雖然...
    wooyoo閱讀 6,705評論 1 9
  • 人生有時候轉(zhuǎn)折只需要一個觀念,從空虛到現(xiàn)在的踏實炮沐,只用了三個月就讓我找到了自己想干什么争群。說句笑話,我就是特...
    Mrs簡閱讀 358評論 0 4
  • 綏德縣文學藝術(shù)界聯(lián)合會倡議書 7月26日大年,我縣遭遇特大暴雨洪澇换薄,災害發(fā)生后玉雾,縣委、縣政府統(tǒng)籌部署轻要,人民子弟兵全力搶...
    小馬女士0424閱讀 115評論 0 0
  • 下村勉的個人計算機智能助手-冥神复旬,不錯,不知道微軟的cortna能不能加裝自己需要的模塊冲泥,可以更個性化地定制智能助...
    ArimaKisho閱讀 328評論 0 0