顯示具有 proguard 標籤的文章。 顯示所有文章
顯示具有 proguard 標籤的文章。 顯示所有文章

2011年1月21日 星期五

Android 應用的盜版與山寨 - 盜版市集

The pirate Android market and shanzhai apps - pirate market

Android 盜版應用的崛起

Android 的盜版應用遲早一定會出現的,這是軟體世界裡不變的真理,而且不管你如何保護都沒有用。就像防盜市場一樣,沒有開不了的鎖,有的只是時間快慢問題而已。

熟悉門路的人都知道,在通訊行買 iPhone,不僅幫你的手機越獄,還附上一片大補帖,裡面裝滿可以免費使用的 iPhone 付費應用。Android 應用當然也無法免除這被盜版的命運,再加上 Android 應用的開發使用的是 Java 語言,要反組譯這 Java 所編譯出來的 .class 或是 .jar 檔,更是易如反掌。自已 google 一下 java decompiler,這類的 java 反組譯工具早就滿天飛。而且反組譯所產生出來的 Java 源碼,還都宛如原著。

雖然 Android 會再將 .class 轉譯成 .dex,不過這 .dex 的格式既然是公開的,自然要再將他解開,也不是件難事。smali, Dedexer, dex2jar, android-apktool 等都有這樣的本事。雖然你可以用 Proguard 這類的工具,延長別人看懂你程式所要花費的時間。不過,相信我,只要能還原出原始碼,就一定可以被破解。加再多的防盜措施,只是找你自己與使用者的麻煩。因此,盜版 Android 應用的出現,是早晚的事。

透過 iPhone 的 App Store 或是 Android 的 Android Market 這類的創新營運模式,將手機應用的傳銷成本,幾乎降為 zero。這麼好的創新模式,盜版者當然得將這招學下來,所以專為散佈盜版應用的 Market,自然也就孕育而生。Applanet 大概是最有名的一個。

我試玩了一下,Applanet 本身就像是一個 Android Market,第一印象是這 Applanet 應用,寫的還真不錯,有一定的水準。我的免費應用,多數帶有廣告,自然歡迎盜版市場一起幫忙散佈,付費應用可就不行。找了一下,果然 Applanet 上有我的付費應用。經過分析之後,我發覺目前的破解方法多是直接改你的程式,繞過你原本程式中檢查是否合法的那個點,再將 apk 重新簽名發佈。

對於不想付錢買應用的人,有免費的付費應用可用,當然是 why not,不過對於真的使用這類破解應用的使用者,這問題可就嚴重了。你怎麼知道破解者不會在程式中植入木馬?在個人電腦上,被植入木馬,除非偷走你的電子銀行密碼,一般來說,還不會有太大的金錢損失。手機上的木馬遠比個人電腦來得可怕許多。偷抓你的聯絡人資料和私密相片,傳遞上網;或是盜發垃圾簡訊等等,一般人平常根本無從察覺,直到你收到帳單的那一刻,才體會甚麼叫做因小而失大。而目前的手機防毒軟體,也多是騙錢的,根本起不了防治作用,你別想靠他幫你抓毒。由於手機付費應用來的相對地低廉,通常都是不到一杯咖啡的價格,再加上手機上有許多的隱私資料。因此,我覺得這盜版市集是否會對開發者收益部分造成大比例的威脅,還需要一段時間的觀察。

常有人問我,該如何保護應用,避免被盜版等問題。我的回答都是,只要做好基本的保護 Proguard + LVL,其他就順其自然了。因為我說過,只要能還原出原碼,這樣的程式就一定可以被破解。除了做好基本保護之外,另外一個重要的事,開發者一定要立足台灣,放眼全球。有機會的話,不要做只給小區域人使用的應用,一定要做給全球手機用戶使用的應用。Android Market 的出現,解決了傳統沒效率的軟體銷售經銷問題。現在你的應用,瞬間可以透過 Market 上架到全球用戶的面前 (消費者有沒有看到的你商品,這是下一件事),為甚麼你還不願跨出台灣?一旦你的應用是面對全球的,這因盜版市場所造成的營收損失,比例上自然也會下降。與其每天想如何保護程式,還不如多花點時間在增強你程式的功能與品質。這樣才會有正向的循環,不是嗎?

