人工智能计算器AI Calculator 3.3.0 具体破解思路&教程

【文章标题】:人工智能计算器AI Calculator 3.3.0 具体破解思路&教程

【文章作者】: Ericky

【作者邮箱】: hy_xiaoyu@126.com

【下载地址】: 附件附上

【保护方式】: 360加固

【作者声明】: 主要记录自己的学习过程!欢迎交流学习

0x1脱壳

具体的脱壳去看看曾经的一些文章,此篇文章主要讲破解部分,壳就略过了

0x2破解

先安装程序,看看错误提示,所谓知己知彼百战不殆正是如此 如图所看到的:



点击后会弹出授权失败的错误提示。

此时我想应该有非常多同学会第一时间想到搜索字符串,既然这样,我们来搜索一下字符串例如以下,支付失败的字符串我们是搜索不到的,可是能搜到这个:



这样就能够定位到package longbin.helloworld;中的hn类

hn类中一共同拥有几个分支 一一来看一下:

分支1 –arg11.what == 111111的分支

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;
}

当启动程序后,进入授权页面点击button后Handler会处理这个分支

分支2 –arg11.what == 1001的分支

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的authoritybutton例如以下为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中的这几句:

 <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

最新文章

  1. MonoDevelop 4.2.2/Mono 3.4.0 in CentOS 6.5 安装笔记
  2. Delphi XE5 支持的Android 版本
  3. Theano在windows下的安装及GPU加速
  4. wex5 实战 用户点评与提交设计技巧
  5. PowerDesigner15(16)在生成SQL时报错Generation aborted due to errors detected during the verification of the mod
  6. RX编程笔记——JavaScript 获取地理位置
  7. Android 之夜间模式(多主题)的实现
  8. 建立一个属于自己的AVR的RTOS
  9. CentOS最小化安装后启用无线连接网络
  10. 函数响应式编程及ReactiveObjC学习笔记 (二)
  11. dataTable tab栏切换时错位解决办法
  12. 把玩Pencil项目之编译并运行
  13. sublime插件不能使用,提示plugin_host has exited unexpectedly
  14. ARP【地址解析协议】理解
  15. npm install权限问题,报错:permission denied。
  16. Knockout.Js官网学习(options绑定)
  17. SSH 连接很慢
  18. uchome 缓存生成
  19. Nginx实战入门教程
  20. 超慢速移动动画使用CSS3实现流畅效果

热门文章

  1. 昼猫笔记 从此告别复杂代码--JavaScript
  2. which---查找并显示给定命令的绝对路径
  3. jQuery判断字符串是否含有中文字符
  4. poj2243 &amp;amp;&amp;amp; hdu1372 Knight Moves(BFS)
  5. linux 进程等待 wait 、 waitpid
  6. Android与webserver数据交互编程---3网络爬虫项目实现虚拟浏览器的jsp后台执行
  7. 关于ajax访问express服务器的跨域问题
  8. 79.QT解决迷宫问题(面向过程与面向对象)
  9. 玲珑学院 1050 - array
  10. JOISC 2017 Day1 T3 烟花棒