午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

萬字長文帶你APK反編譯&重簽名&aab&apks轉(zhuǎn)換

 沖天香陣 2024-05-05 發(fā)布于甘肅

本公眾號也有留言功能啦!歡迎大家留言紀念!

Android反編譯

反編譯(Decompilation)是將已編譯的程序(比如二進制代碼)轉(zhuǎn)換回更高級別的編程語言代碼的過程。這通常用于理解程序的工作原理,進行軟件審計,恢復丟失的源代碼,或者進行教學研究。反編譯的難度和效果取決于原程序的編譯過程中丟失了多少信息(比如變量名、注釋等)。

Android應用通常是用Java或Kotlin編寫的,并且打包成APK文件。由于Android應用的這一特性,反編譯Android應用通常涉及到多個步驟,包括反編譯APK文件以獲取其DEX(Dalvik Executable)文件,然后將DEX文件轉(zhuǎn)換為Java源代碼。

通常用到的反編譯軟件如下:

  • Apktool

    • 下載地址: https:///docs/install  點擊latest version選擇需要的版本進行下載。

    • 功能:用于反編譯Android APK文件,可以解碼資源文件以查看其原始形式,并重新編譯修改后的文件回APK。

    • 使用場景:查看和編輯Android應用的資源文件,如XML布局和字符串資源。

  • jadx

    • 安裝包地址https://github.com/skylot/jadx/releases

    • 功能:一個命令行和圖形用戶界面應用程序,可以將DEX文件直接反編譯成Java源代碼,無需先轉(zhuǎn)換為JAR。

    • 使用場景:快速查看APK文件的源代碼,也支持對APK文件進行編輯和調(diào)試。

Java環(huán)境部署

參考博客:

JDK下載:Java Downloads | Oracle

安裝

需要在電腦中新建一個文件夾,注意,路徑不能有中文。

比如我的是:

D:
|- Z_Enviroment
|-- Java
|--- jdk1.8.0_251
|--- jre1.8.0_251

圖片


安裝到這個位置,選擇更改為我們新建的jdk1.8.0_251目錄(注意此處是jdk)

圖片

安裝到這個位置,選擇更改為我們新建的jre1.8.0_251目錄 (注意此處是jre)

圖片

之后一路點擊下一步安裝完成即可。

配置JAVA_HOME環(huán)境變量

1、打開設置 -> 系統(tǒng)  -> 高級系統(tǒng)設置 -> 環(huán)境變量 - > 系統(tǒng)變量(S) -> 點擊新建 -> 新建內(nèi)容如下:

變量名(N): JAVA_HOME
變量值(V):D:\Z_Enviroment\Java\jdk1.8.0_251

圖片

2、上一步點擊確認后,在系統(tǒng)變量(S)中找到path,雙擊點開,繼續(xù)新建添加變量。

%JAVA_HOME%\bin
%JAVA_HOME%\jre\bin

圖片

驗證Java環(huán)境

打開cmd命令行窗口,使用如下兩個命令進行驗證。

java
javac

如下圖所示,則是配置環(huán)境變量成功。

  • java

圖片

  • avac

圖片

jadx-gui反編譯工具使用

1、下載jadx-gui工具

下載地址https:///docs/install  點擊latest version選擇需要的版本進行下載。

2、使用jadx-gui工具

雙擊運行jadx-gui-1.4.7.exe

圖片


3、使用打開文檔或者將apk包或者aab包直接拖進應用界面,待反編譯完成后即可查看相關信息

圖片


這個軟件會自動編譯好我們打開的apk包,在下方可以用不同的方式查看這個文件的內(nèi)容,如:代碼、Samli、Simple、Fallback

一般來說,我們軟件接入的SDK都會在com這個包下面,需要自己一個層級一個層級的去查找。

jadx命令行的使用

地址: https://github.com/skylot/jadx

參數(shù):

