开始尝试对charles进行破解。
查看程序包中的内容,发现主体是Java写的。【charles.jar】
开始按照惯用的破解思路,找关键点。
1, 先找注册密钥的对话框
2. 顺藤摸瓜,找到注册按钮的事件
代码分析:从结果上看,主要看FwRs2的值. 如果为null 则表示注册成功。 不为空则弹出提示框。
所以突破口是: Bvcn.FwRs(String,String) 方法。
3。 Bvcn.FwRs的方法:
代码分析,只要new Bvcn不抛异常,那么就会返回null, 也就是注册成功。
4. Bvcn的构造函数:
代码分析: 这里有2个关键方法分别是 boolean FwRs(int) 和 GSXJ(String, String, i=4)
5. 找到这两个方法:
7, 到这里了,我看到了一个几个密钥: 7055ce2f8cb4f9405f, 5bae9d8cdea32760ae 等。
它是过滤了这些密钥。决定尝试修改代码,让其不过滤这个代码。 也就是修改方法equalsIgnoreCase调用改为equals
8. 使用jsclasslib工具查看Bvcn.class文件找到GSXJ方法。
方法的索引是16。
equalsIgnoreCase的索引是178:
equals方法的索引是177
9,打开010Editor工具,编辑Bvcn.class文件。
10. 执行命令, 修改原始jar包中Bvcn.class的逻辑
jar -uvf charles.jar -C charles/ com/xk72/charles/Bvcn.class
11. 检查是否逻辑修改成功, JADX工具重新加载jar包看看:
可以看到已经修改成功了。
12, 替换jar包。
13. 尝试注册:
14. 很遗憾没有生效:
15,决定从修改字符串方向尝试破解。 177还原成178. 然后修改原始字符串。 将7改成了8.
16. 再次注册:
17, 再次失败。 弹出的错误结果和14步一样。
这个失败让我确定了一个事情, 就是异常信息是有红色框内抛出的:
18. 此时通过反向推理,this.Wczh = 1 就应该离成功不远了。 修改代码:
找到原始代码的位置:
对应二进制数据位置
大概在1EB0位置。
因为136是l2i 最终还是要转换为int. 所以直接 iconts_1 即可。 对应编码4. 将136修改为4. 然后将其余的移位操作全部改为0
最终结果如图:
最后修改:
boolean FwRs(long) 方法, 强制返回true
修改前:
找到方法15, 然后强制返回true。
经过若干次尝试,都失败了, 决定换一种思路,自己实现一个Bvcn文件。
========================================
package com.xk72.charles; public final class Bvcn { private static Bvcn GSXJ = null; private String Gwbn; private boolean InuZ; static { GSXJ(); } public Bvcn() { this.InuZ = true; this.Gwbn = "dzq"; } public static String FwRs(String str, String str2) { return null; } public static boolean FwRs() { return true; } public static void GSXJ() { GSXJ = new Bvcn(); } public static java.lang.String InuZ() { return "dzqhhh"; } }
生成class文件: javac -g:none Bvcn.java
替换class文件:jar -uvf charles.jar -C charles/ com/xk72/charles/Bvcn.class
替换charles.jar包,即破解完成。
效果图: