4.10 玄奧八字
作者:飛龍
聲明:本人極度厭惡玄學,選取此軟件是為了研究逆向技術(shù),并不代表本人贊成其內(nèi)容。
這次要破解的軟件是這個:http://www.xazhouyi.com/android/soft/bazi.html
首先分析其行為,打開軟件:

按照以往的經(jīng)驗,程序有個字段用于維護注冊狀態(tài),我們可以通過字符串快速定位到它。我們將其載入 AK:

搜索“軟件未注冊”,在string.xml中找到:
<string name="Id_StartInfo">"注意事項
1:軟件未注冊只能使用1999年的,注冊后可使用所有功能。
2:注冊方法請看軟件菜單“幫助->軟件幫助”。
3:注冊時需提供軟件系列號,軟件系列號--點擊菜單“幫助->注冊”可看到。
...
</string>
然后在public.xml中找到,字符串的 ID 是0x7f060003。之后搜索這個數(shù)字。
我們在main,也就是入口的MyInit函數(shù)中找到了這個數(shù)值:
:cond_b
# 玄奧八字7.2未注冊!
const-string v7, "\u7384\u5965\u516b\u5b577.2\u672a\u6ce8\u518c\uff01"
invoke-virtual {p0, v7}, LMy/XuanAo/BaZiYi/main;->setTitle(Ljava/lang/CharSequence;)V
.line 199
invoke-virtual {p0}, LMy/XuanAo/BaZiYi/main;->getResources()Landroid/content/res/Resources;
move-result-object v7
const v8, 0x7f060003
invoke-virtual {v7, v8}, Landroid/content/res/Resources;->getString(I)Ljava/lang/String;
# 剛才的字符串
move-result-object v7
invoke-static {p0, v7, v10}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;
move-result-object v7
invoke-virtual {v7}, Landroid/widget/Toast;->show()V
goto :goto_4 # return-void
我們猜想:cond_b是失敗分支,我們往上找:
sget-object v7, LMy/XuanAo/BaZiYi/main;->m_chkSoft:LMy/XuanAo/BaZiYi/CSoftReg;
invoke-virtual {v7}, LMy/XuanAo/BaZiYi/CSoftReg;->ChkNumA()Z
move-result v7
if-eqz v7, :cond_b
sget-object v7, LMy/XuanAo/BaZiYi/main;->m_chkSoft:LMy/XuanAo/BaZiYi/CSoftReg;
invoke-virtual {v7}, LMy/XuanAo/BaZiYi/CSoftReg;->ChkNumB()Z
move-result v7
if-eqz v7, :cond_b
sget-object v7, LMy/XuanAo/BaZiYi/main;->m_chkSoft:LMy/XuanAo/BaZiYi/CSoftReg;
invoke-virtual {v7}, LMy/XuanAo/BaZiYi/CSoftReg;->ChkNumC()Z
move-result v7
if-eqz v7, :cond_b # 關鍵跳
# 成功分支
.line 195
const-string v7, "\u7384\u5965\u516b\u5b577.2"
invoke-virtual {p0, v7}, LMy/XuanAo/BaZiYi/main;->setTitle(Ljava/lang/CharSequence;)V
.line 196
# const/4 v10, 0x1
sput-boolean v10, LMy/XuanAo/BaZiYi/main;->m_regFlag:Z
我們可以得出ChkNumA/B/C是三個關鍵判斷。下面的if-eqz是關鍵跳。成功各分支將m_regFlag設為 1,說明它是保存注冊狀態(tài)的字段。
我們可以將這三個if-eqz都給注釋掉,但是我們可以采取另一種方式,在最后一個if的下面添加:goto_100標簽,然后在第一個if上面添加goto :goto_100。
.line 193
:cond_1
goto :goto_100
sget-object v7, LMy/XuanAo/BaZiYi/main;->m_chkSoft:LMy/XuanAo/BaZiYi/CSoftReg;
# ...
if-eqz v7, :cond_b
:goto_100
重新打包、安裝軟件后,打開軟件,我們發(fā)現(xiàn)不再彈出注冊提示了。訪問菜單->更多->注冊之后,在注冊界面中我們可以看到“已注冊”。
