radar4hooker/makeDex4linux.sh at master · CreditTone/radar4hooker
腳本代碼逐行深度理解
這是一個(gè)Android 平臺(tái) Java 工程編譯 + 依賴包合并 + 重命名 + 生成 Dex 文件的自動(dòng)化 Shell 腳本,核心用途:把你的 Java 爬蟲/鉤子代碼 + 所有第三方依賴,打包成可在 Android 上運(yùn)行的 Jar 和 Dex 文件。
我會(huì)逐行拆解,并總結(jié)整體流程,新手也能看懂。
一、逐行代碼解釋
1. 清理舊編譯文件
rm -rf classes/
mkdir classes
-
rm -rf classes/:強(qiáng)制刪除舊的classes文件夾(清空之前的編譯產(chǎn)物) -
mkdir classes:新建空的classes文件夾,存放新的編譯結(jié)果
2. 收集所有 Java 源碼文件
find . -name "*.java">sources.txt
- 遞歸查找當(dāng)前目錄下所有 .java 后綴的代碼文件
- 把文件路徑全部寫入
sources.txt文本文件,給編譯器批量讀取
3. 核心:編譯 Java 代碼
javac -encoding utf-8 -Xlint:unchecked -classpath android.jar:android-support-v4.jar:... -d classes @sources.txt
這是Java 編譯命令,參數(shù)含義:
-
javac:Java 編譯器 -
-encoding utf-8:指定編碼為 UTF-8,防止中文亂碼 -
-Xlint:unchecked:開啟未檢查類型轉(zhuǎn)換的警告提示 -
-classpath xxx.jar:編譯依賴,告訴編譯器:代碼用到了這些 Android 框架/第三方庫 -
-d classes:編譯后的class 字節(jié)碼文件全部輸出到 classes 文件夾 -
@sources.txt:批量編譯文件里列出的所有 Java 源碼
4. 復(fù)制第三方 Jar 包到編譯目錄
cp nanohttpd-2.3.1.jar classes/
cp okhttp-3.12.6.jar classes/
cp okio-1.15.0.jar classes/
cp fastjson-1.2.9.jar classes/
- 把網(wǎng)絡(luò)請(qǐng)求、JSON 解析等依賴庫,復(fù)制到
classes目錄,為后續(xù)合并做準(zhǔn)備
5. 進(jìn)入編譯目錄,解壓所有 Jar 包
cd classes/
jar xvf nanohttpd-2.3.1.jar
jar xvf okhttp-3.12.6.jar
jar xvf okio-1.15.0.jar
jar xvf fastjson-1.2.9.jar
-
cd classes/:進(jìn)入編譯輸出目錄 -
jar xvf xxx.jar:解壓 Jar 包,把所有依賴庫的 class 文件全部解壓出來,和你自己的代碼混在一起
6. 刪除無用 Jar,打包合并所有代碼
rm -rf *.jar
jar cvf merge.jar .
cd ..
-
rm -rf *.jar:刪除已經(jīng)解壓過的 Jar 包 -
jar cvf merge.jar .:把當(dāng)前目錄所有文件(你的代碼 + 所有依賴)打包成一個(gè) merge.jar -
cd ..:回到上級(jí)目錄
7. Jar 包重命名(防沖突)
java -jar jarjar-1.3.jar process rule.txt classes/merge.jar classes/xradar.jar
rm classes/merge.jar
- 使用
jarjar工具:按照rule.txt規(guī)則修改包名,避免和其他項(xiàng)目包名沖突 - 輸出最終 Jar:
xradar.jar - 刪除臨時(shí)文件
merge.jar
8. 生成 Android 可運(yùn)行的 Dex 文件
alias dx=$ANDROID_HOME/build-tools/30.0.3/dx
dx --dex --output=classes/radar.dex classes/xradar.jar
- Android 不能直接運(yùn)行標(biāo)準(zhǔn) Jar,必須轉(zhuǎn)成 Dex 格式
-
dx --dex:Android 構(gòu)建工具,把 Jar 轉(zhuǎn)換成 Dex 文件 - 輸出:
radar.dex(給 Hook 工具/Android 設(shè)備直接運(yùn)行)
9. 最終提示
echo "xradar.jar 用于你的爬蟲工程."
echo "radar.dex用于替換hooker根目錄下的radar.dex"
告訴用戶兩個(gè)文件的用途:
-
xradar.jar:給 Java 爬蟲項(xiàng)目做依賴庫 -
radar.dex:替換 Hook 工具里的文件,在 Android 上運(yùn)行
二、整體流程總結(jié)(最核心)
這個(gè)腳本做了5 件大事:
- 清理 + 收集代碼:找到所有 Java 文件
- 編譯代碼:用 Android 依賴庫編譯成 class 文件
- 合并 Jar:把你的代碼 + 所有第三方庫,打包成一個(gè)完整 Jar
- 重命名防沖突:用 jarjar 修改包名
- 生成 Dex:轉(zhuǎn)換成 Android 可執(zhí)行的 Dex 文件
三、這個(gè)腳本的用途
你大概率是在做:
- Android 爬蟲 / 數(shù)據(jù)采集
- Android Hook 開發(fā)(Xposed、Frida 相關(guān))
- Java 代碼打包成 Android 可執(zhí)行文件
它的價(jià)值:一鍵完成編譯、合并、轉(zhuǎn)換,不用手動(dòng)操作。
總結(jié)
- 這是自動(dòng)化編譯打包腳本,用于 Android Java 項(xiàng)目
- 核心結(jié)果:生成
xradar.jar(開發(fā)用)+radar.dex(Android 運(yùn)行用) - 依賴 Android SDK、第三方庫、jarjar 工具
- 全程無需人工干預(yù),執(zhí)行腳本即可完成全套流程
rule.txt
rule okhttp3.** gz.okhttp3.@1
rule okio.** gz.okio.@1
結(jié)合之前的Shell腳本和jarjar工具的使用邏輯,這份rule.txt是jarjar工具的包名重命名規(guī)則配置文件,核心作用是修改第三方依賴的包名,避免包名沖突,下面分維度詳細(xì)解釋:
一、核心語法解析
jarjar工具的重命名規(guī)則格式為:rule 原包名匹配規(guī)則 新包名模板,其中關(guān)鍵符號(hào)含義:
-
**:通配符,匹配原包名下的所有子包、類、接口(遞歸匹配); -
@1:占位符,代表匹配到的**對(duì)應(yīng)的所有內(nèi)容,會(huì)原封不動(dòng)映射到新包名中。
對(duì)應(yīng)本次的兩條規(guī)則:
-
rule okhttp3.** gz.okhttp3.@1:將okhttp3包下的所有內(nèi)容,重命名為gz.okhttp3包下的同名內(nèi)容; -
rule okio.** gz.okio.@1:將okio包下的所有內(nèi)容,重命名為gz.okio包下的同名內(nèi)容。
二、具體重命名效果
以實(shí)際類為例,重命名后類的全限定名會(huì)發(fā)生如下變化:
-
okhttp3.OkHttpClient→gz.okhttp3.OkHttpClient -
okhttp3.Request→gz.okhttp3.Request -
okio.Buffer→gz.okio.Buffer -
okio.ByteString→gz.okio.ByteString - 包括子包(如
okhttp3.internal)也會(huì)同步重命名:okhttp3.internal.Util→gz.okhttp3.internal.Util。
三、為什么要做包名重命名?(核心目的)
這份規(guī)則是為了解決Android開發(fā)中常見的包名/類名沖突問題,結(jié)合你的腳本場(chǎng)景(爬蟲/Hook開發(fā)),原因主要有兩點(diǎn):
-
宿主應(yīng)用沖突:你的Hook代碼最終會(huì)運(yùn)行在Android宿主應(yīng)用中,如果宿主應(yīng)用本身已經(jīng)集成了
okhttp3/okio庫,且版本和你使用的(okhttp3.12.6、okio1.15.0)不一致,會(huì)出現(xiàn)類加載沖突,導(dǎo)致Hook代碼崩潰; -
工程自身沖突:如果你的爬蟲/Hook工程后續(xù)引入其他依賴,而這些依賴也包含
okhttp3/okio,會(huì)出現(xiàn)依賴重復(fù)、版本沖突的問題,重命名后可實(shí)現(xiàn)依賴隔離。
簡單說:把第三方庫的包名加上自定義前綴gz.,讓它成為專屬的獨(dú)立包,和其他任何庫都不會(huì)產(chǎn)生命名沖突。
四、和Shell腳本的聯(lián)動(dòng)邏輯
在腳本中這行命令會(huì)加載該規(guī)則并執(zhí)行重命名:
java -jar jarjar-1.3.jar process rule.txt classes/merge.jar classes/xradar.jar
執(zhí)行流程為:
- jarjar工具讀取
rule.txt中的兩條重命名規(guī)則; - 對(duì)
merge.jar(你的代碼+所有解壓的第三方類)中的okhttp3/okio相關(guān)類執(zhí)行包名重命名; - 將重命名后的所有內(nèi)容重新打包為
xradar.jar,最終生成的radar.dex也會(huì)沿用重命名后的包名。
補(bǔ)充:jarjar的作用邊界
本次規(guī)則僅重命名了okhttp3和okio,而腳本中還集成了nanohttpd、fastjson,說明這兩個(gè)庫在目標(biāo)運(yùn)行環(huán)境(Hook宿主/爬蟲工程)中無沖突風(fēng)險(xiǎn),因此無需配置重命名規(guī)則。如果后續(xù)出現(xiàn)沖突,只需在rule.txt中新增對(duì)應(yīng)規(guī)則即可,格式與現(xiàn)有兩條一致。