南X周易系列逆向思路

天天見聞 天天見聞 2024-10-12 科技 閱讀: 9
摘要: 前幾天在咱們論壇發了一篇x奧周易系列軟件逆向思路\更新了視頻演示,反響還不錯。八字、六爻、風水、奇門、姓名、擇吉、合婚,多種平台上應用,不斷完善!批八字算命玄空風水綜合排盤六爻斷卦奇門适甲專業起名八字合婚擇吉程序金口訣八字用神南方萬年曆家居風水六爻排盤八字排盤4.支持系統

更新

填坑|南X周易程序超出試用的解決辦法

(出處: 吾愛破解論壇)

1.緣起

前幾天在咱們論壇發了一篇x奧周易系列軟件逆向思路\更新了視頻演示,反響還不錯。然後正好找到了一款競品,就是下面這位了。其實這篇文章從發完X奧就一直在醞釀了,但是技術不過關,一直沒達到完美的欺騙效果。今天順藤摸瓜就摸到了一個關鍵點,改一下就好。如果不想看思路的就直接看第6部分,如果想看思路的就往下翻翻,看完全文,不過思路挺長的,但是如果您像我一樣,也是小白,看完還是有收獲的。

2.軟件介紹

八字、六爻、風水、奇門、姓名、擇吉、合婚,多種平台上應用,不斷完善!

3.軟件列表(版本在支持系統裡面有區分)

練手包下載地址在附件裡

以下安卓手機軟件都可免費試用30次。

當然,跟着我做完以後就沒有使用限制了

批八字算命玄空風水綜合排盤六爻斷卦奇門适甲專業起名八字合婚擇吉程序金口訣八字用神南方萬年曆家居風水六爻排盤八字排盤4.支持系統

V1.73,适用于安卓系統4.0版至安卓7.11版。

V1.81,适用于安卓8.0及以上版本。

5.逆向程序

MT管理器

6.害,我都不好意思寫标題

方法很簡單,MT進入安裝包,DEX++編輯器打開classes.dex文件,打開An_xxxxxActivity,搜索add,第一個結果如下:

add-int/lit8 v0,v0,0x1

删除這一行,一路保存後編譯、簽名。

好了,破解完了。

說句題外話,兄弟們,看着玩意沒用,這句add-int/lit8 v0,v0,0x1是我找出來的,不是你。就像我能按照小夜大佬交代的查找ChkNum來欺騙X奧系列軟件一樣。換成這個系列我又啥都不會了。所以你隻看這句價值不大,想學點東西還得看下面的思路。

至于成品嘛,這麼簡單你還好意思要成品?

7逆向過程

以“八字排盤 V1.73”為例,首先安裝原版軟件點完試用的30次,從第31次開始,則無法正常排盤,會引導注冊。如圖

我們點擊注冊,然後會彈出注冊頁面

然後有以下幾種情景:

    - 點擊“确定”,提示“您還沒有輸入注冊碼”
    - 随便輸入注冊碼,點擊“确定”,提示“您輸入的注冊碼不對”
    - 點擊“退出”,則返回軟件主頁面 

好了,直接進到MT管理器裡,打開apk文件,使用DEX編輯器++打開classes.dex

随便浏覽一下類列表,有一個“activity_register”類。

然後點擊搜索,搜索上面幾個關鍵詞。

比如搜索“注冊”可以看到以下結果

我們點擊“您已經注冊了本程序”這一條,看到如下代碼:

    if-nez v1, :cond_96
    sget-boolean v1, Lcom/nfbazi/PaiBazi/a/a;->f:Z
    if-eqz v1, :cond_aa
    :cond_96
    const v1, -0xffff01
    invoke-virtual {v0, v1}, Landroid/widget/TextView;->setTextColor(I)V
    const-string v1, "您已經注冊了本程序。"
    invoke-virtual {v0, v1}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V
    const-string v0, "************"
    invoke-virtual {v6, v0}, Landroid/widget/EditText;->setText(Ljava/lang/CharSequence;)V
    const/4 v0, 0x0
    invoke-virtual {v6, v0}, Landroid/widget/EditText;->setEnabled(Z)V
    :cond_aa
    return-void
.end method

這裡面有兩條判斷:

    if-nez v1, :cond_96
    if-eqz v1, :cond_aa

關于Smali語法的解讀,我們可以參考這篇文章:

if-eq 如果等于

if-ne 如果不等于

if-lt 如果小于

if-le 如果小于等于

if-gt 如果大于

if-ge 如果大于等于

if-eqz 如果等于零

if-nez 如果不等于0

if-ltz 如果小于零

if-lez 如果小于等于零

if-gtz 如果大于零

if-gez 如果大于等于零

————————————————

版權聲明:本文為CSDN博主「Ceryool」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鍊接及本聲明。

原文鍊接:

我們現在知道了

if-nez v1, :cond_96 #如果v1不等于0,就執行cond_96的代碼
if-eqz v1, :cond_aa #如果v1等于0,就執行cond_aa的代碼

