iT邦幫忙

2021 iThome 鐵人賽

DAY 11
0

前言


安全性雖然不做也不會影響功能,
但如果出事了,小則財損,大則影響公司的生存,
以下分別用攻、防的角度來討論,
這個領域的水很深,也需要很多背景知識,
這邊就只介紹比較常見且基礎的手段。


反組譯

如果只是要看一個 apk 的檔案結構、用了哪些套件,
最簡單的做法就是直接將 apk 拖到 Android Studio 中,
但如果是要看程式碼,可以使用 JADX ,一樣將 apk 拖進 JadxGUI 就可以看程式碼了。
但因為有 ProGuard,所以很多 class、function 名稱都變成 a, b, c 了。
如果是要修改程式,那麼就需要使用 apktool 將 apk 反編譯後,
修改 smali 檔,再重新簽名、對齊等。

記憶體修改

上面說的是靜態的修改,那麼來聊聊 app 正在執行時,動態的修改方式,
記憶體修改大致流程如下:
直接搜尋變數的數值(比如有 100 點數,就搜尋 100),
接著改變數值(花掉或是增加都可以),然後重新搜尋改變後的數值,
範圍應該會縮小不少,如果還沒有明確出現,就反復上述步驟,
找到該記憶體位置以後,透過該工具直接輸入需要的數值。
工具有 GameGuardian、燒餅修改器、八門神器 Game Killer 等。

攔截封包

封包是網路數據傳輸的單位,
我們可以透過工具將 app 發出的 request 以及 response 攔截,
以此得知該 app 呼叫的 api、資料內容等等資訊。
工具有 Packet Capture 等。


反組譯

ProGuard 混淆一定要做好,
重要的資訊不要放在 res 中(res 只要解壓縮就能看到),
也盡量不要放在 code 裡面,即使要,也請記得加密,
相對好的做法是從 api 取得,這樣即使被破,還能及時修改規則,
另外,也有加殼的技術,
加殼的方式很多種,技術細節也很深,這邊就不細說。

記憶體修改

對數值做加密,使用的時候做比較、解密,
另外,不要讓 app 的數值覆寫 server 端的數值,
比方說錢包餘額,不管是儲值還是消耗,
都要在 server 端執行,app 只做呈現。

攔截封包

請使用官方建議的、GitHub 上有持續維護且使用者眾多的方式做網路傳輸,
部分套件並沒有做防護。
另外,也請使用 https。

加解密機制

在 app 中總會有要保護的東西,像是音檔、電子書,
這時候我們可能有自己的一套保護機制: DRM
畢竟像音檔、電子書等內容經常需要離線瀏覽,
所以 DRM 機制就會在 app 中,
我們可以使用 c 語言實作編譯成 so 檔,然後使用 jni 的方式呼叫,
這樣可以提升安全性。

金鑰

現在將 app 上傳至 Google Play 有兩種檔案格式 - apk 與 aab,
aab 比較新,有很多好處,新的 app 也有規定要 aab,
但如果一開始就上傳 apk 的 app 就沒有強制要求,
但 apk 是要自己簽名後上傳,Goolge Play 會認簽名,
如果沒有當初第一次上傳的那把鑰匙,
就永遠沒有辦法再上傳更新,
aab 的話則是由 Google Play 保管,由 Google Play 來簽名,
如此一來就不需要擔心金鑰遺失或外流的風險。

結語


平常大家都在追功能,很容易就忽略了安全,
到最後可能心血都被盜走了,
我們應該要設週期性的行事曆來排時間定期檢查,
也要勤勞的更新第三方套件,
另外,也可以請資安團隊做黑箱、白箱攻防測試,
其他還有很多安全的方向可以注意,
像是 WebView 可能會遇到 JavaScript injection,
也有可能使用者並不是破解,而是使用欺騙,
像是調時間、模擬 GPS、擋廣告等,都要注意。


上一篇
Day 10:雲端服務
下一篇
Day 12:UI / UX
系列文
30 天從麻瓜變 Android 工程師30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言