好吧, 来写下第二个
app2
一个Java写的可以管理bugzilla的桌面客户端程序, 用起来觉得比网页方便很多.
由于是Java的, 反编译就成了必然要走的路, 不过反编译后, 就会发现, 这个程序重度混淆过, 让我一度惊讶于这玩意竟然还可以正常执行.
程序本身默认会有一个试用的license, 而即使到最后, 我也没能挖清其license的全部逻辑, 反正大概, 可能是用了3DES等等.
反正我的目的也只是用而已, 因此就不求甚解了, 找到校验过期的地方, 修改为永不过期好了.
实际, 相关逻辑并不是在app2.java, 而是在一个base.java内, 找错了可就没东西了哦.
另外由于不同版本的混淆名会有差别, 因此, 每次都grep去找好了, 不要直接用这些现成的名.
grep -rn "ExpirationDate" * apk.java:11:/* 12 */ public static final apk d = new apm("ExpirationDate"); grep -rn "apk\.d" * eii.java:117:/* 172 */ localObject1 = (Date)paramapf.b(apk.d); fku.java:63:/* 66 */ Object localObject = (Date)paramapf.b(apk.d); fky.java:90:/* 91 */ Date localDate = (Date)this.c.b(apk.d); ftu.java:38:/* 41 */ if ((paramapk == apk.d) && (this.b != null)) fvn.java:42:/* 59 */ Date localDate = (Date)this.d.b(apk.d); fvt.java:78:/* 87 */ localDate = (Date)localapf.b(apk.d); fvz.java:80:/* 253 */ Object localObject = (Date)paramapf.b(apk.d); fxi.java:242:/* 292 */ Date localDate = (Date)this.l.b(apk.d); fxi.java:391:/* 445 */ Date localDate = (Date)this.l.b(apk.d); fxi.java:442:/* 502 */ Date localDate = (Date)this.l.b(apk.d);
从中我们可以看出一些小的端倪, 挨个检查后, 我们把目光停留在了”ftu.java:38:/* 41 */ if ((paramapk == apk.d) && (this.b != null))”上, 而经过验证, 这里就是特殊之处了. 当发现是要获取过期日期时, 通过后面的return来将之前得出的过期日期返回, 由后续的逻辑进行对比.
反正我们的目的只是永久试用, 在这里返回一个很遥远的日期即可.
之后就是尝试替换class文件。我了解的方法只有重编译, 尝试后发现缺少某个库, 只好去Google. 好在找到一个版本, 虽看似第三方所做, 但至少能顺利编译. 至此, app2也算搞定了.
ps: 后找到一篇做同样事情的文章, 受其启发, 将过期时间调为一动态值. 这样似乎比固定时间好些.
pps: 不过有一个问题, 修改后的程序直接运行则Help菜单不可访问, 而直接运行Jar就有. 很奇怪.