1. 程式人生 > >Android 可執行檔案

Android 可執行檔案

簡介

可執行檔案是作業系統的基礎,它反映著系統的執行機制,Android系統的可執行檔案也是如此。

Apk

Apk是Android Package的縮寫,實際上Apk檔案就是一個zip壓縮包,使用zip格式解壓縮軟體對apk檔案進行解壓,會發現它由一些圖片資源與其它檔案

組成,並且每個apk檔案中包含一個classes.dex,它是Dalvik可執行檔案。

dex 檔案格式

在Android系統中,dex檔案是可以直接在Dalvik虛擬機器中載入執行的檔案。通過ADT,經過複雜的編譯,可以把java原始碼轉換為dex文 件。 那麼這個檔案的格式是什麼樣的呢?為什麼Android不直接使用class檔案,而採用這個不一樣檔案呢?其實它是針對嵌入式系統優化的結 果,Dalvik虛擬機器的指令碼並不是標準的Java虛擬機器指令碼,而是使用了自己獨有的一套指令集。如果有自己的編譯系統,可以不生成class檔案, 直接生成dex檔案。dex檔案中共用了很多類名稱、常量字串,使它的體積比較小,執行效率也比較高。但歸根到底,Dalvik還是基於暫存器的虛擬機器 的一個實現。

Dex檔案頭主要包括校驗和以及其他結構的偏移地址和長度資訊。

欄位名稱 偏移值 長度 描述
magic 0x0 8 'Magic'值,即魔數字段,格式如”dex/n035/0”,其中的035表示結構的版本。
checksum 0x8 4 校驗碼。
signature 0xC 20 SHA-1簽名。
file_size 0x20 4 Dex檔案的總長度。
header_size 0x24 4 檔案頭長度,009版本=0x5C,035版本=0x70。
endian_tag 0x28 4 標識位元組順序的常量,根據這個常量可以判斷檔案是否交換了位元組順序,預設情況下=0x78563412。
link_size 0x2C 4 連線段的大小,如果為0就表示是靜態連線。
link_off 0x30 4 連線段的開始位置,從本檔案頭開始算起。如果連線段的大小為0,這裡也是0。
map_off 0x34 4 map資料基地址。
string_ids_size 0x38 4 字串列表的字串個數。
string_ids_off 0x3C 4 字串列表表基地址。
type_ids_size 0x40 4 型別列表裡型別個數。
type_ids_off 0x44 4 型別列表基地址。
proto_ids_size 0x48 4 原型列表裡原型個數。
proto_ids_off 0x4C 4 原型列表基地址。
field_ids_size 0x50 4 欄位列表裡欄位個數。
field_ids_off 0x54 4 欄位列表基地址。
method_ids_size 0x58 4 方法列表裡方法個數。
method_ids_off 0x5C 4 方法列表基地址。
class_defs_size 0x60 4 類定義類表中類的個數。
class_defs_off 0x64 4 類定義列表基地址。
data_size 0x68 4 資料段的大小,必須以4位元組對齊。
data_off 0x6C 4 資料段基地址

odex檔案格式

odex是OptimizedDEX的縮寫,表示經過優化的dex檔案。

odex有兩種存在的方式:一種是從apk程式中提取出來的,與apk檔案存放在同一目錄且檔案字尾為odex的檔案,這類odex檔案多是Android ROM的系統程式;

另一種是dalvik-cache快取檔案,這類Odex檔案仍然以dex作為字尾,存放在cache/dalvik-cache目錄下,儲存的形式為“apk路徑@apk名@classes.dex”。

dex檔案的驗證

Android提供了一個專門驗證與優化dex檔案的工具dexopt,該軟體是開源的,可以下載到原始碼,驗證過程如下:


小結

瞭解了dex、odex檔案格式,對Android程式本身有更深層次的認識。當然也可以通過修改dex中的執行路徑從而破解程式,因為Android應用程式的程式碼都儲存在dex檔案中。

相關下載

相關推薦

使用ndk-build編譯android執行檔案

target.c #include <stdio.h> int count = 0; void sevenWeapons(int number) { char* str = "Hello,11111111!"; printf("%s %d\n

android執行檔案交叉編譯和執行

簡介 android一般使用java進行開發,但是有時候我們可能需要使用到native語言,使用C/C++進行編譯執行. 現在我們可以搜到很多使用android-studio和NDK進行編譯so執行的方式,我就不再贅述了,我們這裡主要講如何利用已經有的NDK工

Android 執行檔案

簡介 可執行檔案是作業系統的基礎,它反映著系統的執行機制,Android系統的可執行檔案也是如此。 Apk Apk是Android Package的縮寫,實際上Apk檔案就是一個zip壓縮包,使用zip格式解壓縮軟體對apk檔案進行解壓,會發現它由一些圖片資源與其它檔案 組

Android逆向分析基礎-Android執行檔案

