Android逆向工程(一)-Apktool使用
當我們辛辛苦苦寫的程式碼被別人抄走的時候一定會讓我們非常的抓狂。要學會防守,我們也需要知道別人進攻的方式,接下來我們學習下如何破解Apk。Apktool是家喻戶曉的逆向工具,我們學習下如何使用它。
安裝
http://ibotpeaches.github.io/Apktool/install/http://ibotpeaches.github.io/Apktool/install/
這個是官方的教程連結。目前最新版本是2.1.1,不斷地更新到最新的版本是很有用的,舊版本的一些bug,在新版本很多都得到了解決。
選擇自己的作業系統對應的教程,我們這裡選擇的是Mac,步驟已經非常的詳細了,我這裡就不再贅述了。
安裝成功後,我們寫一個Demo測試一下效果。
建一個工程隨便寫點什麼,在Android Studio工程的app/build/outputs/apk目錄下找到apk然後執行命令,教程地址
命令是apktool d 後面跟apk的名字,然後執行。
執行完在apk的檔案目錄下得到一個新的資料夾開啟是這樣的。
開啟清單檔案
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.caoxiao.forapktooldemo" platformBuildVersionCode ="23" platformBuildVersionName="6.0-2704002">
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme">
<activity android:name="com.example.caoxiao.forapktooldemo.MainActivity" >
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
xml檔案
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin">
<TextView
android:id="@id/helloTV"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
<Button
android:id="@id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true" />
</RelativeLayout>
MainActivity.smali
.class public Lcom/example/caoxiao/forapktooldemo/MainActivity;
.super Landroid/support/v7/app/AppCompatActivity;
.source "MainActivity.java"
# instance fields
.field private btn:Landroid/widget/Button;
.field private helloTV:Landroid/widget/TextView;
# direct methods
.method public constructor <init>()V
.locals 0
.prologue
.line 10
invoke-direct {p0}, Landroid/support/v7/app/AppCompatActivity;-><init>()V
return-void
.end method
.method static synthetic access$000(Lcom/example/caoxiao/forapktooldemo/MainActivity;)Landroid/widget/TextView;
.locals 1
.param p0, "x0" # Lcom/example/caoxiao/forapktooldemo/MainActivity;
.prologue
.line 10
iget-object v0, p0, Lcom/example/caoxiao/forapktooldemo/MainActivity;->helloTV:Landroid/widget/TextView;
return-object v0
.end method
# virtual methods
.method protected onCreate(Landroid/os/Bundle;)V
.locals 2
.param p1, "savedInstanceState" # Landroid/os/Bundle;
.prologue
.line 17
invoke-super {p0, p1}, Landroid/support/v7/app/AppCompatActivity;->onCreate(Landroid/os/Bundle;)V
.line 18
const v0, 0x7f040019
invoke-virtual {p0, v0}, Lcom/example/caoxiao/forapktooldemo/MainActivity;->setContentView(I)V
.line 20
const v0, 0x7f0c0050
invoke-virtual {p0, v0}, Lcom/example/caoxiao/forapktooldemo/MainActivity;->findViewById(I)Landroid/view/View;
move-result-object v0
check-cast v0, Landroid/widget/TextView;
iput-object v0, p0, Lcom/example/caoxiao/forapktooldemo/MainActivity;->helloTV:Landroid/widget/TextView;
.line 21
const v0, 0x7f0c0051
invoke-virtual {p0, v0}, Lcom/example/caoxiao/forapktooldemo/MainActivity;->findViewById(I)Landroid/view/View;
move-result-object v0
check-cast v0, Landroid/widget/Button;
iput-object v0, p0, Lcom/example/caoxiao/forapktooldemo/MainActivity;->btn:Landroid/widget/Button;
.line 22
iget-object v0, p0, Lcom/example/caoxiao/forapktooldemo/MainActivity;->btn:Landroid/widget/Button;
new-instance v1, Lcom/example/caoxiao/forapktooldemo/MainActivity$1;
invoke-direct {v1, p0}, Lcom/example/caoxiao/forapktooldemo/MainActivity$1;-><init>(Lcom/example/caoxiao/forapktooldemo/MainActivity;)V
invoke-virtual {v0, v1}, Landroid/widget/Button;->setOnClickListener(Landroid/view/View$OnClickListener;)V
.line 29
return-void
.end method
這個是Dalvik組合語言,咋一看肯定是不知所云,我們跟原始碼對比下。
package com.example.caoxiao.forapktooldemo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private TextView helloTV;
private Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
helloTV = (TextView) findViewById(R.id.helloTV);
btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
helloTV.setText("ApkTool");
Toast.makeText(MainActivity.this, getResources().getString(R.string.app_name), Toast.LENGTH_SHORT).show();
}
});
}
}
能看到線索了吧。我們甚至可以直接修改MainActivity.smali的程式碼,然後執行apktool b命令重新打包,這個暫時脫離了逆向工程的主題後續有空再分析。關於Apktool的使用先將到這,後續還會有 dex2jar和jd-gui的使用教程,這兩個工具主要可以幫助我們分析程式碼,也是逆向工程的神器。
相關推薦
Android逆向工程(一)-Apktool使用
當我們辛辛苦苦寫的程式碼被別人抄走的時候一定會讓我們非常的抓狂。要學會防守,我們也需要知道別人進攻的方式,接下來我們學習下如何破解Apk。Apktool是家喻戶曉的逆向工具,我們學習下如何使用它。 安裝 http://ibotpeaches.github.i
Android逆向筆記(1)---工具篇之apktool
apktool 官網:http://ibotpeaches.github.io/Apktool/ 說明:apk的反編譯工具,是在samli工具的基礎上進行封裝的工具,反編譯資源接近原始形式(包括resources.arsc,classes.dex,9.png。和XML
淺談Android應用保護(一):Android應用逆向的基本方法
對於未進行保護的Android應用,有很多方法和思路對其進行逆向分析和攻擊。使用一些基本的方法,就可以打破對應用安全非常重要的機密性和完整性,實現獲取其內部程式碼、資料,修改其程式碼邏輯和機制等操作。這篇文章主要介紹一些基本的應用逆向和分析方法,演示Android應用的程式
Android 插件(一)之類加載器
load ron 概念 基本概念 android oid ont 基本上 style 1、類加載器基本概念 類加載器(class loader)用來加載 Java 類到 Java 虛擬機中。一般來說,Java 虛擬機使用 Java 類的方式如下:Java 源程序(.j
Android View動畫(一) --- scale
for -- 縮放 記錄 1.0 使用 tco 關於 mod 在我們做apk開發的過程中,如果要吸引用戶,就需要要做出來一個非常炫的界面,當然動畫是必不可少的,接下來就記錄和學習動畫相關…… 接下來就把平時的一些東西,慢慢的上傳上來,做一下記錄和保存 今天要講解的第一個
Android系統架構(一)
查詢 核心 手機 例如 ava 模塊 api 操作系統 運行 一、Android系統版本簡介 Android操作系統已占據了手機操作系統的大半壁江山,截至本文寫作時,Android操作系統系統版本及其詳細信息,已發生了變化,具體信息見下表,當然也可以訪問https:
android binder筆記(一)
ati ima ger 取數 manager nat 機構 聲明 tar 最近在看韋老師的android binder視頻 ,記錄下個人對視頻學習的理解。 學習需要記錄與分享,如果有誤,希望得到大家的指正! IPC:兩個進程間數據通信的一種方式 RPC:一個進
Android 適配(一)
設計 固定 屏幕尺寸 inf bubuko bsp 單位 屏幕 打印機 一、Android適配基礎參數 1.常見分辨率(px) oppx 2340x1080 oppR15 2280x1080 oppor11sp 2160*1080 1
android 面試題(一)
程序 一個 如果 intent傳值 存儲 新的 有一個 數據類型 andro 1、Android中真實寬高,getWidth和getMeasuredWidth的區別:哪個計算的是真實的寬? getWidth():得到的是View在父Layout中布局好後的寬度值,如果沒有父
Android 開發:(一)安卓開發環境搭建與配置 (Windows和Mac )以及目錄結構介紹
(一)、windows版 一. 開發工具: 1.Android Studio:(http://www.androiddevtools.cn/) 2.Genymotion(虛擬機器):(http://www.genymotion.net/) (二)、Mac版 一
Android輸入系統(一)輸入事件傳遞流程和InputManagerService的誕生
本文首發於微信公眾號「劉望舒」 原文連結 : Android輸入系統的事件傳遞流程和IMS的誕生 相關文章 解析WMS系列 View體系系列 前言 很多同學可能會認為輸入系統是不是和View的事件分發有些關聯,確實是有些關聯,只不過View事件分發只能算是輸入系統事件傳遞的一部分。這個系列講的
Android錯誤日記(一)
匯入jar包後執行報出ClassNotFoundException異常: 匯入jar包時吧Android Private Libraries remove掉了,導致異常出現 Android Private Libraries:表示放在libs裡面的ja
Android學習心得(一):
1、活動類處理啟動與關閉活動的相關方法及說明 方法 說明 StartActivity(intent) 使用引數意圖啟動新活動,此方法是重寫Context類實現的原始版本 startA
Android知識點總結(一)
1、android:layout_weight 屬性的意義 1、權重的值指的是每個部件所佔剩餘空間的大小,該值與同級部件所佔空間大小有關。 2、例如,我們定義一個權重為 2 的 View,另一個 View 的權重是 1,那麼總數就是 3;這時第一個 View 佔據 2/3 的空間,第二個佔據
Android NDK開發(一)CMake構建工具使用
一、Android studio中需要的外掛: CMake LLDB NDK 二、專案配置 ①build.gardle的配置 :多了兩個externalNativeBuild :def
深入淺出Android單元測試(一):單元測試基礎
想學習單元測試無從下手,本文對以最易懂的方式介紹單元測試。 若有錯漏,煩請斧正。轉載請註明出處。歡迎關注程式引力 作者:程式引力 | 謝一 (Evan Xie) 郵箱:[email protected] 軟體測試作為軟體質量的保障,有著十分重要的意義。按照不同
軟體工程(一)——前言
筆者正在學習《軟體工程-實踐者的研究方法》這本書,記錄下一些讀書筆記,共勉! 1.軟體開發依舊面臨的問題 ①軟體開發時間長; ②開發成本高; ③軟體交付客戶前,無法找到所有錯誤; ④維護已有程式花費較高的時間和人力代價; ⑤軟體開發和維護過程難以度量。 2.軟體的定義 (
Android-螢幕滑動(一)
以動畫方式滑動到下一頁 下面用一個小demo來簡單記錄下用動畫的方式跳轉頁面到下一頁,直接上程式碼吧: 首先建立一個佈局檔案activity_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout
Android進階(一): Launcher啟動過程
1.前言 最近一直在看 《Android進階解密》 的一本書,這本書編寫邏輯、流程都非常好,而且很容易看懂,非常推薦大家去看看(沒有收廣告費,單純覺得作者寫的很好)。 今天就將 Launcher 系統啟動過程 總結一下(基於Android 8.0 系統)。 文章
Android開發心得(一)
Android開發心得之MVC 這一個學期在上潘老師的系統設計與分析課程時,我們小組開發了基於安卓平臺的電影購票軟體。在開發過程中收穫了挺多,現在在課程結束前,把其分享出來。 MVC是軟體工程中的一種軟體架構模式,把軟體系統分為三個基本部分:模型(Model)、檢視(View)和控