jadx[-gui] [options] <input files> (.apk, .dex, .jar, .class, .smali, .zip, .aar, .arsc, .aab)  
選項:
  -d, --output-dir                    - 輸出目錄
  -ds, --output-dir-src               - 來源輸出目錄
  -dr, --output-dir-res               - 資源輸出目錄
  -r, --no-res                        - 不解密資源
  -s, --no-src                        - 不反編譯源代碼
  --single-class                      - 反編譯一個單一的類,全名,原始名或別名
  --single-class-output               - 如果要反編譯一個單一的類,則寫入文件或目錄。
  --output-format                     - 可以是'java''json',默認:java
  -e, --export-gradle                 - 保存為 android gradle 項目
  -j, --threads-count                 - 處理線程數(shù),默認:4
  -m, --decompilation-mode            - 代碼輸出模式:
                                         'auto' - 嘗試最佳選項(默認)。
                                         'restructure' - 恢復代碼結(jié)構(正常的 java 代碼)
                                         'simple' - 簡化指令(線性,有 goto )
                                         'fallback' - 未經(jīng)修改的原始指令
  --show-bad-code                     - 顯示不一致的代碼(不正確的反編譯)
  --no-imports                        - 禁止使用導入,總是寫整個包的名稱
  --no-debug-info                     - 禁用調(diào)試信息
  --add-debug-lines                   - 如果有的話,添加帶有調(diào)試行號的注釋
  --no-inline-anonymous               - 禁用內(nèi)聯(lián)匿名類
  --no-inline-methods                 - 停用內(nèi)聯(lián)方法
  --no-finally                        - 不抽出最后一塊
  --no-replace-consts                 - 不要用匹配的常量字段替換常量值
  --escape-unicode                    - 轉(zhuǎn)義字符串中的非拉丁字符 (使用 \u)
  --respect-bytecode-access-modifiers - 不要改變原來的訪問修改器
  --deobf                             - 激活去混淆功能
  --deobf-min                         - 名稱的最小長度,如果更短則重命名,默認:3
  --deobf-max                         - 名稱的最大長度,如果更長則重命名,默認:64
  --deobf-cfg-file                    - 反混淆映射文件,默認:與輸入文件相同的目錄和名稱,擴展名為“.jobf”
  --deobf-cfg-file-mode               - 句柄去混淆映射文件的設置模式:
                                         'read' - 如果找到則讀取,不保存(默認)
                                         'read-or-save' - 如果找到則讀取,否則保存(不要覆蓋)
                                         'overwrite' - 不讀取,永遠保存
                                         'ignore' - 不讀取也不保存
  --deobf-use-sourcename              - 使用源文件名作為類名別名
  --deobf-parse-kotlin-metadata       - 將 kotlin 元數(shù)據(jù)解析為類和包名稱
  --deobf-res-name-source             - 更好的資源名稱來源:
                                         'auto' - 自動選擇最佳名稱(默認)
                                         'resources' - 使用資源名稱
                                         'code' - 使用 R 類字段名稱
  --use-kotlin-methods-for-var-names  - 使用 kotlin 內(nèi)在方法重命名變量,取值:disable、apply、apply-and-hide,默認:apply
  --rename-flags                      - 修復選項(逗號分隔列表):
                                         'case' - 修復區(qū)分大小寫的問題(根據(jù) --fs-case-sensitive 選項),
                                         'valid' - 重命名 java 標識符以使其有效,
                                         'printable' - 從標識符中刪除不可打印的字符,
                                        或單個 'none' - 禁用所有重命名
                                        或單個 'all' - 啟用所有(默認)
  --fs-case-sensitive                 - 將文件系統(tǒng)視為區(qū)分大小寫,默認為 false
  --cfg                               - 將方法控制流程圖保存到點文件
  --raw-cfg                           - 保存方法控制流程圖(使用原始指令)
  -f, --fallback                      - 將“--decompilation-mode”設置為“fallback”(已棄用)
  --use-dx                            - 使用 dx/d8 轉(zhuǎn)換 java 字節(jié)碼
  --comments-level                    - 設置代碼注釋級別,取值:error、warn、info、debug、user-only、none,默認:info
  --log-level                         - 設置日志級別,值:quiet,progress,error,warn,info,debug,默認:progress
  -v, --verbose                       - 詳細輸出(將 --log-level 設置為 DEBUG)
  -q, --quiet                         - 關閉輸出(將 --log-level 設置為 QUIET)
  --version                           - 打印 jadx 版本
  -h, --help                          - 打印此幫助

Plugin 選項 (-P<name>=<value>):
 1) dex-input: 加載 .dex 和 .apk 文件
    - dex-input.verify-checksum       - 加載前驗證 dex 文件校驗和,值:[yes, no],默認值:yes
 2) java-convert: 轉(zhuǎn)換 .class, .jar 和 .aar 文件到 dex
    - java-convert.mode               - 轉(zhuǎn)換模式,值:[dx, d8, both],默認值:both
    - java-convert.d8-desugar         - 在 d8 中使用 desugar,值:[yes, no],默認值:no

