2012年4月5日 星期四

Android decompile and recompile

最近在用一些Free Android App發現有廣告十分的礙眼, 加上之前有報導這些Ad時相當的耗電, 於是有了自行將Ad拿掉的念頭, 以下的紀錄都是實驗性質, 進行非法行為本人既不負責, 謝謝.

  1. 反組譯(Decompile) :
    工具其實比想象的多, 之前因為工作需要也碰過幾種, 剛好翻到一篇文章列出有名的幾種. 大部分都能夠取得apk內res目錄下的資源, 如圖案, 字串, xml等.
    • Apktool : 本篇文章使用此種, 將apk轉換成android的組語smali格式.
    • dex2jar + jdgui : 這個超強, 只要程式不要太複雜, 可以看到完整的java code.
    • baksmali : 也能產生smali code.
    • dexdumptest : 沒用過, 不過是原生提供的工具.
  2. 步驟
    1. 下載apktool.jar, 準備apk檔案, 輸入
      java -jar apktool.jar d xxx.apk out
      紅色請換成想反組譯的apk, 跑完後會產生out目錄, 裡面會有source code的smali版本, resource檔案, 以及AndroidManifest.xml
    2. 然後就可以直接編輯smali檔案, 做想要的修改. smali可能有點難以理解, 不過如果搭配dex2jar + jdgui產生的java source, 應該可以看懂大部分的內容.
      我的目標是把廣告移調, 方式稍後再提.
    3. 修改完成後要重新產生新的apk, 也很簡單
      java -jar apktool.jar b out out.apk
      會將修改後的檔案重新打包成apk
    4. 這時候還不能重新安裝回機器上, 如果直接安裝會看到
      Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]
      Android app需要sign過才能安裝, 但是一般狀況下, 我們不可能有開發者當初開發者用來sign app的key, 需要自己想辦法. 偷懶的話可以用debug key, 我是選擇重新產生一組key. 官方網站有教學, 這邊簡述方式.
      keytool -genkey -v -keystore xxx.keystore -alias yyy -keyalg RSA -keysize 2048 -validity 10000
      紅色部分都可以自己更改, 記得就好
    5. 然後就是sign apk
      jarsigner -verbose -keystore xxx.keystore out.apk yyy
    6. 然後就可以將apk安裝回去拉
      adb install out.apk
  3. 修改(移除廣告)
    1. 要移除廣告, 就要先理解一下廣告怎麼加進去的, 大宗應該是google提供的方式. 如果在返組譯的AndroidManifest.xml看到
      <activity android:name="com.google.ads.AdActivity"
                    android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/>

      就代表是用此種方式, 另外可能也會用AdMob之類的.
    2. 如果該apk使用的是google way, 要顯示廣告就一定會用到
      adView = new AdView(this, AdSize.BANNER, MY_AD_UNIT_ID);

      之類的code, 所以可以利用grep找到該smali code位置, 將之移除即可

沒有留言:

張貼留言