日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

反编译APK文件的三种方法

發布時間:2025/3/21 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 反编译APK文件的三种方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
因為學習Android編程的需要,有時我們需要對網絡上發布的應用項目進行學習,可是Android項目一般是通過APK文件進行發布的,我們看不到源代碼,嘿嘿,辦法總會有的,而且不止一個...

?? ps:對于軟件開發人員來說,保護代碼安全也是比較重要的因素之一,不過目前來說Google Android平臺選擇了Java Dalvik VM的方式使其程序很容易破解和被修改,首先APK文件其實就是一個MIME為ZIP的壓縮包,我們修改ZIP后綴名方式可以看到內部的文件結構,類似Sun JavaMe的Jar壓縮格式一樣,不過比較去別的是Android上的二進制代碼被編譯成為Dex的字節碼,所有的Java文件最終會編譯進該文件中去,作為托管代碼既然虛擬機可以識別,那么我們就可以很輕松的反編譯。所有的類調用、涉及到的方法都在里面體現到,至于邏輯的執行可以通過實時調試的方法來查看,當然這需要借助一些我們自己編寫的跟蹤程序。Google最然在Android Market上設置了權限保護app-private文件夾的安全,但是最終我們使用修改定值的系統仍然可以獲取到需要的文件。

一、dexdump方法

????? dexdump是emulator自帶提供的查看dex文件的工具,可使用類似這樣的命令將dex文件dump到txt文件中:

????? D:\Program Files\android-sdk-windows-1.6_r1\platforms\android-1.6\tools>dexdump.exe -d classes.dex > spk.dump.txt

???? 得到的文件內容,描述了類的信息,但實在是不好讀啊~~~~

二、dex2jar + XJad 方法

???? 該方法是使用dex2jar.jar包,將classes.dex文件解包成jar,在通過XJad(或者其他class反編譯工具)進行java反編譯。如:

???? 1、dex2jar.bat d:\play\classes.dex

????????? 默認的輸出路徑同classes.dex,生成的文件名為classes.dex.dex2jar.jar

???? 2、使用XJad反編譯該jar包

????????? 之后的使用方法,大家都懂的:)

???? 該方法的好處在于,通過XJad反編譯后,大家可直接開到java源文件,缺點在于只能反編譯出開發時的java文件,而開發時使用的lib包不能反編譯出來。

三、AXMLPrinter2.jar + baksmali.jar + smali.jar 方法

????? 這個方法就強大了,AXMLPrinter2是還原AndroidManifest.xml和main.xml的工具,直接打開這兩個xml文件是亂碼,而通過還原之后,可以很明白的看到里面的內容(我猜測還是使用了字節異或的方式加的密)。

????? baksmali.jar是反解析dex的工具,smali.jar則是再還原成dex的工具

????? 操作方式如下:

???? 1、java -jar AXMLPrinter2.jar D:\play\AndroidManifest.xml > AndroidManifest.txt

???? 2、java -jar AXMLPrinter2.jar D:\play\res\layout\main.xml > main.txt

???? 3、java -jar baksmali-1.2.5.jar -o classout/ d:\play\classes.dex

????? baksmali可解析(注意,是解析,不是反編譯)原java包以及引用的lib包,解析出的文件認真看還是能看懂,比如以下片段:

