PS: 最近沒工作,沒工作就沒需求,沒需求就沒什麼技術總結的靈感,那就沒更新什麼。但是兩個月不更新了,要是三個月不更新就會出大事,所以這次打算做一件有意思又不難的事。
之前有發文章寫過反編譯,今天就來試試反編譯之正編譯,開玩笑的,就是試試手動編譯的過程, 平時我們在項目中編譯出包都是使用Gradle直接執行assemble任務就能解決,我打算試試手動模擬整個過程。當然我也是第一次這樣搞,所以如果有寫得不對的地方,還望指出。
眾所周知,apk實質上就是一個壓縮包。復習一下,我們寫個最簡單的Demo,然後打包,然解壓,注意是解壓,不是反編譯,意義是不同的。
注意我這個Demo很簡單,什麼都不引入
然後我們看看整個出包的過程,隨便從網上拿張圖
然後這里我們用Android SDK給我們提供的工具來完成整個流程,工具在sdk文件夾下的build-tools文件夾下,有什麼aapt.exe、dx.bat,用的就是這些
這步應該是整個流程最簡單的吧,我感覺,所以從最簡單的開始。
我們先看看生成的dex有什麼
對比項目,我是一開始最基本的項目,什麼都沒動,所以只有一個MainActivity.clas,所以這里肯定是要先想辦法得到BuildConfig.class和R.class。
輸入命令:
aapt p -f -m -J <輸出路徑> -S <res路徑> -I <android.jar路徑> -M <Manifest路徑>
下一步,我們需要BuildConfig.class
這個BuildConfig.java是由gradle在我們配置好gradle之後自己幫我們生成的,所以我們直接拿來用,然後再javac就得到class文件了
然後我們再編譯我們的MainActivity.java並將它們放到同一個文件夾下, MainActivity因為引用了Android.jar和R文件,所以編譯時注意點,我為此被動好好的復習了一遍javac,都是淚
最後一步,我們用dx工具就能打出dex文件了
然後執行命令就得到一個Dex文件,看看這個文件裡面和上面直接打出的apk中的Dex文件有什麼不同:
看圖,我們上一步已經生成.dex了,那麼我們需要和compiled Resource 還有 Other Resource 一起生成APK。
我們先來生成compiled Resource,也就是resources.arsc
發現之前使用aapt生成R文件的時候沒寫完整,當時可以加一個-F參數直接生成arsc和Manifest
導出的abc.zip裡面就有resources.arsc和AndroidManifest.xml。
因為之前寫漏了,所以肯定要重新編一次MainActivity.java和Dex
我們把剛才的dex文件和aapt生成的resources.arsc、AndroidManifest.xml和res放到一個文件夾裡面。
PS:res文件夾也是上面aapt的命令生成的
然後我們對比這個文件夾和之前apk解壓的文件夾
最後運行
看來是成功了。
再說說遇到的還有兩個問題,並說下我解決問題的思路
(1)我把它們都放到一個文件夾之後,我壓縮成壓縮包,然後改後綴成.apk,然後發現安裝不了,我就直接反編譯,發現發編譯失敗,提示包有問題,以我多點玩包的經驗,我感覺就是壓縮工具出了問題,然後我去下個「好壓」(這不是廣告啊),然後就能正常反編譯了。
(2)但是還是安裝不了,再根據我多年的玩包經驗,我感覺是簽名問題,然後我隨便給這個包上一個簽名,就能正常安裝得到上圖的結果了。
總體來說,還真挺好玩的,這整個過程,就是翻車了幾次。做完之後感覺非常牛逼,為什麼這樣說,因為我知道這整個過程,我就可以做到,我不經過gradle來打包,我自己寫個python腳本來調用aapt和dx來打包也是能做到的。
當然上面純屬異想天開,因為這是個什麼都沒有的Demo所以覺得簡單,要是一個真實的項目,我感覺肯定要有很多坑,別的先不說,一個項目那麼多依賴關系,我這javac要搞死人。
最後如果有不對的地方,希望有大佬能夠指出,畢竟能運行也不能證明完全沒問題。然後我使用的build-tools是28的,不敢保證其它版本包括以後版本的玩法都一樣。
『貳』 python生成exe文件與exe文件的反編譯
一、Python生成exe文件
1.使用Anaconda Prompt
通過打開Anaconda Prompt,切換到項目使用的環境,運行pyinstaller命令,生成的exe文件會自動存放於默認路徑下的dist文件夾內。
2.使用命令行窗口cmd
設置好三個環境變數,特別是pyinstaller文件夾路徑,打開cmd後,直接輸入pyinstaller命令,生成的exe文件將會被放置在cmd路徑下的dist文件夾中。
二、exe文件反編譯成py文件
1.從exe文件轉pyc文件
下載pyinstxtractor工具,使用在Prompt或cmd中運行,生成的文件夾main.exe_extracted中可以找到main.pyc文件。
2.從pyc文件轉回exe
安裝反編譯工具uncompyle6,運行在Prompt或cmd中,生成main.py文件。
三、pyinstaller參數總結
-F, –onefile: 打包為單個文件,適用於單個.py文件的代碼。
-D, –onedir: 打包多個文件,適用於框架形式的工具代碼,便於維護。
-K, –tk: 包含TCL/TK。
-a, –ascii: 不包含編碼,默認在支持Unicode的版本上包含所有編碼。
-d, –debug: 生成調試版本的可執行文件。
-w, –windowed, –noconsole: 窗口模式執行,不開啟命令行窗口(僅適用於Windows)。
-c, –nowindowed, –console: 控制台模式執行。
-s, –strip: 通過strip壓縮可執行文件和共享庫,注意Cygwin的strip可能影響普通Win32 DLL。
-X, –upx: 使用UPX壓縮執行文件及Windows中的DLL。
-o DIR, –out=DIR: 指定輸出目錄。
-p DIR, –path=DIR: 設置導入路徑。
-i ICO_PATH, –icon=ICO_PATH: 添加圖標至可執行文件。
-v VERFILE, –version=VERFILE: 添加版本信息。
-n NAME, –name=NAME: 指定項目名稱。
四、參考資料
詳細參考資料包括但不限於官方文檔和社區教程,用於深入理解使用方法和參數細節。