示例:
  jadx -d out classes.dex
  jadx --rename-flags 'none' classes.dex
  jadx --rename-flags 'valid, printable' classes.dex
  jadx --log-level ERROR app.apk
  jadx -Pdex-input.verify-checksum=no app.apk
jadx -d 'aaa' 'aaa/www.apk'
# -d 表示輸出目錄,后面接的'aaa'表示和jadx根目錄下的aaa目錄,后面'aaa/www.apk'表示解析的是一個名字為www.apk的包文件路徑。

輸出如下

D:\D_Working\jadx-1.4.7-cli\bin>jadx -d 'aaa' 'aaa/www.apk'
INFO - loading ...
ERROR - Zip bomb attack detected, invalid sizes: compressed 350, uncompressed 36968, name assets/bin/Data/974b5eb934ce17c42aecb0d547be8a8e
ERROR - Zip bomb attack detected, invalid sizes: compressed 350, uncompressed 36968, name assets/bin/Data/974b5eb934ce17c42aecb0d547be8a8e
ERROR - Zip bomb attack detected, invalid sizes: compressed 350, uncompressed 36968, name assets/bin/Data/974b5eb934ce17c42aecb0d547be8a8e
INFO - processing ...
ERROR - finished with errors, count: 197

反編譯之后會有兩個文件夾

aaa
- resources
- sources
- 這個文件夾下就可以找到我們接入的SDK信息
- 比如看是否接入了vungle-ads:aaa\sources\com\vungle\ads

這里顯示的和在jadx-gui里面顯示的為一致

AndroidStudio反編譯

Android Studio本身是作為Android應用開發(fā)的集成開發(fā)環(huán)境(IDE),其主要用途是編寫、調(diào)試和發(fā)布Android應用。雖然Android Studio不直接提供反編譯Android應用的功能,但它提供了一些工具和插件支持,可以幫助開發(fā)者在一定程度上理解和分析APK文件。

AndroidStudio下載安裝

下載

官方下載網(wǎng)址: Download Android Studio & App Tools - Android Developers

圖片

下載好之后雙擊即可安裝。

安裝

1、一路點擊下一步,遇到需要選安裝目錄的時候,請選擇非C盤、純英文盤符目錄進行安裝。

2、由于前面我們裝了JDK,所以AndroidStudio會默認幫你選擇之前安裝的目錄,一路點擊下一步即可。

3、如果本機沒有裝個Android SDK , 會提示你安裝,記得依然是選擇非C盤純英文盤符目錄進行安裝。

4、耐心等待自動安裝完成。

隨便創(chuàng)建一個空文件項目

圖片

如何查看反編譯內(nèi)容

在上一步中,我們創(chuàng)建好了一個空項目,這個時候只要拖著我們的apk直接丟到這個項目右側(cè)的黑不拉幾的位置就可以了。

圖片

1、紅框里面的dex文件就是我們對應編譯出來的文件

2、鼠標左鍵單擊對應的dex文件可以查看里面的具體內(nèi)容

圖片

3、需要注意的是,字體顯示是斜體的,并不是真正的內(nèi)容,需要找正正的字體的文件才是正確的

4、當你找到了對應的文件后,右鍵單擊選擇Show Bytecode可以查看該文件的內(nèi)容,這個文件默認是Smail后綴。

圖片

為什么有工具還要用AndroidStudio進行查看

jadx-gui工具雖然也可以查看Smail文件內(nèi)容,并且比AndroidStudio更加的方便,但是如果我們是通過java代碼直接去解析進行反編譯,那么還是使用AndroidStudio更加的貼近我們的代碼格式處理。

當然這個也因人而異。

apktool基礎命令使用

Apktool 是一款逆向工程工具,主要用于Android應用的反編譯(Decompiling)和再編譯(Recompiling),它可以讓你查看應用的資源文件和源代碼。

反編譯 APK

  • 反編譯APK文件

    apktool d [apk文件路徑]

    這條命令會將APK文件反編譯到一個目錄中,目錄名默認為APK文件的文件名。你可以通過-o選項指定輸出目錄:

    apktool d [apk文件路徑] -o [輸出目錄]

再編譯 APK

  • 再編譯已反編譯的目錄

    apktool b [目錄路徑]

    這條命令會將指定的目錄重新編譯成APK文件。默認情況下,輸出的APK位于[目錄路徑]/dist/下。你也可以通過-o選項指定輸出APK的路徑:

    apktool b [目錄路徑] -o [apk文件路徑]

