本公眾號也有留言功能啦!歡迎大家留言紀念!
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命令行窗口,使用如下兩個命令進行驗證。
如下圖所示,則是配置環(huán)境變量成功。
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
安裝框架資源
注意事項
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
apksigner
和jarsigner
都是用于對Android APK文件進行簽名的工具,但它們來自不同的項目,并且在一些細節(jié)上有所不同。簽名對于Android應用的安裝至關重要,因為Android系統(tǒng)要求所有安裝的應用都必須經(jīng)過簽名。
apksigner
apksigner
是Android SDK的一部分,專門設計用于對Android應用包(APK文件)進行簽名和驗證。它支持對APK簽名的所有最新要求和功能,包括對V2、V3簽名方案的支持。
apksigner
提供了更多的選項,如設置簽名算法、指定簽名方案版本等,具體可以通過apksigner --help
查看。
jarsigner
jarsigner
是一個更通用的工具,主要用于對Java歸檔文件(JAR)進行簽名,但也可用于APK文件。相較于apksigner
,jarsigner
可能不支持一些針對Android APK特定的簽名特性和要求。
選擇哪一個?
注意
apksigner
和jarsigner
主要用于對已經(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、所需要的資源
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
的文件。下面逐行解析這些命令:
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:
整個命令序列的目的是將一個.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、混淆效果
遇到的問題 - 解決方案
dos命令有中文路徑的.bat亂碼
打開.bat文件→另存為→編碼改為ANSI格式,點擊保存,替換原來的.bat文件就行。
AndroidStudio問題
項目構建失敗解決