charles破解--ASM应用

Charles 是一款Windows、Mac和Linux下的HTTP代理/ HTTP监视器/反向代理的强大工具,免费试用版有30天的期限,购买正版需要至少30美刀。

未注册

由于Charles使用java开发,对此有多种破解方式,原理上大同小异:

查找授权验证代码,将其修改为通过验证,更新jar包。

本文通过ASM字节码操作库来修改jar包中的class文件,需要准备以下工具:

  • JD-GUI :java反编译工具
  • asm-all:asm jar包最好下载4.0以后的all版本,简单方便, 我这里使用asm-all-6.0_BETA.jar 。关于使用方法官网有一份非常好的文档User guide这里不做赘述
  • java IDE: Eclipse,IntelliJ IDE,Android Studio等等都可以,纯文本大神绕道

分析反编译代码

官网下载Charles解压到本地,将lib/charles.jar拷出来(备份的需要,防止破解意外), jd-gui打开

$ jd-gui charles.jar 

查找字符串常量This is a 30 day trial version(试用期限提示语, 前几个单词即可),

查找关键字符串

SplashWindow.class这个类中

public void showSharewareStatus() {
  showStatus("This is a 30 day trial version. If you continue using Charles you must\npurchase a license. Please see the Help menu for details.");
}
public void showRegistrationStatus() {
  if (kKPk.lcJx()) {
    showStatus("Registered to: " + kKPk.JZlU());
    return;
  }
  showSharewareStatus();
}

lcJx(),JZlU()都是kKPk类的静态方法:

public final class kKPk{
  public static boolean lcJx() {
    kKPk localkKPk;
    return (localkKPk = KcPF).JZlU;
  }
  public static String JZlU() {
    //省略代码
    return localkKPk.yNVB;
  }
}

从反编译代码中可以看出lcJx()用于判断是否注册(true注册), JZlU()返回注册给的用户。因此首先修改这两个方法,我们的目标是形如:

public static boolean lcJx(){
  return true;
}
public static String JZlU(){
  return "tlb@jmu";
}

制定破解方案

从上面的分析,我们指定以下破解方案的执行步骤

  1. 将kKPk.class从charles.jar中抽取出来
  2. 通过asm修改lcJx(),JZlU()方法
  3. 将修改后的kKPk.class重新打包进charles.jar

开撸

# 提取kKPk.class
$ jar xvf charles.jar com/xk72/charles/kKPk.class
# 更新jar包中的指定类(替换或添加)
$ jar uvf charles.jar com/xk72/charles/kKPk.class 

字节码修改代码

package com.example.asm.charles;

import com.example.Util;

import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.MethodVisitor;

import static org.objectweb.asm.Opcodes.*;

public class Charles {
  public static void main(String[] args) throws Exception {
    ClassReader cr = new ClassReader("com.xk72.charles.kKPk");
    ClassWriter cw = new ClassWriter(0);
    CharlesAdapter adapter = new CharlesAdapter(ASM5, cw);
    cr.accept(adapter, ASM5);
    // 将byte[]写入到新的文件中
    Util.saveClass(cw.toByteArray(), "com/xk72/charles/kKPk2.class");
  }

  static class CharlesAdapter extends ClassVisitor{
    public CharlesAdapter(int i, ClassVisitor classVisitor) {
      super(i, classVisitor);
    }

    @Override
    public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
      MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions);
      // boolean lcJx()方法
      if (name.equals("lcJx" ) && desc.equals("()Z")) {
        mv.visitCode();
        mv.visitInsn(ICONST_1);
        mv.visitInsn(IRETURN);
        mv.visitMaxs(1, 0);
        mv.visitEnd();
        return null;
      }
      // String JZlU()方法
      if (name.equals("JZlU") && desc.equals("()Ljava/lang/String;")) {
        mv.visitCode();
        mv.visitLdcInsn("tlb@jmu");
        mv.visitInsn(ARETURN);
        mv.visitMaxs(1, 0);
        mv.visitEnd();
        return null;
      }
      return mv;
    }
  }
}

这里需要注意的是new ClassReader("com.xk72.charles.kKPk")其中com.xk72.charles.kKPk是从charles.jar中提取的原始class文件, 应该将路径添加到classpath中,或者连通目录结构拷贝到工程的class文件输出目录中, 以确保可以加载到, 修改完成保存到kKPk2.class(这里只是文件名不一样, 其中的类还是kKPk). 最后将kKPk2重命名为kKPk打包进charles.jar即可.

注册.png

破解方式有很多种, 笔者前段时间研究了下android组件化的实现,接触到强大ASM库, 于是产生通过这种方式来破解基于java开发的跨平台软件的想法, 初窥门径耳.

附Linux破解版地址:

  • 4.2.7(2018.12.21) 完整代码
    链接: https://pan.baidu.com/s/1VjWh_Jy8SXspX08ZH_2wCg 提取码: 3rnu
    sha256: 4c8d3152ff25d8e752f73abe6dc6dd0c0603e99adca501ba155fe16cc7a8739d
  • 4.5.4 (2019.12.02)完整代码
    修改com.xk72.charles.DIWy类的下面两个方法,然后打包替换lib/charles.jar
      package com.xk72.charles;
      
      public class DIWy {
          public static boolean OZtq() {
              return true;
          }
      
          public static String wkKg() {
              return "tlb@jmu";
          }
      }
    
    原始的charles.jar重命名为charles0.jar一并打包进去了.
    链接: https://pan.baidu.com/s/1gB6j_JGOIE2daFwqGY6U9w 提取码: s78x
    sha256: e2cae913dba9d0cead61b916bdb79d54c9eb459c9249b1a7dd63e144605e85b1
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容