標籤:可行性 2.0 text .sh sso 日誌 fill ext 代碼
最近遇到了須要改動apk原始碼的問題,於是上網查了下相關資料。編寫了HelloWorld進行改動看看可行性,經過實驗證明此方案可行,而且後來也成功用這種方法對目標apk進行了改動,僅僅只是須要改動的部分比HelloWorld複雜些,可是僅僅要瞭解下smali也能進行相關的改動,以下講下詳細的步驟,文中所用到的資源會在文章的結尾給出,感興趣的能夠下載試試。
首先介紹下要用到的工具:
jdk:這個不用多說了
baksmali:把classes.dex轉為為smali檔案的工具
dex2jar:classes.dex轉為jar包的工具
jdgui:閱讀jar檔案的工具(分linux和windows版本號碼。資源中一併給出)
smali:把smali檔案編譯打包為classes.dex的工具
當中關於baksmali和smali能夠看下Google的介紹http://code.google.com/p/smali/(如今須要FQ)
dex2jar和jdgui不是必須的。僅僅是用來查看原始碼的,由於直接看smali檔案難度較大
以下為文章所用資源的:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHVjaGVycg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >
反編譯後得到的dex檔案以及轉為jar包後都無法進行改動。僅僅能把dex檔案轉化為smali檔案進行改動。然後再編譯打包為dex檔案,替換掉原有apk中的dex檔案。然後對apk進行簽名,這樣就完畢了對apk原始碼的改動,詳細過程例如以下:(下面操作是在linux下進行。windows可能會略有差異)
1.解壓apk檔案,擷取classes.dex並複製到資源根資料夾(使用zip或其它解壓工具就可以)
2.使用baksmali工具將classes.dex轉為smali檔案。在命令列定位到資源根資料夾並運行:
java -jar baksmali-2.0.3.jar -x classes.dex
運行完後會在當前檔案夾下產生out檔案夾。檔案夾結構跟原始碼同樣。在相應檔案夾下尋找相應的smali檔案
3.使用dex2jar工具把dex轉為jar檔案。拷貝classes.dex到資源檔夾下的dex2jar-0.0.9.15檔案夾下,把命令列定位到該檔案夾並運行:
./dex2jar.sh classes.dex (windows:dex2jar.bat classes.dex)
運行完後會在當前檔案夾下產生classes_dex2jar.jar檔案,然後能夠通過jdgui進行查看
4.使用jdgui工具查看HelloWorld的原始碼。依據不同的系統開啟資源檔夾下相應的jdgui工具,然後把第3步產生的classes_dex2jar.jar檔案拖到工具中,效果例如以下:
5.改動相應的smali檔案,以下看看相應的smali檔案的部分:
當中螢光筆畫出部分就是須要改動的地方,在這個範例中就改動為"hello world!modify success",儲存檔案
6.使用smali-2.0.3.jar工具把smali檔案轉為dex檔案。把命令列定位到資源根資料夾並運行:
java -jar smali-2.0.3.jar -o classes.dex out
運行完後會產生並替換掉根資料夾下的classes.dex檔案,這樣就改動成功了
7.把新產生的classes.dex檔案替換到原來的apk檔案中(使用壓縮公用程式)
8.使用簽名工具對apk進行簽名。把apk複製到資源根資料夾下的sign_tool檔案夾,把命令列定位到該檔案夾並運行:
java -jar signapk.jar platform.x509.pem platform.pk8 HelloWorld.apk Signed.apk
運行完後會在該檔案夾下產生Signed.apk檔案。這個檔案就是終於的檔案了
9.卸載原來的HelloWorld,安裝第8步中產生的Signed.apk檔案,執行效果例如以:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHVjaGVycg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >
最後,講講我在實際改動中的一點小技巧:我想在目標apk的某些地方加入日誌,選擇了toast的方式,可是直接編寫太難,所以就在這個HelloWorld上加入了一句toast,然後在相應的smali檔案中查看產生的程式碼。然後copy到目標apk相應的檔案中進行測試。包含後來的switch語句也都是這樣來分析的,以下看看列印toast的smali語句吧(在實際案例中可能須要改動變數名,由於可能跟內容相關的變數名衝突)
const-string v0, "this is a test" const/16 v1, 0x3e8 invoke-static {p0, v0, v1}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast; move-result-object v0 invoke-virtual {v0}, Landroid/widget/Toast;->show()V
資源下載點這裡^^
Android對apk原始碼的改動--反編譯+原始碼改動+又一次打包+簽名【附HelloWorld的改動執行個體】