Androd安全——反編譯技術完全解析

0.前言

單純從技術角度上來講,掌握反編譯功能確實是一項非常有用的技能。另外既然別人可以反編譯程序,我們當然有理由應該對程序進行一定的保護,因此代碼混淆也是我們必須要掌握的一項技術。看完此篇如果對代碼混淆也感興趣,可以參考Android安全——混淆技術完全解析

?

1反編譯

Android的反編譯主要又分為兩個部分,一個是對代碼反編譯,一個是對資源反編譯

?

1.1 代碼反編譯

要想將APK文件中的代碼反編譯出來,我們需要用到以下兩款工具:

adex2jar這個工具用于將dex文件轉換成jar文件。

下載地址:http://sourceforge.net/projects/dex2jar/files/

bjd-gui這個工具用于將jar文件轉換成Java代碼。

下載地址:http://jd.benow.ca/

?

1)我們首先將APK文件進行解壓,可以先將文件后綴名改成zip,然后用解壓軟件打開。解壓之后你會發現里面有一個classes.dex文件

2classes.dex就是存放所有Java代碼的地方,我們將它拷貝到dex2jar解壓后的目錄下,并在cmd中也進入到同樣的目錄,然后執行:

d2j-dex2jar classes.dex
3)如果沒有報任何錯誤,這就說明我們已經轉換成功了。現在觀察dex2jar目錄,你會發現多了classes-dex2jar.jar這個文件。但是對于我們而言,jar文件也不是可讀的,因此這里還需要再借助一下jd-gui這個工具來將jar文件轉換成Java代碼。

4)最后一步就是使用jd-gui工具打開classes-dex2jar.jar這個文件。我們便得到了Java代碼。基本已經做到了90%以上的還原工作,像setContentView()方法傳入的參數,反編譯也就只能將相應的id值進行還原,而無法變成像R.layout.activity_main這樣直觀的代碼展示。另外,除了MainActivity之外,引用的library也會作為代碼的一部分被打包到classes.dex文件當中,因此反編譯的時候這些代碼也會一起被還原。

?

1.2 資源反編譯

要想將APK文件中的資源反編譯出來,又要用到另外一個工具了:

Apktool用于最大幅度地還原APK文件中的9-patch圖片、布局、字符串等等一系列的資源

下載地址:http://ibotpeaches.github.io/Apktool/install/

1)下載該工具后目錄下會存在apktool.batapktool.jar這兩個文件

2)我們將APK文件拷貝到和這兩個文件同樣的目錄下,然后cmd也進入到這個目錄下,并在cmd中執行如下命令:

apktool d <APKName>.apk

3)第二步成功后我們會發現在當前目錄下多了一個<APKName>文件夾,這個文件夾中存放的就是反編譯的結果了。我們可以打開AndroidManifest.xmlres/layout即可查看資源信息。

【拓展】

第二步命令中ddecode的意思,表示我們要對Demo.apk這個文件進行解碼。那除了這個基本用法之外,我們還可以再加上一些附加參數來控制decode的更多行為:

-f //如果目標文件夾已存在,則強制刪除現有文件夾(默認如果目標文件夾已存在,則解碼失敗)。
-o //指定解碼目標文件夾的名稱(默認使用APK文件的名字來命名目標文件夾)。
-s //不反編譯dex文件,也就是說classes.dex文件會被保留(默認會將dex文件解碼成smali文件)。
-r //不反編譯資源文件,也就是說resources.arsc文件會被保留(默認會將resources.arsc解碼成具體的資源文件)。


2.? 重新打包

首先我們來看一下通過apktool反編譯后的包目錄情況,如下圖所示:


1)其中,original文件夾下存放的是未經反編譯過、原始的AndroidManifest.xml文件

2res文件夾下存放的是反編譯出來的所有資源

3smali文件夾下存放的是反編譯出來的所有代碼

4AndroidManifest.xml則是經過反編譯還原后的manifest文件

這里值得一提的是smali文件夾,如果你進入到這個文件夾中你會發現它的目錄結構和我們源碼中src的目錄結構是幾乎一樣的,主要的區別就是所有的Java文件都變成了smali文件smali文件其實也是真正的源代碼,只不過它的語法和Java完全不同,它有點類似于匯編的語法,是Android虛擬機所使用的寄存器語言,如果你能夠看得懂smali文件的話,那么你就可以做很恐怖的事情了——你可以隨意修改應用程序內的邏輯,將其進行破解。我們可以稍微改變smali文件里的部分內容,并重新打包,只需要在cmd中執行如下命令:

apktool b Demo -o <New_APKName>.apk 