view plaincopy to clipboardprint?
.class Lcom/paul/test/a;??
.super Landroid/view/View;??
?
# static fields??
.field private static final a:Landroid/graphics/Typeface;??
?
# instance fields??
.field private b:I??
.field private c:I??
.field private d:Z??
.field private e:J??
.field private f:I??
.field private l:[Ljava/lang/String;??
?
# direct methods??
.method static constructor <clinit>()V??
??? .registers 2?
??? sget-object v0, Landroid/graphics/Typeface;->SANS_SERIF:Landroid/graphics/Typeface;??
??? const/4 v1, 0x0?
??? invoke-static {v0, v1}, Landroid/graphics/Typeface;->create(Landroid/graphics/Typeface;I)Landroid/graphics/Typeface;??
??? move-result-object v0??
??? sput-object v0, Lcom/wiyun/ad/a;->a:Landroid/graphics/Typeface;??
??? return-void?
.end method??
#??
# other methods ..........??
#??
# virtual methods??
.method public onKeyUp(ILandroid/view/KeyEvent;)Z??
??? .registers 4?
??? const/16 v0, 0x42?
??? if-eq p1, v0, :cond_8??
??? const/16 v0, 0x17?
??? if-ne p1, v0, :cond_b??
??? :cond_8??
??? invoke-direct {p0}, Lcom/paul/test/a;->d()V??
??? :cond_b??
??? const/4 v0, 0x0?
??? invoke-virtual {p0, v0}, Lcom/paul/test/a;->setPressed(Z)V??
??? invoke-super {p0, p1, p2}, Landroid/view/View;->onKeyUp(ILandroid/view/KeyEvent;)Z??
??? move-result v0??
??? return v0??
.end method?
.class Lcom/paul/test/a;
.super Landroid/view/View;

# static fields
.field private static final a:Landroid/graphics/Typeface;

# instance fields
.field private b:I
.field private c:I
.field private d:Z
.field private e:J
.field private f:I
.field private l:[Ljava/lang/String;

# direct methods
.method static constructor <clinit>()V
??? .registers 2
??? sget-object v0, Landroid/graphics/Typeface;->SANS_SERIF:Landroid/graphics/Typeface;
??? const/4 v1, 0x0
??? invoke-static {v0, v1}, Landroid/graphics/Typeface;->create(Landroid/graphics/Typeface;I)Landroid/graphics/Typeface;
??? move-result-object v0
??? sput-object v0, Lcom/wiyun/ad/a;->a:Landroid/graphics/Typeface;
??? return-void
.end method
#
# other methods ..........
#
# virtual methods
.method public onKeyUp(ILandroid/view/KeyEvent;)Z
??? .registers 4
??? const/16 v0, 0x42
??? if-eq p1, v0, :cond_8
??? const/16 v0, 0x17
??? if-ne p1, v0, :cond_b
??? :cond_8
??? invoke-direct {p0}, Lcom/paul/test/a;->d()V
??? :cond_b
??? const/4 v0, 0x0
??? invoke-virtual {p0, v0}, Lcom/paul/test/a;->setPressed(Z)V
??? invoke-super {p0, p1, p2}, Landroid/view/View;->onKeyUp(ILandroid/view/KeyEvent;)Z
??? move-result v0
??? return v0
.end method


認真一看,就知道:

# static fields???????????? 定義靜態變量的標記

# instance fields??????? 定義實例變量的標記

# direct methods?????? 定義靜態方法的標記

# virtual methods????? 定義非靜態方法的標記

?

以onKeyUp方法為例,其中定義了處理邏輯,if-eq p1, v0, :cond_8 表示如果p1和v0相等,則執行cond_8的流程:

??? :cond_8
??? invoke-direct {p0}, Lcom/paul/test/a;->d()V

調用com.paul.test.a的d()方法

不相等: if-ne p1, v0, :cond_b 則執行cond_b的流程:

??? :cond_b
??? const/4 v0, 0x0

??? invoke-virtual {p0, v0}, Lcom/paul/test/a;->setPressed(Z)V

??? invoke-super {p0, p1, p2}, Landroid/view/View;->onKeyUp(ILandroid/view/KeyEvent;)Z

??? move-result v0

?

大概意思就是調用com.paul.test.a的setPressed方法,然后再調用父類View的onKeyUp方法

最后 return v0

????? 該方法,能把外部引用的lib包類也解析出來,能開到包的全貌。缺點在于,解析出的smali文件并不是反編譯出的java文件,可讀性降低了,但仔細研究也能看出大概。

總結

以上是生活随笔為你收集整理的反编译APK文件的三种方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。