學(xué)習(xí)了一段時間的逆向之后,就想找些 APP 練手,于是找到了下面這個 github
android-crackme-challenge
這個 github 里提供了 10 個 crackme,難度逐漸上升
先來看 crackme-one
crackme-one 第一次打開時是這樣的:

這里的重點(diǎn)是,點(diǎn)擊 “Write File” 程序?qū)谏澈兄袑懭胛覀円玫降拿荑€,這就說明至少有兩種方法可以得知這個密鑰:
- 找到這個被寫入的文件
- 逆向 APK,找到寫入函數(shù),直接查看或者通過 log 的方式得知寫入的內(nèi)容
我用的是第二種方法(主要是不知道寫入的文件在哪),首先隨意輸入一個密鑰點(diǎn)擊 “Check”,彈出一個 Toast “Sorry, that's not right..”,記下這個字符串,待會會用到
使用 apktool 逆向 APK,得到的 smali 文件夾的文件目錄如下:

由于判斷輸入的密鑰是否正確的提示是在點(diǎn)擊 “check” 之后才觸發(fā)的,所以判斷的邏輯應(yīng)該在點(diǎn)擊事件的監(jiān)聽器中,該監(jiān)聽器為 ChallengeOneFragmentOnClickListener,搜索剛剛那個字符串 “Sorry, that's not right..”,看看是哪里創(chuàng)建了這個 Toast 然后輸出了這個提示,注意在源碼中 ' 應(yīng)該前面有一個 \,所以應(yīng)該搜索 “Sorry, that's not right..”
搜索結(jié)果剛好在 ChallengeOneFragmentOnClickListener.smali 中,說明剛剛我們的假設(shè)是沒錯的

仔細(xì)查看這附近的代碼,發(fā)現(xiàn)這句代碼在 cond_1 (137行)標(biāo)號下,說明是通過某個跳轉(zhuǎn)跳轉(zhuǎn)到這里來的,搜索 “cond_1”

發(fā)生跳轉(zhuǎn)的代碼在 86 行,跳轉(zhuǎn)的條件是 v8 等于 0,往上分析發(fā)現(xiàn) v8 是 之前的 v8 (v8被重新賦值了)以 v9 為參數(shù)調(diào)用 equals 函數(shù)的結(jié)果, 而之前的 v8 的類型是 String,于是判斷的邏輯應(yīng)該為如果 v8 和 v9 相等就不跳轉(zhuǎn),反之跳轉(zhuǎn)
接著向上看發(fā)現(xiàn) v9 的值是 “poorly-protected-secret”,這個 “poorly-protected-secret” 很有可能是密鑰,再往上看發(fā)現(xiàn)之前的 v8 就是從我們輸入密鑰的那個 EditText 中獲取的內(nèi)容全部轉(zhuǎn)換為小寫后的值,所以這應(yīng)該就是密鑰了
在 APP 中輸入 “poorly-protected-secret”,成功