我們通過第一個代碼塊可以發現cond_96的代碼就是包含"您已經注冊了本程序。"的那一堆,cond_aa返回空,就是什麼都不返回。

可以推斷一下,未注冊的情況下,v1應該是0,注冊後,v1就不是0了,此時返回cond_96,也就是"您已經注冊了本程序。"

那我們就欺騙一下,讓未注冊情況下,也能返回"您已經注冊了本程序。"有兩種途徑可以實現此目的

    - 修改if-nez v1, :cond_96為if-eqz v1, :cond_96
    - 修改if-eqz v1, :cond_aa為if-eqz v1, :cond_96

修改之後,我們可以看到效果如圖

但是經過測試之後我發現,這隻是個美化效果,也就是說,我們隻是更改了外觀,并沒有欺騙軟件以達到注冊的目的

好,接下來接着操作。

回到MT管理器,先反編譯一下AndroidManifest.xml,這裡是軟件權限,我感覺給它聯網權限不太好,那麼删除android.permission.INTERNET就行了

......
    
    
    
    
    
    
    
    
    
    
    
    
    

下面是軟件的Activity

   
        
            
      
                
                
            
        
   
         
         
         
        
        
        
        
        
        
        
         
        

看完之後,接着使用DEX編輯器++打開classes.dex,剛才咱們修改了activity_register,并且發現這裡面并不是驗證是否激活的關鍵所在。

然後看一眼An_PaiBaziActivity,畢竟這是主界面,信息會多一些。Smali可讀性比較差,我們轉化成Java代碼,可是代碼有很多,看哪?咱們在一開始測試過,試用次數沒了之後,再使用就會跳轉到軟件續用界面,那我們就搜一搜什麼條件下跳轉,搜索我們在AndroidManifest.xml看到的RuanjianXuyong,然後我們發現就一處可以找到:

    public void b() {
        Intent intent = new Intent();
        intent.setClass(this, RuanjianXuyong.class);
        startActivity(intent);
    }

這句代碼是什麼意思呢。因為我沒學過Java。所以我也沒看明白,不過我清楚,肯定就是從這裡跳轉到軟件續用界面去了。

我們不想見到軟件續用界面,因此就不能讓它intent.setClass(this, RuanjianXuyong.class);

所以,我就興緻勃勃的在Smali代碼中定位RuanjianXuyong

.method public b()V
    .registers 3
    new-instance v0, Landroid/content/Intent;
    invoke-direct {v0}, Landroid/content/Intent;->()V
    const-class v1, Lcom/nfbazi/PaiBazi/RuanjianXuyong;
    invoke-virtual {v0, p0, v1}, Landroid/content/Intent;->setClass(Landroid/content/Context;Ljava/lang/Class;)Landroid/content/Intent;
    invoke-virtual {p0, v0}, Lcom/nfbazi/PaiBazi/An_PaiBaziActivity;->startActivity(Landroid/content/Intent;)V
    return-void
.end method

用我這腦子想,就是,我不想要哪一行就直接注釋掉哪一行,于是我在 const-class v1, Lcom/nfbazi/PaiBazi/RuanjianXuyong;前面加了一個#,然後心滿意足的轉進Java看了一眼,注釋錯了,然後我返回Smali代碼,又把 invoke-virtual {v0, p0, v1}, Landroid/content/Intent;->setClass(Landroid/content/Context;Ljava/lang/Class;)Landroid/content/Intent;注釋掉了,結果還是不行。

我不禁陷入了深思!我為啥要注釋掉它?因為我不想見到軟件續用啊;那我想見到什麼?肯定是排盤結果啊!那我直接把RuanjianXuyong替換成webshow不就行了嗎?!我可真是個小機靈鬼,說幹就幹。

然後我就把這行代碼改成了:

    const-class v1, Lcom/nfbazi/PaiBazi/webshow;

一路保存,反編譯,覆蓋安裝,排個八字

嘿嘿,劇本好像有點不一樣,軟件試用界面是沒了,排盤界面也出來了,可是内容去哪了?玩呢?氣得我腦瓜子嗡嗡的,算了,先不破了,看看這軟件哪裡還有驗證的地方。。咋這麼麻煩呢?

這還有一個顯示命例,按鈕,點進去一看就是個檔案夾的功能,可以時不時的把保存的案例拿出來複盤。然後我随便點了一個,想要看看複原效果,結果又看到這個熟悉的面孔了:

事情進行到這裡,我又要開始深思了

嗯~總的,我好像嗅到成功的味道了,突破點在試用次數上!試用期間功能不受限制,說幹就幹。成功我來了。

痛定思痛、細心研讀An_PaiBaziActivity的Java代碼(我能看懂?其實我就是看看我認識哪幾個單詞)

