zoukankan      html  css  js  c++  java
  • 人工智能计算器AI Calculator 3.3.0 具体破解思路&教程

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

    【文章标题】:人工智能计算器AI Calculator 3.3.0 具体破解思路&教程
    【文章作者】: Ericky
    【作者邮箱】: hy_xiaoyu@126.com
    【下载地址】: 附件附上
    【保护方式】: 360加固
    【作者声明】: 主要记录自己的学习过程!欢迎交流学习

    0x1脱壳

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

    0x2破解

    先安装程序,看看错误提示,所谓知己知彼百战不殆正是如此 如图所看到的:
    这里写图片描写叙述
    点击后会弹出授权失败的错误提示。
    此时我想应该有非常多同学会第一时间想到搜索字符串,既然这样,我们来搜索一下字符串例如以下,支付失败的字符串我们是搜索不到的,可是能搜到这个:
    图片2
    这样就能够定位到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("支付成功!授权已生效,您如今可使用付费功能了。

    您的付费时间为: " + v6_1 + " 您的授权期限为: " + 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

  • 相关阅读:
    ehcache 的 配置文件: ehcache.xml的认识
    Hibernate的二级缓存(SessionFaction的外置缓存)-----Helloword
    QBC检索和本地SQL检索
    HQL的检索方式
    HQL的第一个程序
    Ubuntu Error: No module named 'apt_pkg' 怎么办?
    Linux 后台运行python .sh等程序,以及查看和关闭后台运行程序操作
    ubuntu install redis/mongo 以及 监控安装
    Mac 上的 redis
    Mac 解决硬盘插入不能写的问题
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/8378162.html
Copyright © 2011-2022 走看看