前一段时间听说JDebugTool调试器不错,所以当下来试一试,结果提示过期了,同时要求访问网站进行购买,
当然不能花钱了,所以 Decompile this 。很快就发现,使用了混乱器,那么就要判断是由什么混乱器处理的,最后发现类文件中会包含 ZKM 字符串,所以推断使用了 Zelix Klass Master混乱器。同时反编译主文件,发现其中的字符串经过加密了,所以我的首要目的就是获取原字符串。
Zelix Klass Master 的字符串加密方式:
1、将当前类中的所有字符串生成一个字符串数组(静态),同时添加静态初始化快,对于每个字符串的加密方式如下 按照字符串索引生成动态的密钥(单个字符),进行异或代码如下
char chs [] = s.toCharArray();
char ch = 0;
for(int i =0;i<chs.length;i++)
{
switch(i%5)
{
case 0:
ch = 0x32; // 随机的
.......
case 4:
......
default:
........
}
chs[i] ^= ch;
}
String newString = new String(chs);
发现主类调用了 com.debug.jdebugtool.a.qv
通过反编译发现这个是 JDebugTool 的主界面,
同时解密 字符串 发现过期提示 也包含在 该类中
所以搜索调用该字符串的位置,进行逆向分析
发现 private final int g(String serial) private final int a(String) 进行了关键的运算
同时类中也包含
int i1 = g(w);
int j1 = a(w);
if( i1 != j1)
{
// 显示出错信息
}
同时分析第一个 g()方法 其代码如下:
private final int getKey1(String s) // 为了便于理解,我把它命名为 getKey1(); 由于它与a(w)进行比较所以只要研究 a的方法 同时 把getKey1()的返回制作为参数进行逆向操作即可
{
int i = 0;
int j = 12345;
int l = 123;
int i1 = s.length();
for(int j1 = 0; j1 < i1; j1++)
{
char c = s.charAt(j1);
int k1 = (j1 + 2) % 4;
int l1 = c << k1 * 8;
l += (j1 + 3) * c;
i ^= l1;
j += c;
}
i ^= j;
i ^= j << 16;
i ^= l;
i ^= l << 16;
i ^= 0xa52d9c37;
return i;
}
如下就是 a 的代码 我命名为 String getKey2(int key1)
private final String getKey2(int i) // 这段代码我经过理解之后,重新翻译成如下代码
{
String tmp = Integer.toHexString(i); // 获取key1 的十六进制字符串
StringBuffer sb1 = new StringBuffer(tmp);
StringBuffer sb2 = sb1.reverse(); // 倒序
tmp = sb2.toString();
sb1 = null;
return tmp;
}
同时 JDebugTool 还要求 用户的注册信息中包含 如下两个字符串内容
private static String type = "Academic";
private static String flag = "Purchase";
同时要求 user.home/jdebugtool/ 目录下要有 jdebugtool.lic 文件
现在我为大家提供一个内容:
jdebugtool.lic的内容如下 字符串结尾不可以包含回车
AAAAAAAAAAAAAAAAAvhly[FR] has cracked this Tools PurchaseAcademic17ee037b
对于程序对话框中的License Info显示为
vhly[FR] has cracked this Tools Purchase
Gen by vhly[FR] At 2006/03/15