1. 程式人生 > >人工智慧計算器AI Calculator 3.3.0 詳細破解思路&教程

人工智慧計算器AI Calculator 3.3.0 詳細破解思路&教程

人工智慧計算器AI Calculator 3.3.0 詳細破解思路&教程

【文章標題】:人工智慧計算器AI Calculator 3.3.0 詳細破解思路&教程
【文章作者】: Ericky
【作者郵箱】: [email protected]
【下載地址】: 附件附上
【保護方式】: 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; }

當啟動程式後,進入授權頁面點選按鈕後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的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中的這幾句:

 <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