其中bbuild的意思,表示我們要將Demo文件夾打包成APK文件,-o用于指定新生成的APK文件名。成功后便在當前目錄下生成了apk文件。


3.??重新簽名

不過目前這個<New_APKName>.apk還是不能安裝的,因為它還沒有進行簽名。我們顯然沒有辦法拿到原作者的簽名,因此我們只能拿自己的簽名文件對這個APK文件重新進行簽名,重新打包出來的軟件也就是個盜版軟件。使用Android Studio或者Eclipse都可以非常簡單地生成一個簽名文件。

有了簽名文件之后在cmd中執行簽名命令就可以進行簽名了,命令格式如下:

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

1)其中jarsigner命令文件是存放在jdkbin目錄下的,需配置系統的環境變量。下同。

2)簽名之后的APK文件現在已經可以安裝到手機上了,不過在此之前為了使得我們的程序在Android系統中運行得更快,我們需要對簽名后的APK文件進行一次對齊操作(使用的是zipalign工具,存放于<Android SDK>/build-tools/<version>目錄下),命令格式如下:

zipalign 4 <New_APKName>.apk <New_APKName_aligned >.apk

3)其中4是固定值不能改變,后面指定待對齊的APK文件名和對齊后的APK文件名。運行這段命令之后就會生成一個<New_APKName_aligned >.apk文件,便可以在手機上運行我們重新打包過后的APK了。

?

轉載整理自郭大俠博客:http://blog.csdn.net/guolin_blog/article/details/49738023


轉載于:https://www.cnblogs.com/qitian1/p/6461528.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/256453.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/256453.shtml
英文地址,請注明出處:http://en.pswp.cn/news/256453.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python——shape 與reshape

轉載自:https://blog.csdn.net/u010916338/article/details/84066369 shape()和reshape()都是數組array中的方法 numpy中reshape函數的三種常見相關用法 numpy.arange(n).reshape(a, b) 依次生成n個自然數&#xff0c;并且以a行b列的數組形式顯示np.arange(16).reshape(2,…

誤刪了microsoft visual c++后如何正常運行matlab

誤刪了microsoft visual c后如何正常運行matlab 本人在卸載visual studio2013的時候&#xff0c;因為這個軟件卸載的過程中出現一些問題&#xff0c;誤將visual c當成VS的組件一同刪除了。但是在打開matlab 時發現出錯&#xff0c;matlab打開后會出現下面的界面。 出現這個問題…

iScreenLocker 3.1.8 安卓鎖屏通知--蘋果一樣的體驗

*軟件介紹:蘋果鎖屏通知(iScreenLocker)是一款android上ios風格的鎖屏軟件。它顛覆安智通知設計&#xff0c;將原來狀態欄的通知搬到鎖屏界面上來&#xff0c;能夠在桌面輕松收發短信,微博,微信等消息。它獨有的消息喚醒功能。能使手機從待機界面喚醒而消耗非常少的電量。手指輕…

JSP慕課網階段用戶登錄小例子(不用數據庫)

getAttribute和setAttribute一起使用&#xff0c;而getParameter用于取得如request傳來的參數。 Web是請求/響應架構的使用&#xff0c;而request和response就是在服務器端生成的相應的兩個對象&#xff0c;request能夠獲取客戶端傳遞的參數及相關的一些信息&#xff0c;而resp…

機器學習python——python基礎

目錄 1、常用庫 2、shape與reshape&#xff0c;dtype 3、range、arange、linspace、logspace 4、數組的計算、切片 5、繪圖基本設置 6.三維繪圖 1、常用庫 numpy、scipy、matplotlib、math 2、shape與reshape&#xff0c;dtype https://blog.csdn.net/qq_45769063/arti…

win10環境下如何給visual studio 2013永久配置opencv3.1.0環境

win10環境下如何給visual studio 2013永久配置opencv3.1.0環境 本人在給visual studio 2013配置opencv 環境下遇到過一些問題&#xff0c;比如配置不成功或者不能永久配置opencv環境。先將自己的配置經驗分享于此&#xff0c;希望同道中的好友可以用上。 首先自行下載Visual s…

屬性名、變量名與 內部關鍵字 重名 加