安裝框架資源

  • 安裝框架資源

    apktool if [框架資源apk路徑]

    某些APK在反編譯時需要特定的框架資源文件。這條命令可以將框架資源安裝到Apktool的工作目錄中,以便在反編譯或再編譯時使用。這個在后面的framework-res.apk提取替換會講到。

注意事項

  • 使用Apktool時,可能需要Java環(huán)境。確保系統(tǒng)已經(jīng)安裝了Java,并且JAVA_HOME環(huán)境變量已經(jīng)設置。

  • 反編譯和再編譯的APK需要簽名才能在設備上安裝??梢允褂?code data-line='323'>jarsigner工具對APK進行簽名,后面會講。

keytool密鑰生成

只要電腦里面安裝了java環(huán)境,配置了環(huán)境變量,就可以直接在控制臺輸入keytool查看

D:\Z_Enviroment\Java\jdk1.8.0_251\bin\keytool.exe
D:\Z_Enviroment\Java\jdk1.8.0_251\jre\bin\keytool.exe
C:\Users\xiaozai>keytool
密鑰和證書管理工具

命令:

-certreq 生成證書請求
-changealias 更改條目的別名
-delete 刪除條目
-exportcert 導出證書
-genkeypair 生成密鑰對
-genseckey 生成密鑰
-gencert 根據(jù)證書請求生成證書
-importcert 導入證書或證書鏈
-importpass 導入口令
-importkeystore 從其他密鑰庫導入一個或所有條目
-keypasswd 更改條目的密鑰口令
-list 列出密鑰庫中的條目
-printcert 打印證書內(nèi)容
-printcertreq 打印證書請求的內(nèi)容
-printcrl 打印 CRL 文件的內(nèi)容
-storepasswd 更改密鑰庫的存儲口令

使用 'keytool -command_name -help' 獲取 command_name 的用法

常用命令

# 生成名為privateKeys.keystore密鑰庫
keytool -genkeypair -keysize 1024 -validity 7 -alias 'privateKey' -keystore 'privateKeys.keystore' -storepass '123456' -keypass '123456' -dname 'CN=localhost, OU=localhost, O=localhost, L=SH, ST=SH, C=CN'

# 導出命令
keytool -exportcert -alias 'privateKey' -keystore 'privateKeys.keystore' -storepass '123456' -file 'certfile.cer'

# 導入命令
keytool -importcert -alias 'publicCert' -file 'certfile.cer' -keystore 'publicCerts.keystore' -storepass '123456'

參數(shù)詳解:

keysize:指定大小
validity:指定有效時間,單位天
alias:別名
keystore:指定密鑰庫名稱
storepass:指定密鑰庫密碼
keypass:指定密鑰密碼
dname:唯一判別名,cn 所有者名稱,ou 組織單位名稱,o 組織名稱,l 城市或區(qū)域名稱,st 州或省份名稱,c 兩字母國家代碼

查看證書文件中的證書信息

keytool -printcert -file certfile.cer

查看示列:

所有者: CN=Example, OU=Example Unit, O=Example Organization, L=City, ST=State, C=Country
發(fā)布者: CN=Example CA, OU=Example CA Unit, O=Example CA Organization, L=City, ST=State, C=Country
序列號: 123456789abcdef
有效期開始日期: Thu Jan 01 12:00:00 GMT 2020
截止日期: Fri Jan 01 12:00:00 GMT 2030
證書指紋:
MD5: FA:FB:FC:FD:FE:FF:00:01:02:03:04:05:06:07:08:09
SHA1: DA:DB:DC:DD:DE:DF:10:11:12:13:14:15:16:17:18:19
SHA256: 1A:1B:1C:1D:1E:1F:20:21:22:23:24:25:26:27:28:29:2A:2B:2C:2D:2E:2F:30:31:32:33
簽名算法名稱: SHA256withRSA
版本: 3

簽名工具apksigner和jarsigner

apksignerjarsigner都是用于對Android APK文件進行簽名的工具,但它們來自不同的項目,并且在一些細節(jié)上有所不同。簽名對于Android應用的安裝至關重要,因為Android系統(tǒng)要求所有安裝的應用都必須經(jīng)過簽名。

apksigner

apksigner是Android SDK的一部分,專門設計用于對Android應用包(APK文件)進行簽名和驗證。它支持對APK簽名的所有最新要求和功能,包括對V2、V3簽名方案的支持。

  • 簽名APK

    apksigner sign --ks [keystore文件] --ks-key-alias [別名] [apk文件]

    這條命令使用指定的密鑰庫(keystore)和別名(alias)對APK文件進行簽名。

  • 驗證APK簽名

    apksigner verify [apk文件]

    這條命令用于驗證APK的簽名是否有效。

