【文章标题】:人工智能计算器 AI Calculator 3.3.0 详细 破解思路 &教程
【文章作者】: Ericky 具体的脱壳去看看以前的一些文章,此篇文章主要讲破解部分,壳就略过了 0x2破解 先安装程序,看看错误提示,所谓知己知彼百战不殆正是如此 如图所示:
点击后会弹出授权失败的错误提示。 此时我想应该有很多同学会第一时间想到搜索字符串,既然这样,我们来搜索一下字符串如下,支付失败的字符串我们是搜索不到的,但是能搜到这个: 这样就可以定位到package longbin.helloworld;中的hn类 hn类中一共有几个分支 一一来看一下: 分支1 --arg11.what == 111111的分支 [Java] 纯文本查看 复制代码 if(arg11.what == 111111) {
this.a.d.dismiss();
if(this.a.f) {
v0 = this.a.getSharedPreferences("mySharedPreferences", 0).edit();
v0.putString("alipay_appid", m.e(this.a.p));
v0.commit();
v0 = PreferenceManager.getDefaultSharedPreferences(this.a).edit();
v0.putString("WWxoT2JnPT0=", hj.c(this.a.p));
v0.putBoolean("isDefaultTheme", true);
v0.putString("font_size", "24");
v0.commit();
this.a.c.setEnabled(false);
new AlertDialog$Builder(this.a).setTitle(v2).setMessage(v4.getString(2131230970)).setPositiveButton(
v4.getString(v9), new ho(this)).create().show();
return;
}
v0 = PreferenceManager.getDefaultSharedPreferences(this.a).edit();
v0.putBoolean("isDefaultTheme", false);
v0.putString("font_size", "28");
v0.commit();
new AlertDialog$Builder(this.a).setTitle(v2).setMessage(v4.getString(2131230972)).setPositiveButton(
v9, new hp(this)).create().show();
return;
} 当启动程序后,进入授权页面点击按钮后Handler会处理这个分支 分支2 --arg11.what == 1001的分支 [Java] 纯文本查看 复制代码 if(arg11.what == 1001) {
ik v5 = new ik(arg11.obj);
v5.a();
if(!v5.d) {
return;
}
if(this.a.p.equals(this.a.q)) {
v0 = this.a.getSharedPreferences("mySharedPreferences", 0).edit();
v0.putString("alipay_appid", m.e(this.a.p));
v0.commit();
SharedPreferences$Editor v5_1 = PreferenceManager.getDefaultSharedPreferences(this.a)
.edit();
v5_1.putString("WWxoT2JnPT0=", hj.c(this.a.p));
v5_1.putBoolean("isDefaultTheme", true);
v5_1.putString("font_size", "24");
v5_1.commit();
this.a.c.setEnabled(false);
int v6 = Integer.valueOf(this.a.h[this.a.o]).intValue();
int v0_1 = v6 == 4 ? 1 : 0;
if(v6 == 8) {
v0_1 = 2;
}
SimpleDateFormat v3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date v1 = new Date();
String v6_1 = v3.format(v1);
if(this.a.r != null && !"".equals(this.a.r)) {
try {
v1 = v3.parse(this.a.r);
}
catch(ParseException v1_1) {
v1_1.printStackTrace();
v1 = ((Date)v2);
}
if(v1 != null) {
v1.setYear(v0_1 + v1.getYear());
}
this.a.r = v3.format(v1);
}
else {
v1.setYear(v0_1 + v1.getYear());
this.a.r = v3.format(v1);
}
v5_1.putString("V2xob2QyRllTbXhhUmprd1lWY3hiQT09", hj.c(this.a.r));
v5_1.commit();
new AlertDialog$Builder(this.a).setTitle(v2).setMessage("支付成功!授权已生效,您现在可使用付费功能了。\n您的付费时间为: "
+ v6_1 + "\n您的授权期限为: " + this.a.r).setPositiveButton(v4.getString(v9), new
hq(this)).create().show();
return;
}
new AlertDialog$Builder(this.a).setTitle(v2).setMessage(v4.getString(2131230971)).setPositiveButton(
v4.getString(v9), new hr(this)).create();
return;
} 这个就是付费成功的分支,经过对2个分支的对比,可以很清楚的看到以及知道这几句是功能恢复的关键代码: 其中有个bool值this.a.f就是整个程序的关键。
可以在这里直接爆破给this.a.f一个不等于0的值也能成功。 但是为了防止此值在其他地方也有调用,我们还是继续找源头。 找到PayActivity的authority按钮如下为this.c: 这里对this.a.f进行了赋值false,更加肯定了我们的判断 跟入ic类:
如图,起了一个线程id类,继续跟进,在.class final Llongbin/helloworld/id 类增加一句 const v1, 0x1 达到对f的赋值:f其实就是IsPayUser. 这里的SendEmptyMessage(111111);也是与前面的分析相呼应。 这样的话,程序就被破解了。最重要的是流程大家都清楚了,不是糊里糊涂的碰对的,这才是提升水平的关键。 0x3 过重启验证 既然重启验证,那就定位到HelloWorldActivity Class吧 一路往下找,到这里就比较可疑了: 为什么说他可以,如果用心的人就可以知道,在前面破解分析的分支2里面的支付成功,也是取了时间的。这里就应该是取时间来判断是不是真正的注册了。或者说是用来验证用户的付费是不是过期了,恰好把一些破解变得不够完美了。
如果你没注意到这个时间,那也不要紧。这2句代码也足够了: this.cf.putBoolean("isDefaultTheme", false); this.cf.commit(); 之前授权成功的时候执行的应该是这样的: this.cf.putBoolean("isDefaultTheme", true); this.cf.commit(); 所以只要绕过这个地方就可以达到过重启验证的目的了。 方式就是启动这个类中的标签。当然 你也可以修改跳转,总之,达到目的就行了。 0x4 去广告 删除androidmanifest.xml中的这几句: [Java] 纯文本查看 复制代码 <meta-data android:name="UMENG_APPKEY" android:value="541435b6fd98c50ae307da98"/>
<meta-data android:name="UMENG_CHANNEL" android:value="baidu"/>
<meta-data android:name="COOLCHUAN_KEY" android:value="e47a7d143004499ea30fd6a22146b59a"/>
<service android:name="com.umeng.update.net.DownloadingService" android:process=":DownloadingService"/>
<activity android:name="com.umeng.update.UpdateDialogActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar"/> 至此程序就完美破解了。 总结一下,破解程序应该修改越少越完美,既减少了你的工作量与出错率,又保证了程序功能的完整性。有的程序不难,但是需要你的耐心,认真破解一个比你随意破解多个更能提升你的实力。 2015.7.13 By Ericky
PS:码字插图很辛苦。。希望不要吝惜你手上的热心与CB (*^__^*)
|