前言
Charles是抓包工具中經常用到的工具,但是某些特定的場景下归苍,還是有一些不便用狱。
1、問題場景描述
比如抓包的一些參數(shù)被轉碼了拼弃,雖然Charles提供類似Base 64 Decode和默認的URL encode/decode夏伊,但是展示的時候可能仍然是轉碼狀態(tài)。
右鍵的菜單中吻氧,只能找到Base 64 Decode溺忧,并不是我們需要的URL Decode。
又因為這個在實際的工作中太常用了盯孙,每次要查看信息都要拷貝出來鲁森,利用在線網(wǎng)站去解碼,忒麻煩了振惰。就想著能不能改造一下歌溉,增加一個decode的擴展功能出來。
2骑晶、調研
網(wǎng)上搜尋了大量的資料痛垛,都未找到類似的功能擴展插件,所有的內容都是關于使用和破解的桶蛔〕淄罚看來只能自己造輪子了。
查看一下應用目錄仔雷,順便結合網(wǎng)上一些破解的資料蹂析,了解到核心的功能和ui實現(xiàn)等都在charles.jar這個包中舔示。
3、逆向
首先看一下百科詞條關于jar包的介紹电抚。
百度百科詞條:
在軟件領域惕稻,JAR文件(Java歸檔,英語:Java Archive)是一種歸檔文件喻频,以ZIP格式構建缩宜,以.jar為文件擴展名。
通常用于聚合大量的Java類文件甥温、相關的元數(shù)據(jù)和資源(文本锻煌、圖片等)文件到一個文件,以便開發(fā)Java平臺應用軟件或庫姻蚓。
那么Java層面的逆向相對來說還是比較容易的宋梧,市面上有各種各樣現(xiàn)成的工具。我們隨便使用一款JUI用具來隨機查看一下狰挡。
可以看到捂龄,項目經過了混淆,但整體上結構還是非常清晰工整加叁。這非常方便逆向工作的展開倦沧。
3.1、定位代碼
我們主要目的是在右鍵菜單中增加一個URL Decode的功能它匕。比貓畫虎展融,原版提供給我們一個Base 64 decode的功能,那么可以仿照它這個豫柬,額外添加一個擴展功能告希。
在項目中搜索“Base 64”關鍵字,可以查看到相關的引用烧给。
很快就能查找到一個叫base64DecodeAction地方的引用燕偶,跟進去查看。很明顯础嫡,這里類繼承了AbstractAction指么。
百度百科AbstractAction詞條
此類提供 JFC Action 接口的默認實現(xiàn)。它定義了一些標準行為榴鼎,比如 Action 對象屬性(icon涧尿、text 和 enabled)的 get 和 set 方法。開發(fā)人員只需為此抽象類創(chuàng)建子類并定義 actionPerformed 方法即可檬贰。
觀察actionPerformed方法,可以看到這里就是實現(xiàn)Base64這個菜單選項功能的地方缺亮。
往上查找調用翁涤,可以在一個popview的類中找到創(chuàng)建的地方桥言。
3.2、添加擴展功能
我們的需求很簡單葵礼,只是在右鍵中添加一個類似的功能選項号阿,因此沒有必要動它的一些基類方法。
按照原版的功能實現(xiàn)一個抽象的CharlesUrlDecode類鸳粉,并繼承AbstractAction扔涧。里面定義一下actionPerformed方法,即添加URL decode解碼届谈。
然后分別創(chuàng)建CharlesUrlDecodeTextComponent枯夜、CharlesUrlDecodeText兩個類并實現(xiàn)一下getBody方法。
# 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承載結果就好了。
當然橡娄,為了更加方便的查找結果诗箍,有必要增加一個查詢功能。簡單修改下瀑踢,增加一個鍵盤的監(jiān)聽事件扳还。因為只有只在mac上辦公,所以設置了command + F的快捷方式作為入口橱夭。
在實現(xiàn)查找功能的時候氨距,可以考慮增加上循環(huán)查找、區(qū)分大小寫棘劣,高亮內容等等俏让。網(wǎng)上有很多代碼,這里就不啰嗦展示了茬暇。
3.4首昔、替換&&編譯文件
編譯過程很簡單,在項目中build一下即可生成所需要的class文件糙俗,然后使用jar uf命令勒奇,就可以將文件更新到jar包中。
4巧骚、實踐
替換到原版的jar包后赊颠,就可以開始實踐了格二。首先查看右鍵菜單,發(fā)現(xiàn)成功添加了URL decode一項竣蹦。
點擊該選項后顶猜,會將轉碼的結果用一個新的pop彈窗來展示。
額外增加的查找功能痘括,順便高亮一下結果长窄,讓所搜更加便利。
總結
到這里纲菌,我們就達到了預期的效果 - 給Charles添加URL Decode的擴展功能挠日。
整個過程相對來說比較順利,一是java代碼反編譯較為容易驰后,二是需求明確且比較簡單肆资。經過需求制定,到逆向分析灶芝,再到功能實現(xiàn)郑原,中間也踩了一些小坑,不過都順利的解決了夜涕。有了這個功能犯犁,就不必在網(wǎng)頁工具和charles中來回切換了,大大地提高了工作效率女器。
從此次經歷中還看到一些安全方面的問題酸役,即在搜索資料的過程中,發(fā)現(xiàn)網(wǎng)絡上充斥著大量破解相關的內容驾胆。誰也不知道在這些破解的文件中涣澡,是否包含了惡意的代碼在其中。
因此強烈建議從官方網(wǎng)站下載安裝文件丧诺,并購買激活碼入桂。