procedure TForm4.btn3Click(Sender: TObject); varMyQj: TQJson;MyPrinter: TPrinter; beginMyQj : TQJson.Create;tryMyPrinter.name : A號打印機;MyPrinter.status : enabled;MyPrinter.&type : yes;MyQj.FromRecord<TPrinter>(MyPrinter);Memo1.Lines.Add(MyQj.A…

機器學習——支持向量機SVM之線性模型

目錄 一、沒有免費的午餐定理 二、支持向量機SVM&#xff08;support vector machine&#xff09; 1、線性模型和非線性模型 2、如何在線性模型中畫出一條直線&#xff08;優化過程——vplink&#xff09; 1&#xff09;多少條&#xff1f; 2&#xff09;如何畫出最好的直…

Oauth2.0和1.0區別

1.0的授權分3步, A)客戶端到授權服務器請求一個授權令牌(request token&secret) B)引導用戶到授權服務器請求授權 C)用訪問令牌到授權服務器換取訪問令牌(access token&secret) D)用訪問令牌去訪問得到授權的資源 2.0的用戶授權過程有2步&#xff0c; A)引導用戶到授權…

選導師,定方向

選導師&#xff0c;定方向。 看文獻看到9.40&#xff0c;實在是看不下去&#xff0c;索性寫一些自己這近兩年來的研究生生涯的一些感悟&#xff0c;希望對還在迷茫中的你們有一點點的啟示&#xff08;如果談不上啟示&#xff0c;那就當給你們一點安慰&#xff09;。 ** 選導師…

在apache中設置訪問目錄后進入的默認頁面為index.php

找到apache的配置文件httpd.conf后找到 DirectoryIndex index.html index.php 在其中添加index.php, 轉載于:https://www.cnblogs.com/itdi/p/5844517.html

spring@PropertySource用法

v測試例子 package com.hjzgg.auth.config;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annot…

機器學習——支持向量機SVM之非線性模型(低維到高維映射)

目錄 一、非線性模型的最優化問題 1、非線性模型最優化模型 2、兩個概念 1&#xff09;正則項&#xff08;regularization term&#xff09; 2&#xff09;調參參數 2、高維映射 1&#xff09;定義及作用 2&#xff09;高維映射后的最優化模型 3&#xff09;異或問題&…

html表單中get與post之間的區別

當用戶在 HTML 表單 (HTML Form) 中輸入信息并提交之后&#xff0c;有兩種方法將信息從瀏覽器傳送到 Web 服務器 (Web Server)。 一種方法是通過 URL&#xff0c;另外一種是在 HTTP Request 的 body 中。 前一種方法&#xff0c;我們使用 HTML Form 中的 method "get&quo…

世界坐標系,攝像機坐標系、圖像坐標系關系匯總

**攝像機標定&#xff1a;**在計算機視覺研究領域&#xff0c;攝像機標定是一個重要的環節。攝像機標定就是求取攝像機內外參數的過程。 世界坐標系&#xff1a;絕對坐標系&#xff0c;一般的三維場景都由這個坐標系來表示。攝像機可以放置在環境中的任何位置&#xff0c;因此可…

SpringMVC-HelloWorld

2&#xff0e;5、Hello World入門 2.5.1、準備開發環境和運行環境&#xff1a; ☆開發工具&#xff1a;eclipse ☆運行環境&#xff1a;tomcat6.0.20 ☆工程&#xff1a;動態web工程&#xff08;springmvc-chapter2&#xff09; ☆spring框架下載&#xff1a; spring-framework…

CSVN備份初體驗

備份方法挺多的&#xff0c;目前我知道有四種 其一&#xff1a; 首先復制舊csvn服務器上repositories下的版本庫文件夾到新csvn服務器repositories文件夾下面&#xff08;做以下修改時最好把csvn服務停掉&#xff09; 然后復制舊csvn的svn_auth_file到新csvn上&#xff08;相當…

機器學習——支持向量機SVM之非線性模型(原問題和對偶問題)

目錄 一、原問題&#xff08;prime problem&#xff09; 二、原問題的對偶問題&#xff08;dual problem&#xff09; 1、定義一個輔助函數 2、定義對偶問題 >>>問題1&#xff1a;上面說到遍歷w&#xff0c;那w的取值范圍和取值步長是怎樣的&#xff1f;即遍歷的…

(轉)Apache?Rewrite?詳解

(轉)Apache Rewrite 詳解參考文檔&#xff1a;http://man.chinaunix.net/newsoft/ApacheManual/mod/mod_rewrite.htmlApache Rewrite 詳解一 入門RewriteEngine onRewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php就這兩行. 然后就完成了URL重寫功能了. 首先服務器是需要支…

python輪廓函數的使用

在圖像的處理中有時候需要對圖像中的目標區域提出出輪廓 讀取圖像 調用OpenCV的庫使用cv.imread()來讀取圖像。 圖像為 灰度化 二值化 提取輪廓時&#xff0c;圖像一般都是二值化后的圖像。在本次程序中選用cv2.THRESH_BINARY的二值化方式。即將大于閾值的部分設定為255&am…