apksigner提供了更多的選項,如設置簽名算法、指定簽名方案版本等,具體可以通過apksigner --help查看。

jarsigner

jarsigner是一個更通用的工具,主要用于對Java歸檔文件(JAR)進行簽名,但也可用于APK文件。相較于apksigner,jarsigner可能不支持一些針對Android APK特定的簽名特性和要求。

  • 簽名APK

    jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore [keystore文件] [apk文件] [別名]

    這條命令使用指定的密鑰庫和別名對APK文件進行簽名。-sigalg-digestalg選項指定了簽名和摘要算法。

  • 驗證APK簽名

    jarsigner -verify -verbose -certs [apk文件]

    這條命令用于驗證APK文件的簽名。

選擇哪一個?

  • 如果你在進行Android應用開發(fā)和發(fā)布,推薦使用apksigner,因為它支持Android APK簽名的最新標準和要求。

  • 如果你在處理一些與Java密切相關的任務,或者需要一個更通用的簽名工具,jarsigner可能是一個不錯的選擇。

注意

apksignerjarsigner主要用于對已經(jīng)存在的APK文件進行簽名,而不涉及從.aab.apks的轉(zhuǎn)換過程。

bundletool

bundletool 是 Android Studio、Android Gradle 插件和 Google Play 用于構建 Android App Bundle 的底層工具。bundletool 可將 app bundle 轉(zhuǎn)換為部署到設備的各種 APK。

注意事項:不能使用 apksigner 對 App Bundle 進行簽名,要對 App Bundle 進行簽名,請使用 jarsigner。

官方文檔:https://developer./tools/bundletool?hl=zh-cn

1、所需要的資源

  • bundletool.jar :下載地址 - https://github.com/google/bundletool/releases,相關文檔:https://developer./tools/bundletool

  • 要簽名的apk包

  • 簽名文件&秘鑰

2、命令示列

bundletool build-apks --bundle=/MyApp/my_app.aab --output=/MyApp/my_app.apks
--ks=/MyApp/keystore.jks
--ks-pass=file:/MyApp/keystore.pwd
--ks-key-alias=MyKeyAlias
--key-pass=file:/MyApp/key.pwd

注意:如果要直接使用bundletool,需要自建一個bundletool.bat文件,并把它加到環(huán)境變量里面。bundletool.bat內(nèi)容填寫如下:

java -jar yourPath\bundletool.jar %*

最后面的 %* 表示接收任意數(shù)量的參數(shù);

3、bundletool build-apks 命令的選項

標志說明
--bundle=path**(必需)**指定您使用 Android Studio 構建的 app bundle 的路徑。如需了解詳情,請參閱構建您的項目。
--output=path**(必需)**指定輸出 .apks 文件的名稱,該文件中包含了應用的所有 APK 工件。如需在設備上測試此文件中的工件,請按照有關如何將 APK 部署到已連接設備的部分中的步驟操作。
--overwrite使用您通過 --output 選項指定的路徑覆蓋任何現(xiàn)有的輸出文件。如果您不添加此標志,而輸出文件已存在,您會遇到構建錯誤。
--aapt2=path指定 AAPT2 的自定義路徑。 默認情況下,bundletool 包含自己的 AAPT2 版本。
--ks=path(可選)指定用于為 APK 簽名的部署密鑰庫的路徑。如果您不添加此標志,bundletool 會嘗試使用調(diào)試簽名密鑰為您的 APK 簽名。
--ks-pass=pass:password 或 --ks-pass=file:/path/to/file指定密鑰庫密碼。如果您指定純文本格式的密碼,請使用 pass: 限定該密碼。如果您要傳遞包含該密碼的文件的路徑,請使用 file: 限定該路徑。如果您使用 --ks 標志指定密鑰庫,而未指定 --ks-pass,那么 bundletool 會提示您從命令行輸入密碼。
--ks-key-alias=alias指定要使用的簽名密鑰的別名。
--key-pass=pass:password或 --key-pass=file:/path/to/file指定簽名密鑰的密碼。如果您指定純文本格式的密碼,請使用 pass: 限定該密碼。如果您要傳遞包含該密碼的文件的路徑,請使用 file: 限定該路徑。如果此密碼與密鑰庫自身的密碼相同,您可以省略此標志。
--connected-device指示 bundletool 針對已連接設備的配置構建 APK。如果您不添加此標記,bundletool 會為您的應用支持的所有設備配置生成 APK。
--device-id=serial-number如果您有多個已連接的設備,請使用此標志指定要部署應用的設備的序列號。
--device-spec=spec_json提供 .json 文件的路徑,該文件指定了您要針對其生成 APK 的設備配置。如需了解詳情,請參閱有關如何生成并使用設備規(guī)范 JSON 文件的部分。
--mode=universal將模式設置為 universal。如果您希望 bundletool 構建一個包含應用的所有代碼和資源的 APK,以使該 APK 與應用支持的所有設備配置兼容,請使用此選項。注意bundletool 僅包含功能模塊,這些模塊在通用 APK 中的對應清單中指定 <dist:fusing dist:include='true'/>。如需了解詳情,請參閱功能模塊清單。請注意,這些 APK 要比針對特定設備配置優(yōu)化過的 APK 更大。但是,這些 APK 更便于與內(nèi)部測試人員共享,例如想在多種設備配置上測試應用的測試人員。
--local-testing啟用 app bundle 進行本地測試。在本地測試時,由于無需上傳到 Google Play 服務器,因此能夠?qū)崿F(xiàn)快速的迭代測試周期。 如需查看如何使用 --local-testing 標志測試模塊安裝的示例,請參閱 在本地測試模塊的安裝情況。