147行:如果我沒猜錯的話,trytimes就是試用次數吧,我真是個小機靈鬼

 private void e() {
        this.h = getSharedPreferences("trytimesxml", 0);
        a.k = Integer.parseInt(this.a.b(this.h.getString("tms", this.a.a("65AB24201"))).substring(7, 9));
        if (a.k < 32) {
            a.k++;
        }
        this.h.edit().putString("tms", this.a.a("65AB242" + String.valueOf(h.e(a.k)))).commit();
        a.d("trytimesxml");
        a.a("trytimesxml.xml", "system.out");
    }

看完之後,啊,這段代碼就是。。嗯,,那啥的、、是吧。(球都沒看懂)

不過,這段代碼過于眼熟

        if (a.k < 32) {                /*如果a.k < 32,就執行a.k++*/
            a.k++;                        /*a.k++ 就是 a.k = a.k + 1*/
        }                                        /*a.k = a.k + 1就是說a.k每次加1*/

我混迹吾愛數載,一看這貨就是在計數,沒猜錯的話,應該是這樣的:

if(使用次數 < 32) {
    使用次數++;
}
/*“使用次數”在具體程序中會對應不一樣的變量名,表示的都是使用次數的意思*/

然後我又開始我的腦洞了:

啊哈,直接把使用次數++;删掉不就行了,我真是個小機靈鬼。當然上面是java代碼,咱不能修改,那咱就去改Smali代碼,怎麼定位呢?反正我看不懂這東西,翻也不見得能翻到,先去網上沖一會兒浪:

ARM常用指令

ADD 加指令

SUB 減指令

STR 把寄存器内容存到棧上

LDR 把棧上内容載入一個寄存器中

.W 是一個可選指令寬度說明符。不會影響為此指令的行為,它隻是确保生成32位指令。

BL 執行函數調用,并把使lr指向調用者的下一條指令,即函數的返回地址

BLX 同上,但是在ARM和thumb指令集間切換

CMP 指令進行比較兩個操作數的大小

你可能想看:
其他相關
缺火缺土的男孩名字

缺火缺土的男孩名字

作者: 天天見聞 時間:2024-10-12 閱讀: 1
有哪些名字适合缺火缺土的男孩呢?缺火缺土有寓意的男孩名字如果孩子的五行缺失任意一行,不進行補齊的話,那麼可能會影響到到寶寶的運勢,影響孩子的一生發展,接下來是小編整理的缺火缺土有寓意的男孩名字。缺火缺土的男孩名字很多的父母知道在給孩子起名的時候要看五行,那麼如何孩子的五行缺火缺土該如何起名呢?...
什麼是羊刃?

什麼是羊刃?

作者: 天天見聞 時間:2024-10-12 閱讀: 2
男逢傷官七殺羊刃,骨肉親友傷情。年支七殺帶羊刃,雙親性暴,不得财福。劫财羊刃,傷妻破财。傷官羊刃帶七殺,名标金榜。羊刃極喜偏官,剝平禍亂。羊刃傷官逢沖戰,性兇惡而與人少和。男逢羊刃,身弱遇之為奇。如日柱有庚戌,他柱有辛酉,為互換羊刃,皆兇象也。唯五陰幹見傷官在幹,與羊刃同禍。...
喜用五行之行業

喜用五行之行業

作者: 天天見聞 時間:2024-10-12 閱讀: 1
當一個人的八字用神,或者喜神為金的時候,那他就做屬金的行業就會最順暢,最好運!當一個人八字用神,或者喜神為木的時候,那他就做屬木的行業就會最順暢,最好運!當一個人八字用神,或者喜神為土的時候,那他就做屬土的行業就會最順暢,最好運!...
身弱之人,如何應對?

身弱之人,如何應對?

作者: 天天見聞 時間:2024-10-12 閱讀: 4
一提到身弱就會有人不自覺地先入為主地認定身弱代表不好,其實大可不必。在傳統文化中身強身弱指的是八字裡日主能量的強弱,代表了一個人的性格和精神意志方面的強弱而導緻的兩種不一樣的能量運行模式。鑒于看八字解日柱對很多友友來說很麻煩,所以可以直接從外在特征表現入手來解讀。...
八字驿馬什麼意思

八字驿馬什麼意思

作者: 天天見聞 時間:2024-10-12 閱讀: 7
驿馬通常出現在八字分析中的時支列,被視為生肖與八字之間的橋梁。二、八字驿馬的分析與解讀三、八字驿馬的應用案例四、八字驿馬與命運的關系命主八字中的驿馬不僅揭示了命主的個性和特點,還與命運息息相關。八字驿馬作為命理中的重要元素,通過分析驿馬的特點和含義,我們可以更好地理解個人命運的走向和關鍵因素。...
申時出生的寶寶五行缺什麼 有什麼特點呢

申時出生的寶寶五行缺什麼 有什麼特點呢

作者: 天天見聞 時間:2024-10-12 閱讀: 2
那麼申時出生的寶寶五行缺什麼呢?一、申時出生的寶寶五行缺什麼出生于申時的寶寶,五行屬金。由于金與木相克,所以出生于申時的寶寶一般都比較缺木,需要在某些方面補木。這是五行缺木的寶寶無法成功的主要原因。...
我來說兩句

年度爆文