1. 程式人生 > >手把手教你搞懂 Android 反編譯

手把手教你搞懂 Android 反編譯

我們知道,Android的程式打包後會生成一個APK檔案,這個檔案可以直接安裝到任何Android手機上,因此,反編譯就是對這個APK進行反編譯。Android的反編譯分成兩個部分:

  1. 一個是對程式碼反編譯,也就是java檔案的反編譯。
  2. 一個是對資源反編譯,也就是res檔案的反編譯。

所需的工具

反編譯程式碼的工具:

反編譯資源的工具:

熱身準備

它的主要功能是模擬郵箱啟用,如果我們輸入了錯誤的資料則無法通過啟用。所以我們的目的很簡單,就是讓這個判斷邏輯失效。

主要原始碼說明:

第51行儲存的正確的兩個啟用號碼,通過:將賬號密碼隔開,如下

1

2

3

4

private static final String[] DUMMY_CREDENTIALS = new String[]{

            "[email protected]:20135115",

            "[email protected]:20135115"

};

現在只有啟用碼正確才能通過啟用。

第331行是Execute函式,邏輯判斷的部分。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

    @Override

    protected void onPostExecute(final Boolean success) {

        mAuthTask = null;

        showProgress(false);

        if (success) {

            new AlertDialog.Builder(LoginActivity.this)

                    .setTitle("恭喜您")

                    .setMessage("成功啟用!")

                    .show();

//                finish();

        } else {

            mPasswordView.setError(getString(R.string.error_incorrect_password));

            mPasswordView.requestFocus();

        }

    }

反編譯程式碼

dex2jar解壓下來檔案很多,在mac上我們需要用到dex2jar的是這三個東西(windows上對應用bat檔案):

  • d2j_invoke.sh
  • d2j-dex2jar.sh
  • lib

AndroidStudio打包好的APK檔案的字尾,需改為.zip,然後解壓。從解壓的檔案中找到classes.dex檔案,並將其放入dex2jar同一目錄下,如下:

並在cmd中也進入到同樣的目錄,然後執行:

Shell

1

sh d2j-dex2jar.sh classes.dex

執行如下:

然後我們會得到一個classes-dex2jar.jar檔案,我們藉助JD-GUI工具開啟即可,開啟如下:

可以看到程式碼非常清晰,這樣我們就可以看到整個APP的程式碼邏輯了。

反編譯資源

apktool下載完成後有一個.sh檔案和.jar檔案,我們把APK放進來,如下:

在cmd中進入apktool目錄,執行命令:

1

sh apktool.sh apktool d FooApp.apk

d是decode的意思,表示我們要對FooApp解碼,結果如下:

然後你會驚喜的發現多了一個FooApp資料夾。

主要目錄說明:

  • AndroidManifest.xml:描述檔案
  • res:資原始檔
  • smail:反編譯出來的所有程式碼,語法與java不同,類似彙編,是Android虛擬機器所使用的暫存器語言

修改App icon

開啟我們的描述檔案,高清無碼:

可以看到我們的App icon名稱為ic_launcher,我們找到所有mipmap開頭的資料夾,替換成下圖即可:

ic_launche

在最後重新打包後我們的App icon就會被修改了,不過在重新打包之前,我們還有最重要的一件事沒有做,那就是修改啟用碼判斷邏輯。

修改邏輯

我們通過原始碼或者JD-GUI檢視反編譯的程式碼可以看到啟用碼判斷邏輯如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

@Override

    protected void onPostExecute(final Boolean success) {

        mAuthTask = null;

        showProgress(false);

        if (success) {

        // 啟用碼正確

            new AlertDialog.Builder(LoginActivity.this)

                    .setTitle("恭喜您")

                    .setMessage("成功啟用!")

                    .show();

//                finish();

        } else {

            mPasswordView.setError(getString(R.string.error_incorrect_password));

            mPasswordView.requestFocus();

        }

    }

所以我們只需要找到反編譯後的if(success)的語句,並將其修改成if(!success)即可,如下:

1

2

3

4

5

6

if (success)//修改成if(!success)

{

...

} else {

...

}

這樣我們就成功的顛倒了以前的邏輯,我們輸入一個錯誤的啟用碼,就會被判斷成正確的。挺簡單的,是吧。

現在我們來動手修改:

  1. 開啟smail裡的LoginActivity$UserLoginTask.smali檔案.
  2. 全域性搜尋if-eqz,通過AlertDialog關鍵字輔助定位,發現在第228行

  3. ok,就是這裡了,然後將if-eqz修改成if-nez,他們對應Java的語法如下:
Smail 語法 Java 語法
if-eqz v0, if(v0 == 0)
if-nez v0, if(v0 != 0)

ok,大功告成,現在就可以重新打包了。關於smail語法,有興趣的直接Google就行了。

重新打包

我們大概修改後兩個地方,其實重新打包也十分簡單,在cmd中執行以下命令即可:

1

sh apktool.sh b FooAPP -o NewFooApp.apk

其中b是build的意思,表示我們要將FooAPP資料夾打包成APK檔案,-o用於指定新生成的APK檔名,這裡新的檔案叫作NewFooApp.apk。執行結果如下圖所示:

然後你會發現同級目錄下生成了新的apk檔案:

但是要注意,這個apk現在還是不能安裝的,因為我們沒有對它進行簽名,重新簽名後它就是個名副其實的盜版軟體了,大家一定要強烈譴責這種行為。

重新簽名

重新簽名也是很簡單的,我直接用的一個已有簽名檔案,使用Android Studio或者Eclipse都可以非常簡單地生成一個簽名檔案。

在cmd中執行格式如下:

1

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore 簽名檔名 -storepass 簽名密碼 待簽名的APK檔名 簽名的別名

然後我們就可以用這個apk進行安裝了,為了追求更快的執行速度,我們可以對其進行一次位元組對齊,這裡就不說了。

使用盜版APK

我們用NewFooApp.apk安裝好盜版app後,發現圖示變成了籃球,並且隨便輸入資料都能通過激活了:

怎麼樣?總的來說還是挺有意思的吧,不過別用歪了。

相關推薦

手把手 Android 編譯

我們知道,Android的程式打包後會生成一個APK檔案,這個檔案可以直接安裝到任何Android手機上,因此,反編譯就是對這個APK進行反編譯。Android的反編譯分成兩個部分: 一個是對程式碼反編譯,也就是java檔案的反編譯。 一個是對資源反編譯,也就是res檔案

手把手JavaScript正則表示式之方法

咱們來看看JavaScript中都有哪些操作正則的方法。 RegExp RegExp 是正則表示式的建構函式。 使用建構函式建立正則表示式有多種寫法: new RegExp('abc'); // /abc/ new RegExp('abc', 'gi'); // /abc/gi

手把手如何在Android下進行JNI開發(入門)

在進行Android開發的過程中,我們必定會遇到視訊影象處理、高強度密集運算、特殊演算法等場景,這時我們就不得不需要去接觸一些C/C++程式碼,進行JNI開發。下面我將從Android.mk和CMake這兩種方式教大家如何進行開發。文章結尾將給出演示的專案程式碼,如果你能耐心地仔細看完,相信你一定能掌握

20 分鐘 Git!

Git 是最流行的版本管理工具,也是程式設計師必備的技能之一。本文就來教你 20 分鐘搞懂 Git! 以下為譯文: 儘管每天你都會用到Git,但也有可能搞不懂它的工作原理。為什麼Git可以管理版本?基本命令git add和git commit到底在

20分鐘Git!

Git 是最流行的版本管理工具,也是程式設計師必備的技能之一。本文就來教你 20 分鐘搞懂 Git! 以下為譯文: 儘管每天你都會用到Git,但也有可能搞不懂它的工作原理。為什麼Git可以管理版本?基本命令git add和git commit到底在幹什麼

來, 看過來, 20分鐘Git!

Git 是最流行的版本管理工具,也是程式設計師必備的技能之一。本文就來教你 20 分鐘搞懂 Git! 以下為譯文: 儘管每天你都會用到Git,但也有可能搞不懂它的工作原理。為什麼Git可以管理版本?基本命令git add和git commit到底在幹什麼?

手把手如何配置Android環境-(二)Eclipse+ADT和AndroidStudio

主要展示如何配置Windows的Android開發環境,包括IDE和一些環境變數,注意事項及一些細節部位我會仔細描述講解出來,希望對大家有所幫助。 檔案列表:api17-23的sdk,jdk,eclipse,android-studio,genymot

【Bugly乾貨分享】手把手逆向分析 Android 程式

很多人寫文章,喜歡把什麼行業現狀啊,研究現狀啊什麼的寫了一大通,感覺好像在寫畢業論文似的,我這不廢話,先直接上幾個圖,感受一下。 第一張圖是在把程式碼注入到地圖裡面,啟動首頁的時候彈出個浮窗,下載網路的圖片,蒼老師你們不會不認識吧? 第二張圖是微信運動步