這有一篇 如何破解應用的教學。我分享這資訊,並不是要你破解別人的程式,而是因為要學會保護你的應用之前,首先你得先知道別人是如何破解應用。再說一次,沒有破解不了的程式,只是破解所要花的時間多少而已。


繼續閱讀全文...

2008年10月13日 星期一

請為你的 Android 程式加上 obfuscation 吧!

Adding ProGuard task into your Android building steps.

在 Eclipse 內,用 Ant 編譯你的 Android 程式 這篇中,我介紹過如何利用 Ant 來編譯最佳化的 Android 程式。在那篇中,我只說到加上 debug="false" 和 optimize="true" 這兩個選項。其實,這樣的最佳化還是不夠的。你還要加上 obfuscation 才行。

在 Java 的世界中,有許多的 obfuscators 可以選用。我在這裡,只提這免費的 ProGuard,並和你分享我是如何將 ProGuard 加到 build.xml 之中,以及在 Android projects 中,使用這 obfuscator,應該要注意的事。

ProGuard 可以用來做什麼?

進入 ProGuard 的首頁,第一句話就這麼寫著:

ProGuard is a free Java class file shrinker, optimizer, obfuscator, and preverifier. It detects and removes unused classes, fields, methods, and attributes. It optimizes bytecode and removes unused instructions. It renames the remaining classes, fields, and methods using short meaningless names...

因此,你可以知道 ProGuard 可以幫你,除掉多餘的 classes 或是函式,或是變數,他也會最佳化你的程式。更重要的是,他還會將這些 classes, functions, variables 的名稱,用較短的名稱來取代。這個 obfuscation 功能,除了可以更進一步縮小程式的大小之外,還可以在別人 decompile 你的程式時,延長他讀懂你程式的時間。

用 ProGuard 縮小程式大小的效果,好嗎?就以我手上的一個例子來說,原先的 classes.dex 有 350,864 bytes。經過 ProGuard 處理後,大小變為 226,772 bytes,足足少了有 35.4% 之多。這應該可以減少不少,使用者要下載你程式時,所使用的時間。

將 ProGuard 加到程式的建置步驟中

我的 Eclipse 中,附帶的是 Ant 1.7.0 版本。在這個版本中,已經將 ProGuard 變成是內建的 task 之一,因此你不用再像 這個作法 中一樣,以 java task 執行外部 java 程式的方式,來執行 ProGuard 程式。

你只要像下面這樣,寫個 obfuscate target。

再將原先 dex target,

其中的 depends="compile" 改成 depends="obfuscate"。改好後,就像下面這樣。

在使用 ProGuard 的經驗上,我建議是不要加上 -overloadaggressively 這個選項。要不然,有的程式,會在執行時丟出個 java.lang.VerifyError exception。我加上 -dontskipnonpubliclibraryclasses 選項,是因為要避開使用 java.lang.StringBuilder.setLength(int) 時的錯誤。另外,如果你程式的類別數超過 26 個時,我建議要加上 -dontusemixedcaseclassnames 選項,要不然 Android 的 dex compiler 會有問題。

另外,最讓人頭痛的是 -keep 這個選項。到底那些類別要加上這個選項?我的作法是,只要是出現在 AndroidManifest.xml 中的類別,及出現在 layout/*.xml 中的 custom widgets,都要加上 -keep。要不然,Android 系統,可是會找不到你的類別。

關於 ProGuard 的程式碼最佳化部份,我手上幾個程式都沒問題,經過 ProGuard 最佳化後,還是能順利通過 Dalvik 的驗證。不過,倒是有個程式,一直沒法通過 Dalvik 的驗證。最後,還是在稍微改寫了一下程式的寫法,才避免了這個問題。所以,如果有啟用 ProGuard 的程式碼最佳化功能,你可要多注意一下,是否所有的功能,在模擬器上,都可以正常執行。


繼續閱讀全文...