link_data 目前為空 struct DexFile { DexHeader Header, DexStringId StringIds[stringIdsSize], DexTypeId TypeIds[typeIdsSize], DexProto

經驗總結---編譯出可以在Android執行執行檔案

作為一手包攬Ubuntu和Android裝置的初級開發者,我不止一次地嘗試把這兩個同是用Linux核心的作業系統統一起來——讓Ubuntu下的可執行程式能夠在Android裝置上執行。於是我不止一次地嘗試,不止一次地查詢資料,終於如願以償。 我把我的經驗在這裡與大家分享。 準備工具 【宿

在一個Android專案裡面有兩個執行檔案,如何實現呼叫方式

我的處理方式是: 用Intent+AndroidManifest.xml的方法: 此方法是用Intent和修改AndroidManifest.xml達成的。 就是在要引用的AndroidManifest.xml檔案裡面加入被引用那個專案的activity: <activity

Android系統開機啟動C執行檔案

在工作中有一個需求是android手機開機啟動一個C可執行檔案,起初嘗試是將在android原始碼裡面寫一個bash指令碼,然後在腳本里面執行/data目錄下的可執行檔案,然後將系統燒寫進手機,開機後將可執行檔案放入手機/data目錄裡面,然後重啟,最終的結果是沒有成功。

android JNI執行NDK編譯成的執行檔案

1.android環境的可執行檔案的生成 所謂的android下的可執行檔案,其實就是一般的c/c++程式碼使用NDK編譯出來的應用程式。它和linux下用gcc編譯出來的程式和windows系統下的.exe檔案是一樣的。要將程式碼編譯成可執行檔案只需要將編譯so的inc

Android-----打包執行檔案並在apk呼叫

1.首先交叉編譯可執行檔案hello 2.將hello放到assets下 3.舉例: package com.test.android.exe; import java.io.BufferedReader; import java.io.File; import

c編寫,交叉編譯成android下二進位制執行檔案

題目: 請編寫一個netbd.c,實現 檢查android手機/system/app/cmd.apk檔案是否存在。 然後交叉編譯這個檔案,生成android下二進位制可執行檔案. 答: ====== 題目: 答:  待實現.誰會? ====== 題目: 請編寫 linu

[android]寫一個system/bin 下的執行檔案

以hello 為例,檔案如下:./hello/Android.mk./hello/hello.cpp./hello/MODULE_LICENSE_APACHE2./hello/NOTICEAndroid.mk 的內容:# Copyright 2018 The Android

FFMPEG Android(2) 編譯編譯靜態ffmpeg執行檔案

基礎編譯,請參考上一篇文章: http://blog.csdn.net/muwesky/article/details/55259945 如果想編譯靜態ffmpeg可執行檔案,編譯指令碼如下: #!/bin/bash export TMPDIR=/Users/aive

android 編寫簡單執行檔案

使用Android sdk 原始碼編譯一個簡單的adb shell 命令下的可執行檔案: 在system/core  下建立一個臨時資料夾tmp,並建立了Android.mk 和 test.c

四、Android.mk之編譯生成執行檔案

一、簡介 對於學過Linux核心的來說,想要去編譯一個檔案,生成可執行檔案也好,打包成庫也罷,都是使用Makefile來管理編譯的。那麼對於Android底層開發來講,也是需要把咱們寫的程式碼,編譯成可執行檔案或者其他可用的檔案,才能使用起來。再Android對這些檔案的管

Android程式中,內嵌ELF執行檔案-- Android開發C語言混合程式設計總結

前言 都知道的,Android基於Linux系統,然後覆蓋了一層由Java虛擬機器為核心的殼系統。跟一般常見的Linux+Java系統不同的,是其中有對硬體驅動進行支援,以避開GPL開源協議限制的HAL硬體抽象層。 大多數時候,我們使用JVM語言進行程式設計,比如傳統的Java或者新貴Kotlin。碰到對

將Matlab的M檔案轉為P檔案和exe執行檔案達到加密效果

在matlab中如果你的程式碼很重要,需要加密,目前我查到了兩種方法:一、生成p檔案;二、生成.exe檔案 matlab生成p檔案的方法很簡單,在command wondow裡面用 pcode yourfile.m 命令可以將M檔案轉化為對應的pcode檔案yourfile.p,據說是不會被反編

將Maven工程匯出war包(匯出執行檔案) war包的安裝與部署(以兩個Tomcat為例,詳細)請到:

1  開啟war工程的pom.xml,將如下內容複製到配置Tomcat的程式碼中                 &l

Makefile 編譯生成多個執行檔案

all:server client server:server.c gcc $< -o [email protected] client:client.c gcc $< -o [email protected] clean:   &nb

iOS 開發ipa包瘦身 -- 執行檔案大小

專案寫完以後打出來的包太大 分析一下 首先開啟Products下有個.app 檔案 右鍵show in finder後 再次右鍵 顯示包內容 專案打包後的檔案就會一一羅列在這裡。 這裡重點看一下 這裡有個黑色的可執行檔案,在我專案裡一開始竟然達到了50M+ 那麼這個檔

WPF:將Office文件、任意型別檔案嵌入到EXE執行檔案

原文: WPF:將Office文件、任意型別檔案嵌入到EXE可執行檔案中 RT 可能這個需求比較奇怪 做了一個綠色版應用,最後只生成一個可執行的exe檔案,不附帶任何dll和其他檔案。 新軟體需要提供幫助手冊,又不想額外提供檔案,希望通過軟體內部幫助按鈕一鍵開啟... ---