4、安裝到指定設備

如需從 APK 集部署您的應用,請使用 install-apks 命令并使用 --apks=/path/to/apks 標志指定 APK 集的路徑,如以下命令所示。如果您連接了多個設備,請?zhí)砑?--device-id=serial-id 標志來指定目標設備。

bundletool install-apks --apks=/MyApp/my_app.apks

aab轉(zhuǎn)apks并裝到設備

官方示例:

bundletool build-apks --bundle=/MyApp/my_app.aab --output=/MyApp/my_app.apks

aab轉(zhuǎn)apks重簽名

如果要將這些 APK 部署到設備,您還需要添加應用的簽名信息,如以下命令所示。如果您未指定簽名信息,bundletool 會嘗試使用調(diào)試密鑰為 APK 簽名。

bundletool build-apks --bundle=/MyApp/my_app.aab --output=/MyApp/my_app.apks
--ks=/MyApp/keystore.jks
--ks-pass=file:/MyApp/keystore.pwd
--ks-key-alias=MyKeyAlias
--key-pass=file:/MyApp/key.pwd

實例:

java -jar bundletool.jar build-apks --bundle=/MyApp/my_app.aab --output=/MyApp/my_app.apks 
--ks=yourapp.keystore
--ks-pass=pass:123456
--ks-key-alias=trojan
--key-pass=pass:123456
--overwrite --mode=universal

安裝apks包

java -jar bundletool.jar install-apks --apks=/MyApp/my_app.apks 

apks轉(zhuǎn)apk

apks轉(zhuǎn)apk手動操作直接把apks當作是一個壓縮包,把apks的后綴名改成zip解壓,解壓后的文件中會有一個apk包。

如果使用bash命令,可以參考:

java -jar bundletool.jar build-apks --bundle=/MyApp/my_app.aab --output=/MyApp/my_app.apks 
--ks=yourapp.keystore
--ks-pass=pass:123456
--ks-key-alias=trojan
--key-pass=pass:123456
--overwrite --mode=universal

ren my_app.apks my_app.zip
'C:\Program Files\WinRAR\WinRAR.exe' x -ibck my_app.zip
del my_app.zip
del toc.pb

ren行后面的命令解析:

這段命令是一系列在Windows環(huán)境下使用的批處理命令,旨在重命名一個.apks文件為.zip文件,然后使用WinRAR解壓這個.zip文件,并最后刪除原.zip文件和一個名為toc.pb的文件。下面逐行解析這些命令:

  1. ren my_app.apks my_app.zip:

    • 這行命令使用了Windows的ren(或rename)命令,用于重命名文件。它將名為my_app.apks的文件重命名為my_app.zip。這通常是因為.apks文件實際上是一個特殊格式的.zip文件,重命名后可以使用標準的解壓工具來打開。

  2. 'C:\Program Files\WinRAR\WinRAR.exe' x -ibck my_app.zip:

    • 這行命令調(diào)用了安裝在C:\Program Files\WinRAR\目錄下的WinRAR.exe程序,使用x參數(shù)來解壓my_app.zip文件。x參數(shù)是用來解壓文件并保持原有的目錄結(jié)構。

    • -ibck參數(shù)讓WinRAR在后臺模式下運行,不顯示界面和彈出窗口。這對于批處理操作很有用,因為它不會中斷自動化流程。

    • my_app.zip指定了要解壓的文件名。

  3. del my_app.zip:

    • 使用del命令刪除my_app.zip文件。

  4. del toc.pb:

    • 最后,使用del命令刪除名為toc.pb的文件。

