Charles的一次破解之旅

0x01 前言

本文以WEB抓包工具Charles(v4.2.8)为例,讲解一下其注册的流程以及如何使用javassist对java软件进行修改,达到破解的目的。

先看一下实现的效果。使用 任意用户名+任意key
就可以进行激活。

Charles的一次破解之旅

激活成功

Charles的一次破解之旅

如果想换用户名,取消注册再次注册即可。

Help->Unregister Charles…

Charles的一次破解之旅

接下来我们来分析一下注册的流程,以及如何去破解。

0x02 分析

首先打开软件(版本为v4.2.8),未注册时需要等待10s的动画才可进入,而且30分钟后会退出软件。

打开Help->Register Charles…,看到注册界面。

Charles的一次破解之旅

使用
jadx-gui
打开charles.jar,搜索字符串
Register Charles
,定位到
com.xk72.charles.gui.frames.RegisterFrame
中。

Charles的一次破解之旅

Charles的一次破解之旅

其中一段代码

this.bRegister.addActionListener(new NBdE(this));

可以看到注册按钮绑定的事件,当按下注册按钮时,执行
new NBdE(this)

跟进到
com.xk72.charles.gui.frames.NBdE

Charles的一次破解之旅

*其中的trim为Registered Name,trim2为License Key

首先对输入的name和key进行判断,需要其长度要大于0,然后调用
qHTb.DdNM(trim, trim2)
方法,并对其返回的结果进行判断。
当不为null时,注册失败。
反之则注册成功。

跟进
com.xk72.charles.qHTb
中,调用的是
DdNM(String str1,String str2)

Charles的一次破解之旅

由之前的推断可以知道,当
qHTb.DdNM(str1, str2)=null
时注册成功,这里DdNM(String str1,String str2)函数中如果正常执行
twLa = new qHTb(str, str2);
则会返回null,否则返回异常的信息。所以需要看
twLa = new qHTb(str, str2);
是否抛出异常,如果未异常,则返回为
null
,即注册成功;反之,注册失败。

继续跟进构造函数
qHTb(String str1,String str2)

Charles的一次破解之旅

构造函数 qHTb(String str1,String str2)
调用了 qHTb(String str1,String str2,int i)

其主要代码如下:

private qHTb(String str, String str2, int i) {

boolean z = false;

this.gbef = false;//表示是否注册成功 true为成功

this.lPpR = "Unregistered";//注册成功后为输入的Registered Name

try {

String replaceAll = str.replaceAll("[  ᠎     ]", " ");//替换特殊字符

if (DdNM(twLa(replaceAll, str2, 4))) {

z = true;

} else if (!replaceAll.equals(str)) {

z = DdNM(twLa(str, str2, 4));

}

if (!z) {

throw new LicenseException(DdNM(2));

}

this.lPpR = str;//注册成功,lPpR为Registered Name

this.gbef = true;//注册成功

} catch (NumberFormatException e) {

throw new LicenseException(DdNM(1));

}

}

因此要使注册成功,首先需要
twLa(String str,String str2, int i)
在调用的时候无异常,并且需要
DdNM(long j)
返回为true。

Charles的一次破解之旅

由以上代码可知,当 j=lGuB
时,返回为true。 lGuB
为已知常量。即需要满足 j=5911726755176091652L;
时, DdNM(long j)
返回为true。

接下来看 twLa(String str,String str2, int i)

Charles的一次破解之旅

由于jadx-gui查看twLa未反编译完全,为了查看方便,这里用Idea打开。

Charles的一次破解之旅

twLa方法的三个参数,var1是注册的name,var2是注册的key,var3是4.

Charles的一次破解之旅

分割线以上的为注册码的校验,下面为对用户名进行操作。

可以从以上的代码看出,在用户名操作时没有抛出异常的行为,所以从这里来看,注册成功与否与用户名没有直接关系(因为从之前的推断可知,当出现异常时注册失败)。

所以这里的破解思路是: 使用
javassist
修改
twLa(String str,String str2, int i)
中的第二个参数,为一个可用的注册码,然后使该函数的返回值为
5911726755176091652L
即可。

当然也可以直接修改 DdNM(long j)
返回为true,修改DdNM (String str1, String str2)
第二个参数为可用的key。这样修改以后,在软件运行注册的时候,可以达到任意用户名和任意key注册的效果。

当然修改的方法不止这两种,知道注册流程后,修改就很容易了。

接下来引入如何使用 javassist
来对软件进行修改。

0x03 使用javassist进行修改

Javassist是一个开源的分析、编辑和创建Java字节码的类库。虽然关于java字节码的处理有很多工具,如bcel,asm。不过这些都需要直接跟虚拟机指令打交道。而且Javassit 提供了更高级的API,无需掌握字节码指令的知识,对使用者要求较低。直接使用java编码的形式,不需要了解虚拟机指令,就能动态改变类的结构,或者动态生成类。

v4.2.8的修改

根据上面的分析,修改v4.2.8时,需要修改 DdNM(long j)
返回为true,修改DdNM (String str1, String str2)
第二个参数为可用的key,例如 C9D1226DB5B93C12D1

利用Javassist进行修改起来也很简单,具体实现代码如下:

private static ClassPool pool = ClassPool.getDefault();


public static void main(String[] args) throws Exception {


pool.insertClassPath("~/Desktop/charles.jar");

CtClass ctClass = pool.get("com.xk72.charles.qHTb");

CtMethod ctm1 = ctClass.getDeclaredMethod("DdNM",new CtClass[]{pool.get("long")});

ctm1.setBody("return true;");//修改返回值


CtMethod ctm2 = ctClass.getDeclaredMethod("DdNM",new CtClass[]{pool.get("java.lang.String"),pool.get("java.lang.String")});

ctm2.insertBefore("$2=/"C9D1226DB5B93C12D1/";");//修改第二个参数


ctClass.writeFile("~/Desktop/");

}

然后更新修改的内容,并替换

jar -uvf charles.jar com


cp charles.jar /Applications/Charles.app/Contents/Java/

然后再次打开Charles注册时就可以达到文章开头的效果了。

v4.5.4的修改

当时修改的时候最新版是v4.2.8,10.29号下载的是v4.5.1,还没来得及安装,再次查看最新版已经是v4.5.4了。

虽然更新了,其中类名和方法名改变了,但是注册的流程还是老样子。根据上面的思路可以进行修改。找到注册校验的类。

Charles的一次破解之旅

需要修改的类为 com.xk72.charles.DIWy

需要修改的方法:

1. private boolean OZtq(long var1)
,返回值修改为true。

2. public static String OZtq(String var0, String var1)
,第二个参数为可用的key。

修改的代码就不贴了,和上面的一样,修改一下类名和方法名即可。

打开Charles后任意用户名+任意注册码注册成功。

Charles的一次破解之旅

0x04 总结

关于Charles破解的文章,网上有很多。大多数都是直接修改了注册的标志和注册的信息,本文也是提供了另外一种破解的思路。通过简单分析注册的流程,然后使用javassist进行java文件的修改,以此达到破解的目的。

关于更多Charles破解相关的文章,可以参考以下几篇:

[1].http://scz.617.cn:8/misc/201910241714.txt(有详细注册码的算法以及注册机)

[2].http://www.520monkey.com/archives/1295(有分析和修改)

[3].https://www.freebuf.com/sectool/205520.html(有详细的javassist使用)

原文 

http://mp.weixin.qq.com/s?__biz=MzI1NDg4MTIxMw==&mid=2247484146&idx=1&sn=1d1c024e45d1caaed57ce95c82bc774a

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » Charles的一次破解之旅

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址