長久以來,為避免手機APP被反編譯和破解,大多數移動開發者選擇代碼混淆技術來抵抗破解者的攻擊。但隨著不斷有應用被破解和盜版的事件發生,讓越來越多的開發者開始質疑這種抵御方式的有效性。用代碼混淆技術來保護手機APP安全到底是良策還是誤區,本文請到360加固保的技術工程師劉敏為大家揭曉。
什么是代碼混淆?
代碼混淆是將程序的代碼轉換成一種功能上等價,但是難于閱讀和理解的形式的行為。比如將代碼中的各種元素,如變量、函數、類的名字改寫成無意義的名字,使破解者在閱讀時無法根據名字猜測其用途,增加反編譯的閱讀難度。
代碼混淆的利與弊
以濟南團譜的一款APP《九天傳說》為例,這是一款目前風靡的RPG類打怪游戲。以超酷的打斗視覺體驗和好玩的等級模式讓應用一上線就贏得了許多用戶。為避免出現盜版,提高應用安全性,技術人員對其進行了代碼混淆。圖1是進行代碼混淆前后的代碼結構對比。右側截圖是對源代碼文件中的一些類名做了變換,改成了以英文字母命名的名稱,這樣破解者在閱讀時就不容易理解其特指的含義。
圖1:代碼混淆前后代碼結構對比
這種代碼混淆方法簡單、便于操作。但也因此會給開發者的調試工作帶來困難,開發人員通常需要保留原始的未混淆的代碼用于調試。由于混淆是不可逆的,在混淆的過程中一些不影響正常運行的信息將永久丟失,這些信息的丟失會使程序變得更加難以理解。
代碼混淆后手機APP能否再被破解?
雖然做了代碼混淆,但混淆只是對源代碼的類名和一些變量名做了變換,增加了破解者閱讀的難度,并不能真正阻止反編譯。下面是對進行過混淆的《九天傳說》APP進行破解并插入惡意廣告的過程演示。首先,使用apktool工具進行反編譯,可以得到smali代碼文件,再定位找到主Activtiy的代碼,主Activity可以從AndroidManifest文件中查到。九天傳說的主Activity查到為com.tp.ttgame.jiutian.JiuTian。
圖2是處理com p tgamejiutianJiuTian.smali中的onCreate函數,向其中添加有米廣告的初始化代碼截圖。
圖2:添加有米廣告的初始化代碼
再將添加banner的函數插入其中,并在onResume函數中調用,見圖3、圖4。
圖3 :添加banner的函數
圖4 :調用添加banner的函數
這樣代碼部分就修改完成了。最后再修改AndroidManifest文件,需要將有米廣告必要的配置寫進去。見圖5、圖6。
圖5:添加有米廣告必要的組件
圖6:添加有米廣告必要的權限
最后,將有米廣告SDK的內容轉成smali,并將其跟九天程序的smali合并。用apktool重新打包之后生成的程序就是一款含有有米廣告的盜版應用了。圖7是啟動該盜版應用后的界面,能看到右下角增加的有米廣告內容。
圖7:啟動盜版應用后的界面
同理,破解者還可以將正版APP中的廣告替換掉,這樣,當用戶下載該盜版應用并點擊廣告后,所帶來的廣告收入就直接進入了破解者的腰包。重要的是盜版應用中的廣告大多是惡意廣告,會在用戶不知情的情況下下載程序,造成流量的消耗和資費的損失,影響用戶體驗更損害正版APP的品牌形象。所以,單純的通過代碼混淆并不能完全保證應用安全。
如何避免手機APP被破解和盜版?
目前越來越多的開發者選擇使用360加固保來保護應用安全,這種方式到底是否可靠,下面再為大家做下演示。圖8是對《九天傳說》APP進行加固保護前后的代碼結構對比,能看到右側截圖中加固后的代碼文件都已經被隱藏起來,只保留了加固后的保護程序,破解者在反編譯時無法找到源程序真正的代碼,即可有效的避免手機APP被破解和盜版。
圖8:使用加固前后的代碼結構對比
除了可以對手機APP的代碼進行保護外,加固后還具備反調試、反篡改、反竊取和反逆向等功能,能有效防止代碼注入,避免游戲外掛或木馬程序的惡意篡改行為,從根源上防止應用被二次打包,杜絕盜版應用的產生。
避免手機APP被破解和盜版除了可以使用專業的第三方加固產品外,更需要開發者提高安全意識,如編寫代碼要規范,減少程序漏洞;及時修復漏洞,不給破解者可乘之機等。