首页
论坛
课程
招聘
[原创]给Charles添加URL Decode功能的扩展插件
2020-9-28 17:47 1044

[原创]给Charles添加URL Decode功能的扩展插件

2020-9-28 17:47
1044

看到论坛内有人问“Charles能自定义解密算法吗?”,想到之前正好弄过charles的功能扩展,所以顺便分享到论坛上,内容比较简单,小白都可以直接上手改造。

前言

Charles是抓包工具中经常用到的工具,但是某些特定的场景下,还是有一些不便。

1、问题场景描述

比如抓包的一些参数被转码了,虽然Charles提供类似Base 64 Decode和默认的URL encode/decode,但是展示的时候可能仍然是转码状态。

右键的菜单中,只能找到Base 64 Decode,并不是我们需要的URL Decode。

又因为这个在实际的工作中太常用了,每次要查看信息都要拷贝出来,利用在线网站去解码,忒麻烦了。就想着能不能改造一下,增加一个decode的扩展功能出来。

2、调研

网上搜寻了大量的资料,都未找到类似的功能扩展插件,所有的内容都是关于使用和破解的。所以只能自己造轮子了。

 

查看一下应用目录,顺便结合网上一些破解的资料,了解到核心的功能和ui实现等都在charles.jar这个包中。所以只要修改这个jar就好。

3、逆向

Java层面的逆向相对来说还是非常容易的,市面上有各种各样现成的工具。我们随便使用一款JUI用具来查看一下。可以看到,项目虽然经过了混淆,但整体上结构还是非常清晰工整。这非常方便逆向工作的展开。

3.1、定位代码

我们主要目的是在右键菜单中增加一个URL Decode的功能。比猫画虎,原版提供给我们一个Base 64 decode的功能,那么可以仿照它这个,额外添加一个扩展功能。

 

在项目中搜索“Base 64”关键字,可以查看到相关的引用。

很快就能查找到一个叫base64DecodeAction地方的引用,跟进去查看。很明显,这里类继承了AbstractAction。开发人员只需为此抽象类创建子类并定义 actionPerformed 方法即可。

 

观察actionPerformed方法,可以看到这里就是实现Base64这个菜单选项功能的地方。

往上查找调用,可以在一个popview的类中找到创建的地方。

3.2、添加扩展功能

我们的需求很简单,只是在右键中添加一个类似的功能选项,因此没有必要动它的一些基类方法。

 

按照原版的功能实现一个抽象的CharlesUrlDecode类,并继承AbstractAction。里面定义一下actionPerformed方法,即添加URL decode解码。

 

然后分别创建CharlesUrlDecodeTextComponent、CharlesUrlDecodeText两个类并实现一下getBody方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#  CharlesUrlDecodeTextComponent类
public class CharlesUrlDecodeTextComponent extends CharlesUrlDecode{
    private final JTextComponent component;
 
    public CharlesUrlDecodeTextComponent(JTextComponent jTextComponent) {
        super(jTextComponent);
        this.component = jTextComponent;
    }
 
    public String getBody() {
        String selectedText = this.component.getSelectedText();
        return selectedText == null ? this.component.getText() : selectedText;
    }
 
}
 
#  CharlesUrlDecodeText类
public class CharlesUrlDecodeText extends CharlesUrlDecode{
 
    private final String text;
 
    public CharlesUrlDecodeText(String str) {
        super((Component) null);
        text = str;
    }
 
    public CharlesUrlDecodeText(String str, Component component) {
        super(component);
        text = str;
    }
 
    @Override
    public String getBody() {
        return this.text;
    }
}

3.3、展示结果

转码完成后,我们有两种方式展示:
1、替换掉原来的字符串
2、新pop一个窗口展示

 

为了避免影响原功能,所以新弹出一个窗口展示结果更为合适。查看完随时关掉,不影响源软件的任何使用。粗糙的写一个简陋的JFrame承载结果就好了。

 

当然,为了更加方便的查找结果,有必要增加一个查询功能。简单修改下,增加一个键盘的监听事件。因为只有只在mac上办公,所以设置了command + F的快捷方式作为入口。

 

在实现查找功能的时候,可以考虑增加上循环查找、区分大小写,高亮内容等等。网上有很多代码,这里就不啰嗦展示了。

3.4、替换&&编译文件

编译过程很简单,在项目中build一下即可生成所需要的class文件。期间要处理一些报错,跟着提示信息修改就行。然后使用jar uf命令,就可以将新增、修改的文件更新到jar包中。

4、实践

替换到原版的jar包后,就可以开始实践了。首先查看右键菜单,发现成功添加了URL decode一项。

 

点击菜单后,会将转码的结果用一个新的pop弹窗来展示。顺便高亮一下结果,让搜索更加的便利。

总结

到这里,我们就达到了预期的效果 - 给Charles添加URL Decode的扩展功能

 

整个过程相对来说比较顺利,一是java代码反编译较为容易,二是需求明确且比较简单。经过需求制定,到逆向分析,再到功能实现,中间也踩了一些小坑,不过都顺利的解决了。有了这个功能,就不必在网页工具和charles中来回切换了,大大地提高了工作效率。

 

其实在这个基础上,还可以定制一些其他的功能,例如自动解密或者composeNew时自动加密参数。

 

具体就是监听那个pannel的文本变化,当符合密文特征时,就走自定义的解密逻辑,然后更新下UI就可以了。加密也一样,可以在Excute按钮的actionPerform方法中,添加自定义加密逻辑的入口,从pannel中读取文本进行加密,并更新最终的参数值。


看雪侠者千人榜,看看你上榜了吗?

收藏
点赞0
打赏
分享
最新回复 (2)
雪    币: 4301
活跃值: 活跃值 (939)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
尐进 活跃值 2020-9-29 15:09
2
0
不错 学习了
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
YenKoc 活跃值 2020-10-19 16:44
3
0
学习了,强
游客
登录 | 注册 方可回帖
返回