一、對抗反編譯
對抗反編譯是指apk文件無法通過反編譯工具(如apktool,baksmali,dex2jar)對其進行反編譯,或者反編譯后無法得到軟件正確的反匯編代碼。常用的做法有兩種:
- 閱讀反編譯工具源碼
這種辦法需要分析人員具較強的代碼閱讀與理解能力,因此,這種方法具體實施起來困難。
- 壓力測試
比起閱讀反匯編工具的源碼,這種方法思路就簡單多,而且實施起來較容易。通常的做法是:收集大量的apk文件(幾百個吧)存放進一個目錄,編寫腳本或程序調用反編譯工具對目錄下的所有apk文件進行反編譯。不同的軟件從大小、內容到結構組織都不盡相同,反編譯工具在處理它們時有可能會出現異常。這種方法的思路是,通過查看反編譯工具(如dex2jar)執行工作查看其log,分析得出能另其執行出現的指令,從而我們在編寫軟件時讓代碼生成該指令。
二、對抗靜態分析
不要指望反編譯工具永運無法編譯你的軟件,現在新版本的反編譯工具(如dex2jar)已經很好的進行工作,很少會有處理不了的指令了。因為,我們需要想其它辦法防止軟件被人破解。
- 代碼混淆技術
這個現在的主要的做法是ProGuard。
- NDK保護
- APK加殼 參考
三、對抗動態調試
如果認為自已編寫的代碼已經足夠對付別人靜態分析了,可以考慮在代碼中另入動態調試檢測,讓破解者無從對自已的軟件下手。
- 檢測調試器
動態調試使用調試器來掛鈎軟件,獲取軟件運行時的數據,我們可以在軟件中加入檢測調試器的代碼,當檢測到軟件被調試器連接時,中止軟件的運行。參考
- 檢測模擬器
軟件發布后會安裝到用戶手機中運行,如果發現軟件運行在模擬器中,很顯然不合常理,可能是有人試圖破解或分析它,這種情況我們要予以阻止。
四、防止重編譯
確解者可能注入代碼來分析我們的軟件,也可能修改軟件邏輯直接確解,不管怎樣修改,軟件本身的一些特性已經改變了。
- 檢查簽名
每一個app在發布時都需要開發人員對其進行簽名,而簽名使用的密鑰文件是開發人員所獨有的,確解者通常不可能擁有相同的密鑰文件(密鑰文件被盜除外),因此,簽名成了android軟件一種有效的身份標識,如果軟件運行時的簽名與自已發布時的不同,說明軟件被篡改過,這個時間我們就可以讓軟件中止運行。
- 校驗保護
重編譯android軟件的實質是重新編譯classes.dex文件,代碼經過重新編譯后,生成的classes.dex文件的Hash值已經改變。我們可以檢查程序安裝后classed.dex文件的Hash值,來判斷軟件是否被重打包過。