這節正式開始破解編寫的第一個Android工程,打開Android Killer,把第一節自己編寫的Android apk拖入Android Killer。
PS: 如果Android Killer不能編譯成APK,或者反編譯失敗,應該是apktool等工具版本低了,參見AndroidKiller高版本反編譯失敗解決。
把APK拖到Android Killer界面,把apk文件拖到Android Killer界面,工具自動開始反編譯,反編譯完成后點擊左側入口處即可打開MainActivity。(如果卡在正在反編譯APK源碼請稍等..,關閉Android Killer重新打開即可)
先思考下,破解這個程序的關鍵點是什么: 當我們填寫錯誤的激活碼時會提示 “非法的激活碼,注冊失敗”,填寫正確激活碼提示“激活碼合法,已注冊”。
我們分別找到這二句代碼處,把執行注冊失敗地方的代碼修改為去執行注冊成功的代碼不就破解了嗎?OK,思路有了就開始吧。
點擊Android Killer的工程搜索標簽頁,輸入 非法的激活碼,注冊失敗,點擊Aa圖標 -> 文本轉Unicode,點擊搜索,來到對應的smali代碼處。搜索注冊成功的方法同上,如圖:
看到提示成功和失敗二個地方都在confirmJHM方法里,都是把字符串傳給v0寄存器,然后使用invoke-static調用makeText方法顯示。
成功的邏輯在上面,如果沒有跳轉的話是不會執行失敗的邏輯的,肯定是跳轉繞過了成功部分。
往上找,發現37行 if-eqz v0, :cond_0 即:如果v0等於0,就跳轉到cond_0執行,就提示失敗;即如果v0不等於0就提示成功。
繼續往上分析代碼可知,31行const-string v0,"abc"存儲正確的激活碼abc,33行把我們填寫的激活碼p1跟abc做比較,如果不想等就返回0,35行把函數返回值給v0寄存器。
現在我們知道了,只要我們不讓程序跳轉到cond_0執行就可以提示成功了,怎么辦呢?修改辦法有很多,只要實現我們想要的效果就可以了。這兒我們直接注銷低37行的smali代碼即可。
ctrl+s保存修改,點擊左上角的Android標簽頁->編譯。編譯完成后生成新的apk。重新測試下,輸入錯誤激活碼也能顯示注冊成功