charles授權分析與破解
最近charles又更新了,對於有強迫症的人來說,無法接受這個事實,果斷前往 ofollow,noindex">官網 下載安裝。
興奮的點選了軟體圖示,突然間,天氣驟變,窗外電閃雷鳴,羅盤不停的轉動,電腦風扇也瘋狂的轉。老夫掐指一算,不好!今天不適宜使用charles,可是已經來不及了。此時,心跳逐漸加快,砰!砰砰! 不知會有什麼事發生,只能緊緊的凝視著電腦螢幕,視線不敢移開半點~
時間已經過去100毫秒,機子已經發燙,螢幕看起來並沒有什麼變化,但變得幽暗了。似乎螢幕裡有雙眼睛直勾勾的盯著我,眼裡充滿了血絲,披頭散髮,屋子裡也沒有了其他聲音。啪!突然外面一聲巨響,螢幕出現了一個極其恐怖的畫面,我完全不敢看
窗外不知啥時候也下起了雨,冷風也從吹進了屋子裡。嘻嘻嘻嘻,外面突然出現一個刺耳的笑聲,聽得我毛骨悚然,像極了電影裡鬼嬰的聲音,隨後出現了一個聲音:“這都是命”。然後笑聲停止了,雨也停了,就像什麼也沒發生一樣。我以為出現了幻覺,但是一看螢幕,那個畫面還在,才知道全都是真的。看著右下角的倒計時,10……9……8…… 回想剛剛外面那句話,竟然害怕了起來。這倒計時結束會發送什麼?難道是我生命的最後10秒?不!我不信!lz(樓主)要逆天改命。
好了,字數湊夠了,開始正式嗶嗶了。charles是一個必備的網路分析工具,但是是收費的,雖然網上有破解版。但都是比較舊的版本(劇情需要),子曰:”不會破解軟體的程式員不是好作家”,老子也說過:“孔子說得對”。charles授權是本地校驗的,所以需要分析下校驗邏輯。charles是用java寫的,所以可以很方便的分析程式碼,推薦使用 jd-gui 和 Luyten
授權分析
開啟charles,選單欄 Help->Register Charles 彈出註冊視窗,需要填入 Registered Name 和 License Key
就從這個介面開始,使用 jd-gui 或 Luyten 開啟安裝目錄裡的 java/charles.jar 檔案,全域性搜尋 Registered Name
在 RegisterFrame 發現該關鍵字,分析程式碼,發現關鍵監聽 this.bRegister.addActionListener
localContainer.add(this.bCancel, "tag cancel,split 2,span,center"); localContainer.add(this.bRegister, "tag ok"); this.bCancel.addActionListener(new WTzz(this)); this.bRegister.addActionListener(new HgWa(this));
點選進入 HgWa 的構造方法裡,類裡提供了一個方法,在下方通過註釋說明
public final void actionPerformed(ActionEvent paramActionEvent) { // 獲取 輸入框內容 paramActionEvent = RegisterFrame.lcJx(this.lcJx).getText().trim(); String str = RegisterFrame.KcPF(this.lcJx).getText().trim(); if ((paramActionEvent.length() > 0) && (str.length() > 0)) { Object localObject; //關鍵if if ((localObject = kKPk.lcJx(paramActionEvent, str)) != null) { ExtendedJOptionPane.lcJx(this.lcJx, localObject, "Charles Registration", 2); return; } //授權成功的提示 ExtendedJOptionPane.lcJx(this.lcJx, "Thank you for registering. Charles will now close. Please start Charles again to continue.", "Charles Registration", 1); } }
最下面有個授權成功的提示,所以 kKPk.lcJx(paramActionEvent, str)
即為授權校驗的方法。檢視實現,實際上就是 例項化一個 kKPk 物件,如果例項化成功,就說明校驗通過,並且將該例項 放到 kKPk.KcPF 。這裡使用 Luyten 載入 kKPk ,jd看程式碼實在是難受,構造方法也非常簡單。有兩個關鍵的地方
//line 7 private static String lcJx = "Thanks for looking at the source. Please register Charles if you use it."; //構造方法 if (!this.lcJx(this.KcPF(replaceAll, s, n2)) && (replaceAll.equals(ynvb) || !this.lcJx(this.KcPF(ynvb, s, n2)))) { throw new LicenseException(this.lcJx(2)); }
在第7行有個關鍵字串,不懂什麼意思沒關係,中文翻譯就是: 牛逼啊,這個類就是做授權校驗的
kkpk要例項化成功,肯定不能進入到if裡面, this.lcJx() 需要返回true, this.KcPF()只要不丟擲異常即可,牛逼的人就可以根據這個演算法寫個註冊機了。我們只要破解能用就行了,所以需要修改該類檔案。
開炮
修改檔案有很多方式,有直接改 smail 的,具體怎麼改網上一大堆教程。對於牛逼的人來說,直接寫程式碼來改就行。這裡就要用到一個工具: javassist ,Javassist是一個開源的分析、編輯和建立Java位元組碼的類庫。
開啟 Intellij IDEA建立一個java工程,匯入charles.jar作為依賴,新建一個 Test.java ,用於測試
public class Test { public static void main(String[] args) { try { //該檔案需要新增一個Artifacts,build後生成 ClassLoader classLoader = ClassLoaderUtil.loadJarFile(new File("out/artifacts/charles_crack_jar/charles-crack.jar")); String name = "wrbug"; String key = "ss"; Class<?> kKpk = classLoader.loadClass("com.xk72.charles.kKPk"); Constructor<?> declaredConstructor = kKpk.getDeclaredConstructor(String.class, String.class); declaredConstructor.setAccessible(true); Object obj = declaredConstructor.newInstance(name, key); System.out.println("破解成功");
然後執行,因為沒有做任何處理,不出意外,會有異常丟擲
再新建一個 Crack.java ,用於修改class
public class Crack { public static void main(String[] args) throws Throwable { ClassPool classPool = ClassPool.getDefault(); CtClass ctClass = classPool.get("com.xk72.charles.kKPk"); //修改 lcJx 方法返回true CtClass[] param = new CtClass[1]; param[0] = classPool.get("long"); CtMethod method = ctClass.getDeclaredMethod("lcJx", param); method.setBody("return true;"); //修改KcPF 返回為任意long param = new CtClass[3]; param[0] = classPool.get(String.class.getName()); param[1] = classPool.get(String.class.getName()); param[2] = classPool.get("int"); method = ctClass.getDeclaredMethod("KcPF", param); method.setBody("return 0L;"); //靜態方法 lcJx 方法返回true method = ctClass.getDeclaredMethod("lcJx", null); method.setBody("return true;"); //這裡返回Registered Name, 可以自行修改 method = ctClass.getDeclaredMethod("JZlU", null); method.setBody("return \"wrbug\";"); // 將class檔案寫入到 output目錄 ctClass.writeFile("output"); } }
執行crack後,在output目錄檢視下修改後的kKPk.class ,可以發現,方法都已修改成功
private boolean lcJx(long var1) { return true; } public static boolean lcJx() { return true; } private long KcPF(String var1, String var2, int var3) { return 0L; } public static String JZlU() { return "wrbug"; }
再次重新build後,執行Test,見證奇蹟的時候到了,提示破解成功。至此,整個charles破解完成,將生產的jar重新命名為 charles.jar,替換原有的即可
網(tui)址(guang)
專案地址: https://github.com/WrBug/charles-crack
carles授權碼生成: https://charles.wrbug.com/