Android反編譯

一.嘗試對demo進行反編譯

應用打包成APK之后,把后綴名改成zip然后進行解壓得到以下目錄


這個就是APK的目錄
META-INF里面的是簽名文件,res里面是資源文件,classes.dex就是我們的java代碼編譯后的文件

1.查看JAVA代碼

既然能拿到classes.dex文件之后,我們就能有辦法看到java的代碼,這邊需要兩個工具:

(1)dex2jar 這個工具能將dex文件轉(zhuǎn)換成jar文件
http://sourceforge.net/projects/dex2jar/files/

下載dex2jar的解壓包后解壓,然后將classes.dex文件拷貝到解壓后的目錄下,命令行輸入d2j-dex2jar classes.dex,比如我這里



然后得到相應的jar文件


(2)jd-gui這個工具能查看jar文件
官網(wǎng)我下不了,我是在網(wǎng)盤下的。

下載完之后打開exe文件,然后找到路徑打開之前轉(zhuǎn)換好的jar文件

這里就能找到我們在AS中寫的java代碼,當然并不會完全相同,但至少能看得懂。

2.apktool

上面的方法只是為了方便瀏覽APK中java的代碼,但反編譯中最主要的工具還是apktool ,它不僅可以幫助瀏覽資源文件,還能給之前的代碼加點料。

下載apktool 工具
https://ibotpeaches.github.io/Apktool/install/

這個工具下載有些麻煩,首先要下載兩個文件


第一個.bat文件


它提示是讓你點右鍵保存那個連接就是下載了。
然后是.jar文件,這個要下最新的,我下的時候點到死都點不開,我還以為是要翻墻才能下,這個連接是不太好弄,點開另一個連接
https://ibotpeaches.github.io/Apktool/
然后

點detalis,在里面再點下載,反正我點Download是死都點不開,如果你像我一樣的話點detalis在里面下就行了。注意,這個jar包的名字無論下載下來是什么,都要改成apktool.jar

下好這兩個文件之后在命令窗口輸入apktool看看能否正常使用,出現(xiàn)個版本號這些信息就說明是能正常使用了。


然后我照了別人的寫法用命令apktool d app-release.apk反編譯apk,就能得到一個文件,比如我這邊

這個文件里面res就能夠查看之前項目中的資源文件,比如我的布局文件


圖中的original就是我們之前解壓后的簽名文件,打開可以看到


smali

需要講一下的是這里會得到一個smali文件夾,里面就是我們的代碼,只不過是.smali格式的而不是.java格式的


什么是smali?smali是將Android字節(jié)碼用可閱讀的字符串形式表現(xiàn)出來的一種語言,可以稱之為Android字節(jié)碼的反匯編語言。

重新打包

我這里修改了xml中一個textview的信息后重新打包看看會有怎么樣的結果。

運行命令apktool b app-release -o newtest.apk
然后就會在文件夾下得到一個新的apk文件

然后把apk傳到手機安裝,發(fā)現(xiàn)會出現(xiàn)這樣的效果

很明顯能看出安裝失敗的原因是沒有證書,我特意展示這一步就是為了說明我們打包時的證書其實是有用的,就算別人能拿到我們的apk,沒有簽名證書,它也做不了什么。

好了,假如它通過某種方法拿到了證書(我這里直接對這個apk進行證書簽名)
關于對apk進行簽名,我記得好像我以前整理過,但是我不是寫在簡書,忘記寫哪了,所以就只能重新看看了。

把簽名文件拷貝到當前文件夾,然后輸入以下命令
jarsgner-verbose-keystore[keystorePath]-singnedjar [apkOut] [apkln] [alias]

比如我這里的



我就輸入
jarsgner -verbose -keystore onestore.jks -singnedjar new.apk newtest.apk KylinReverse

這樣就能給未簽名的apk進行簽名,然后我們在安裝這個apk,打開后對比結果

發(fā)現(xiàn)對比之前的textview,目前顯示的內(nèi)容是我用apktool改過之后的內(nèi)容。

二.嘗試對別人的APP進行反編譯

從上面也能看出就算你能正常反編譯到別人的項目,你沒有簽名文件,還是沒有辦法進行重新打包,那我們反編譯的目的是為了什么,既然不能往別人的代碼里加點料,那么看看別人的代碼總能提高一下自己的水平吧,比如(反編譯別人的APK是不對了,這里我先道歉)

目錄就不展示了,直接瀏覽java代碼看看會是怎樣的情況

我試了幾次發(fā)現(xiàn)這里還是沒辦法打開文件,不知道他那邊是有做加固的原因還是我這邊操作出了什么問題,本來還想看一下混淆之后是什么樣子的,現(xiàn)在只能到講混淆的時候再看效果了。

三.總結

探索反編譯的整個過程最主要的是為了之后總結混淆和加固的時候方便些,那么至于反編譯有什么意義,我也不太清楚,沒怎么接觸到。如果你說是為了惡意改別人的代碼,對不起,道不同不相為謀。如果說是為了看別人的代碼,其實也不太有必要,比如一些大廠的技術別人都寫好文章公開出來給你了,比如阿里、美團這些,再則一些寫得好的項目別人肯定會放到gayhub上,還附上說明給你,所以說反編譯是為了去看代碼,有時候可能確實需要但是也很繞彎子。所以我覺得這東西沒啥好深入去玩的,暫時簡單了解一下就行,真正用到的時候再詳細去看。文章大部分都是參考https://blog.csdn.net/guolin_blog/article/details/49738023

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容