現在主要工具是接觸SDK,為了防止遊戲包被破解編譯,以及發現加密串,我來分享下以下幾點:
防破解技術主要有四種實作方式:
1.代碼混淆(ProGuard)技術
2.簽名比對技術
3.NDK .so 動态庫技術
4.動态加載技術
5.第三方平台加密以及檢測漏洞
第一種: 代碼混淆技術(ProGuard) 該技術主要是進行代碼混淆,降低代碼逆向編譯後的可讀性,但該技術無法防止加殼技術進行加殼(加入吸費、廣告、病毒等代碼),而且隻要是細心的人,依然可以對代碼依然可以對代碼進行逆向分析,是以該技術并沒有從根本解決破解問題,隻是增加了破解難度。
第二種: 簽名比對技術 該技術主要防止加殼技術進行加殼,但代碼逆向分析風險依然存在。而且該技術并不能根本解決被加殼問題,如果破解者将簽名比對代碼注釋掉,再編譯回來,該技術就被破解了。
第三種: NDK .so動态庫技術,該技術實作是将重要核心代碼全部放在C檔案中,利用NDK技術,将核心代碼編譯成.so動态庫,再用JNI進行調用。該技術雖然能将核心代碼保護起來,但被加殼風險依然存在。
第四種: 動态加載技術,該技術在Java中是一個比較成熟的技術,而Android中該技術還沒有被大家充分利用起來。
第五種: 第三方平台使用
主要講解第四種方法,該技術可以有效的防止逆向分析、被破解、被加殼等問題,動态加載技術分為以下幾步:
将核心代碼編譯成dex檔案的Jar包
對jar包進行加密處理
在程式主入口利用NDK進行解密
再利用ClassLoader将jar包進行動态加載
利用反射技術将ClassLoader 設定成系統的ClassLoader。
主要優點有:
1.核心代碼在被加密的jar中,是以破解者無法解壓出class檔案,如果加密秘鑰被破解者拿到,那将是另外一層面的安全問題了。
2.該技術也可以有效防止加殼技術,代碼是動态加載上來的,破解者的殼程式無法加入到已加密的jar包中,及時破解者注入殼程式入口,殼程式因為不在ClassLoader 的jar包中,是以也無法被執行起來,除非破解者替換ClassLoader的jar包,關掉NDK解密代碼.但這種安裝到手機上,已經不在是我們的應用,使用者一定會将其解除安裝掉。
是以綜合起來比較,第四種動态加載技術是最安全的,但效率問題,本人并沒做嚴格測試,粗略實驗了一下,效率并沒有明顯降低。
jar用SDK\platform-tools\下的dx指令進行dex格式轉化
然後再用加密工具将生成jar檔案進行加密處理
最後通過代碼動态加載:
處理完成,如果在Application中做特别處理也是可行的。之前就有人分析了愛加密的加密方式,不過這裡不做闡述,有興趣可以一起讨論。
下篇文章中我們來講講如何 逆向apk的動态庫