1. 程式人生 > >Android對apk源代碼的改動--反編譯+源代碼改動+又一次打包+簽名【附HelloWorld的改動實例】

Android對apk源代碼的改動--反編譯+源代碼改動+又一次打包+簽名【附HelloWorld的改動實例】

str 技術 命令行 文章 color 不同的 pop ogl 方法

最近遇到了須要改動apk源代碼的問題,於是上網查了下相關資料。編寫了HelloWorld進行改動看看可行性,經過實驗證明此方案可行,而且後來也成功用這種方法對目標apk進行了改動,僅僅只是須要改動的部分比HelloWorld復雜些,可是僅僅要了解下smali也能進行相關的改動,以下講下詳細的步驟,文中所用到的資源會在文章的結尾給出,感興趣的能夠下載試試。


首先介紹下要用到的工具:

jdk:這個不用多說了

baksmali:把classes.dex轉為為smali文件的工具
dex2jar:classes.dex轉為jar包的工具
jdgui:閱讀jar文件的工具(分linux和windows版本號。資源中一並給出)
smali:把smali文件編譯打包為classes.dex的工具


當中關於baksmalismali能夠看下谷歌的介紹http://code.google.com/p/smali/(如今須要FQ)

dex2jar和jdgui不是必須的。僅僅是用來查看源代碼的,由於直接看smali文件難度較大


以下為文章所用資源的截圖:

技術分享


反編譯後得到的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文件,執行效果例如以下圖:

技術分享技術分享



最後,講講我在實際改動中的一點小技巧:我想在目標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的改動實例】