Android對apk原始碼的改動--反編譯+原始碼改動+又一次打包+簽名【附HelloWorld的改動執行個體】

來源:互聯網
上載者:User

標籤:可行性   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的改動執行個體】

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.