整個命令序列的目的是將一個.apks文件轉(zhuǎn)換成標準的.zip格式,然后解壓它,最后清理所有不再需要的文件。

aab轉(zhuǎn)apk并裝到設備

1、aab轉(zhuǎn)為apks(參考上面的步驟)

2、apks后綴改為zip解壓縮為apk

3、使用adb命令安裝apk

adb -s 設備id install my_app.apk 

framework-res.apk提取替換

某些APK在反編譯時需要特定的框架資源文件。這時候我們需要對我們的框架資源文件進行更新或者替換。未來避免更新后帶來的各種問題,所以需要把更新前的框架資源文件備份一份。

判斷是否安裝有 framework-res.apk

apktool if framework-res.apk

1、把設備中的framework-res.apk提取出來

連接對應的Android設備,這里我使用的是Android14設備,拉取設備上的框架資源文件到PC端。

圖片


adb pull /system/framework/framework-res.apk

2、把framework-res.apk解析到對應文件夾

java -jar apktool_2.9.2.jar if framework-res.apk

附:1:提取設備系統(tǒng)apk

adb pull system/app test 
adb pull system/priv-app test
adb pull data/app test

#注解:
/system/app 存放rom本身附帶的軟件即系統(tǒng)軟件;
/data/app 存放用戶安裝的軟件;


#注意:
/system/priv-app/下的apk不用系統(tǒng)簽名,就能夠獲取signatureOrSystem權限。
/system/app/下的apk,要獲取signatureOrSystem權限,必須用系統(tǒng)簽名才行。
/data/app下面的apk無法提取,需要把它復制到別的目錄下,在下載到電腦
adb shell cp /data/app/com.xueqiu.android-TKqF3b6wXa1KQ3KyKK6o6Q==/base.apk /sdcard/temp123


#獲取apk包名
aapt dump badging PartnerBookmarksProvider.apk

#獲取包名所在路徑
adb shell pm path 包名

附加2:用python寫一個通用的apk提取代碼

import os

#獲取apk的包名
import time

class Pull_apk():

def __init__(self,package_name,windows_apk_path):
'''
: package_name : apk的包名
: windows_apk_path : 指定電腦存儲apk的路徑
'''
self.get_package_name = package_name
self.self.windows_apk_path = windows_apk_path

def pull_select_apk(self):
#獲取apk所在的路徑
apk_path_cmdshow = os.popen(f'adb shell pm path {self.get_package_name}').read()
apk_path = apk_path_cmdshow.split(':')[1].strip()
apk_name = apk_path.split('/')[-1]
windows_apk_path = self.windows_apk_path
#嘗試提取到windows系統(tǒng),如果提取不了,則復制到設備的sdcard目錄中,再提取到Windows
try:
msg = os.popen(f'adb pull {apk_path} {windows_apk_path} ').read()
print('----------------')
if '1 file pulled' in msg:
print('apk復制成功')
else:
#復制到sdcard目錄下
os.system(f'adb shell cp {apk_path} /sdcard/')
time.sleep(3)
os.system(f'adb pull /sdcard/{apk_name} {windows_apk_path}')
print('else分支,apk復制成功')
except Exception as e :
print(e)
return apk_name

混淆加密

Allatori的介紹

1、allatori是第二代的java混淆器;

2、具有命名混淆,流混淆、字符串混淆以及水印技術等等強大的混淆功能, 因此對混淆后的代碼進行逆向工程幾乎是不可能的;

3、允許對需要混淆代碼的應用程序添加有效期;

4、對代碼混淆效果非常強,而且操作簡單;

5、不足是混淆之后對程序的性能有較大的影響,混淆之后運行速度會有所降低(一般來說只要對代碼進行混淆,多多少少都會對性能產(chǎn)生一定的影響的);

使用方法

1、首先從官網(wǎng)下載:http://www./

2、下載完解壓,解壓之后的目錄是這樣的:

圖片

3、新建一個文件夾

圖片

