MAC上反編譯android apk---apktool, dex2jar, jd-jui安裝使用(含手動簽名)

CharliChen發表於2016-12-13

前文 介紹了在Windows平臺利用強大的APK-Multi-Tool進行反編譯apk,修改smali原始碼後再回編譯成apk的流程,最近受人之託,破解個apk,所幸的是所用到的這三個軟體都是跨平臺的,mac上也妥妥的。這裡記錄下在mac上所用的東西和流程。 
總共需要三個軟體,為了便於找到最新的版本,把官網也放後面:

  1. Apktool:http://ibotpeaches.github.io/Apktool/install/ 最新版本2.0.1
  2. dex2jar: https://github.com/pxb1988/dex2jar 最新版本2.0
  3. JD-GUI: http://jd.benow.ca/ 最新版本1.4.0 
    這三個軟體Apktool的安裝稍微麻煩點,其他都還好,基本上下載下來解壓了就能用。

MAC上Apktool的安裝

1,在官網連結裡找到如下所示: 
這裡寫圖片描述
基本上按照上面的6個步驟就ok了。第一步是下載一個shell指令碼,儲存的名字就是”apktool”,不要帶.sh字尾。可以複製到sublimetext,然後儲存下。 
2,下載最新的apktool-2,在bitbucket上: 
這裡寫圖片描述
3,將所下載的jar檔案改名為”apktool.jar” 
4,將shell指令碼”apktool”和”apktool.jar”放到 “/usr/local/bin”目錄下 
5,增加這兩個檔案可執行許可權,chmod a+x file 
6,執行shell apktool就ok了。 
安裝完畢後可以執行apktool -v檢視版本資訊:

Apktool v2.0.1 - a tool for reengineering Android apk files
with smali v2.0.6 and baksmali v2.0.6
Copyright 2014 Ryszard Wiśniewski <brut.alll@gmail.com>
Updated by Connor Tumbleson <connor.tumbleson@gmail.com>

usage: apktool
 -advance,--advanced   prints advance information.
 -version,--version    prints the version then exits
usage: apktool if|install-framework [options] <framework.apk>
 -p,--frame-path <dir>   Stores framework files into <dir>.
 -t,--tag <tag>          Tag frameworks using <tag>.
usage: apktool d[ecode] [options] <file_apk>
 -f,--force              Force delete destination directory.
 -o,--output <dir>       The name of folder that gets written. Default is apk.out
 -p,--frame-path <dir>   Uses framework files located in <dir>.
 -r,--no-res             Do not decode resources.
 -s,--no-src             Do not decode sources.
 -t,--frame-tag <tag>    Uses framework files tagged by <tag>.
usage: apktool b[uild] [options] <app_path>
 -f,--force-all          Skip changes detection and build all files.
 -o,--output <dir>       The name of apk that gets written. Default is dist/name.apk
 -p,--frame-path <dir>   Uses framework files located in <dir>.

For additional info, see: http://ibotpeaches.github.io/Apktool/ 
For smali/baksmali info, see: http://code.google.com/p/smali/
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

dex2jar和JD-GUI的安裝

這兩個直接下載,然後解壓縮就ok: 
這裡寫圖片描述

軟體的安裝就說到這,下面就是破解的過程了。為了檢測下是否能破解,我們先用Apktool反編譯,免得我們最後一場空。(只有Apktool能反編譯/回編譯,我們的破解才有意義)。 
1,新建個apk資料夾,將待破譯的apk放進去,之後進到這個目錄執行命令: apktool d hongbao.apk 
這裡寫圖片描述

yanzideMacBook-Pro:apk yanzi$ apktool d hongbao.apk 
I: Using Apktool 2.0.1 on hongbao.apk
I: Loading resource table...
I: Decoding AndroidManifest.xml with resources...
I: Loading resource table from file: /Users/yanzi/Library/apktool/framework/1.apk
I: Regular manifest package...
I: Decoding file-resources...
I: Decoding values */* XMLs...
I: Baksmaling classes.dex...
I: Copying assets and libs...
I: Copying unknown files...
I: Copying original files...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

目錄如下: 
這裡寫圖片描述
之後再執行命令回編譯apk: 
apktool b hongbao (hongbao 就是反編譯出來的資料夾)

yanzideMacBook-Pro:apk yanzi$ apktool b hongbao
I: Using Apktool 2.0.1
I: Checking whether sources has changed...
I: Smaling smali folder into classes.dex...
I: Checking whether resources has changed...
I: Building resources...
I: Building apk file...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

這裡寫圖片描述
上面的build和dist就是回編譯apk過程中生成的東西,編譯出來的apk在dist目錄下,開啟build/apk資料夾會發現少了original資料夾下的META-INF資料夾: 
這裡寫圖片描述
也就意味著dist裡的apk檔案是沒有簽名的,這個稍後再談。 
2,我們要用dex2jar將apk轉成jar檔案,實質是將apk裡的classes.dex轉成jar。將dex2jar裡的d2j_invoke.sh/d2j-dex2jar.sh增加可執行許可權。然後進到dex2jar這個資料夾下執行: 
./d2j-dex2jar.sh /Users/yanzi/apk/hongbao.apk 
得到hongbao-dex2jar.jar檔案。 
3,開啟JD-GUI,將hongbao-dex2jar.jar拖進去就看到原始碼了。 
通過看Java原始碼對比smali檔案,修改後回編譯就ok了!

如何手動給apk增加簽名?

回編譯後的apk是安裝不成功的,總是提示 
Failure [INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION] 
實質是沒簽名。 
1,生成簽名:

keytool -genkey -keystore hongbao.keystore -keyalg RSA -validity 10000 -alias hongbao
  • 1
  • 1

注意:上面-keystore後面跟的是簽名檔案的名字,而-alias是別名,一般情況下-keystore後面跟-alias是一樣的,但其實兩者沒有關係,這也是我故意搞成不一樣的原因。 
2,為apk增加簽名:

jarsigner -digestalg SHA1 -sigalg MD5withRSA -tsa -verbose -keystore hongbao.keystore -signedjar hongbao-signed.apk hongbao.apk hongbao
  • 1
  • 1

注意: 
1,最後的”hongbao”就是-alias後面帶的,必須保持一致。 
2,如果不帶-digestalg SHA1 -sigalg MD5withRSA簽名後的apk安裝也是不成功的,說INSTALL_PARSE_FAILED_NO_CERTIFICATES的錯誤,如果不帶-tsa會報一個時間方面的警告。

文中所提到的附件下載:

  1. Apktool
  2. dex2jar
  3. JD-GUI

相關文章