龍虎榜手把手

1.什麼樣的股票會上龍虎榜? 有三類: 1日常交易 日收盤價漲跌幅偏離值達±7% 日振幅達15% 日換手率達20% 這很簡單,但很多人搞混了,有說前5名,有說前3名,注意了:深市分主機板、中小板、創業板,每個條件各選前5名的上榜。滬市每個條件各選前3名上榜。如果條件相

手把手如何配置Android環境-(一)Java環境變數

主要展示如何配置Windows的Android開發環境,包括IDE和一些環境變數,注意事項及一些細節部位我會仔細描述講解出來,希望對大家有所幫助。 檔案列表:api17-23的sdk,jdk,eclipse,android-studio,genymot

Webpack實戰(八):webpack如果實現程式碼分片(code splitting)

2020年春節已過,本來打算回鄭州,卻因為新型冠狀病毒感染肺炎的疫情公司推遲了上班的時間,我也推遲了去鄭州的時間,在家多陪娃幾天。以前都是在書房學習寫部落格,今天比較特殊,抱著電腦,在樓頂晒著太陽,陪著家人,寫著部落格。 前面的幾篇文章主要告訴大家如何安裝、配置webpack、webpack實現樣式分離

一文幫 Android 檔案描述符

介紹檔案描述符的概念以及工作原理,並通過原始碼瞭解 Android 中常見的 FD 洩漏。 一、什麼是檔案描述符? 檔案描述符是在 Linux 檔案系統的被使用,由於Android基 於Linux 系統,所以Android也繼承了檔案描述符系統。我們都知道,在 Linux 中一切

手把手編譯別人的app

展示 總結 直接 HR RR 具體實現 導致 執行 pil 雖然iOS系統相比於其他手機操作系統相對安全,但是這個安全並不是絕對的,我一直相信,道高一尺魔高一丈。此文想以實際例子出發,告訴大家,如何去反編譯一個app,並且從某個角度來說,iO

「Netty實戰 02」手把手實現自己的第一個 Netty 應用!新手也能

[大家好,我是 **「後端技術進階」** 作者,一個熱愛技術的少年。](https://www.yuque.com/docs/share/aaa50642-c892-4c41-8c0c-9d2fc2b0d93c?#%20%E3%80%8A%E8%B5%B0%E8%BF%9B%E5%90%8E%E7%AB%AF

手把手_怎麽找android應用的包名和啟動activity

color don dsm too key 包名 ani 一個 col 自己主動化測試中常常遇到這個問題,關於這個題目,方法眾多,咱的目的是找個比較簡單靠譜的: 方法一: 先進入cmd窗體,adb shell 後: cd /data/d

手把手Android Studio 3.0上分析內存泄漏

pan style http name ans tle andro edi ont 手把手教你在Android Studio 3.0上分析內存泄漏手把手教你在Android Studio 3.0上分析內存泄漏

手把手制作微信小程序,開源、免費、快速

免費 list life 支付 直接 domain -i 方式 poster 最近做了個“羅孚傳車”的小程序 一時興起,做了一個小程序,將個人收集的同汽車相關的行業資訊和學習資料,分享到小程序中,既作為歷史資料保存,又提供給更多的人學習和了解,還能裝一下:) 掃描下方小程序

一文看Mockito『手把手 Mockito 的使用』

什麼是 Mockito Mockito 是一個強大的用於 Java 開發的模擬測試框架, 通過 Mockito 我們可以建立和配置 Mock 物件, 進而簡化有外部依賴的類的測試. 使用 Mockito 的大致流程如下: 建立外部依賴的 Mock 物件, 然後將此 Mock 物件注入

手把手使用Android Paging Library

當我們用RecyclerView來展示伺服器返回的大量資料時,通常我們都需要實現分頁的效果。以前我們都是通過監聽RecyclerView的滾動事件,當RecyclerView滑動到底部的時候再次請求網路,把資料展示到RecyclerView上。現在Google提供了一個分頁庫來幫助開發者

手把手如何開啟湯不熱(Tumblr),輕鬆一招定~

小夥伴們肯定都知道tumblr這個高大上的東東,但是國內好像無法開啟~ 下面我就給大家詳細講解下tumblr登入方法和註冊方法 1.可以去搜索下載一款工具 安裝,如圖 2.選擇國外節點 連線之後,OK,成功開啟tumblr~ 分享給你們一些我關注的有