博客地址java
一些java軟件要進行收費,不少採用遠程認證的方式,jar包代碼中確定有一個地方處理是否已經認證。 咱們經過一些手段,如本地創建一個認證服務器、修改jar包class文件修改認證邏輯等等。git
本地採起idea插件[mybatis pluin]進行實驗,由於這個比較簡單。 在JavaUtils類中有一個refValid方法驗證key和result是否有效 在一個ActivationDriver類的activate方式 是進行激活驗證。github
MAC Intellj 15 (16也是相似的)服務器
下載插件找到對應的存儲jar包的位置,如在個人機器上是~/Library/Application Support/IntelliJIdea15/mybatis_plus/lib 下載後新建一個工程,將這個jar包加入到項目的依賴Libary。 將javassist加入到依賴中,用於修改class文件。 編寫一個簡單的Main類和Main方法。mybatis
package javaassist; import javassist.CannotCompileException; import javassist.ClassPool; import javassist.CtClass; import javassist.CtMethod; import javassist.NotFoundException; import java.io.IOException; /** * Description: * * @author liuzhengyang * @version 1.0 * @since 2016-09-16 */ public class Main { public static void main(String[] args) throws NotFoundException { ClassPool pool = ClassPool.getDefault(); CtClass driverClass = pool.get("com.seventh7.mybatis.ref.license.ActivationDriver"); CtClass javaUtil = pool.get("com.seventh7.mybatis.util.JavaUtils"); CtMethod activate = driverClass.getMethod("activate", "(Ljava/lang/String;)Lcom/seventh7/mybatis/ref/license/ActivationResult;"); CtMethod refValid = javaUtil.getDeclaredMethod("refValid"); try { refValid.setBody("{return true;}"); } catch (CannotCompileException e) { e.printStackTrace(); } System.out.println(activate); try { activate.setBody("{com.seventh7.mybatis.ref.license.LicenseData licenseData = new com.seventh7.mybatis.ref.license.LicenseData(\"1\", \"2\");com.seventh7.mybatis.ref.license.ActivationResult res =com.seventh7.mybatis.ref.license.ActivationResult.success(licenseData); return res;}"); } catch (CannotCompileException e) { e.printStackTrace(); } try { driverClass.writeFile("hello"); javaUtil.writeFile("hello"); } catch (CannotCompileException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
這樣會在執行java命令的目錄(在Idea裏是project下面的目錄)生成一個hello文件夾,下面有ActivationResult這個類。 將com文件夾和mybatis_plus.jar文件夾放到一個目錄,執行ide
jar uvf mybatis_plus.jar com
這樣就把修改的class文件替換了。 重啓Idea便可生效ui