4、進入lib目錄將allatori.jar復制到新建的test文件夾、進入tutorial\step01\files目錄將Clean.bat、config.xml、RunAllatori.bat復制到新建的test文件夾中

圖片

5、將需要混淆的jar包拷貝到新建的test文件中

圖片


6、修改Clean.bat的內(nèi)容

del log.xml
del test-1.0-SNAPSHOT-mix.jar

圖片


7、修改RunAllatori.bat的內(nèi)容

java -Xms128m -Xmx512m -jar allatori.jar config.xml

圖片


  • java -Xmx3550m -Xms3550m -Xmn2g -Xss128k

  • ①、-Xmx3550m:設置JVM最大可用內(nèi)存為3550M.

  • ②、-Xms3550m:設置JVM促使內(nèi)存為3550m.此值可以設置與-Xmx相同,以避免每次垃圾回收完成后JVM重新分配內(nèi)存.

  • ③、-Xmn2g:設置年輕代大小為2G.整個堆大小=年輕代大小 年老代大小 持久代大小.持久代一般固定大小為64m,所以增大年輕代后,將會減小年老代大小.此值對系統(tǒng)性能影響較大,Sun官方推薦配置為整個堆的3/8.

  • ④、-Xss128k:設置每個線程的堆棧大小.JDK5.0以后每個線程堆棧大小為1M,以前每個線程堆棧大小為256K.更具應用的線程所需內(nèi)存大小進行 調(diào)整.在相同物理內(nèi)存下,減小這個值能生成更多的線程.但是操作系統(tǒng)對一個進程內(nèi)的線程數(shù)還是有限制的,不能無限生成,經(jīng)驗值在3000~5000左右.

8、修改config.xml

<config>
<input>
<jar in='test-1.0-SNAPSHOT.jar' out='test-1.0-SNAPSHOT-mix.jar'/>
</input>


<ignore-classes>
<!--不混淆 引入的第三方jar包-->
<!--<class template='class *org*' />-->
<!--不混淆的類-->
<!--<class template='class com.*' />-->
</ignore-classes>

<keep-names>
<class access='protected '>
<field access='protected '/>
<method access='protected '/>
</class>
</keep-names>

<property name='log-file' value='log.xml'/>
</config>

圖片


11、此時雙擊Clean.bat會刪除混淆后的jar包以及l(fā)og文件 12、混淆效果

  • (1)混淆前:

圖片


  • (2)混淆后:

圖片


遇到的問題 - 解決方案

dos命令有中文路徑的.bat亂碼

打開.bat文件→另存為→編碼改為ANSI格式,點擊保存,替換原來的.bat文件就行。

AndroidStudio問題

項目構建失敗解決

圖片

直接點擊Upgrade Gradle wrapper to 7.2 version and re-import the project進行更新即可

圖片

gradle失敗解決

1、第一次點擊main進行調(diào)試,系統(tǒng)會進行Gradle,代碼報錯

1.1、在com.test.rebuilttool -> api -> ApiCost.java,修改代碼如下:

package com.test.rebuilttool.api;  

public class ApiConst {
public static final String DOAMIN_URL='https://open-api-cn./';
public static final String LOGIN_URL=DOAMIN_URL 'modules/accounts/login';
public static final String TOKEN_URL=DOAMIN_URL 'oauth/access_token';
public static final String FILE_URL= DOAMIN_URL 'modules/accounts/key';
}

2、下載gradle 壓縮包失敗,檢查網(wǎng)絡,確認下網(wǎng)絡沒有被墻,重新下載即可。

3、檢查Gradle配置的JDK是否正確,如果提示升級,直接點升級即可。

圖片

亂碼報錯解決

1、Gradle成功,但是build失敗,控制臺輸出亂碼

2、由于中文注釋默認是GBK,AndroidStudio能夠正常顯示,但是編譯的時候GBK中文被gradle認為是不可映射的字符,所以會報錯。

3、修改AndroidStudio的VM Options,增加UTF-8編碼支持。

4、Help----->Edit Custom VM options

圖片

5、增加UTF-8編碼設置

# custom Android Studio VM options, see https://developer./studio/intro/studio-config.html  
-Dfile.encoding=UTF-8

圖片

6、File—>Invalid caches./Restart 重啟重啟軟件

圖片

簽名過程失?。?error: attribute android:enableOnBackInvokedCallback not found.

搜索到官方回復:https://github.com/iBotPeaches/Apktool/issues/3041,需要更新framework的API到34,這就是我們上面提到過的,資源框架需要更新。

圖片


更新到本機

圖片

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多