您的位置:首页 > 移动开发 > Android开发

Android逆向分析基础-Android可执行文件

2016-02-26 16:09 681 查看
Android 程序的生成步骤

aapt 打包资源文件, 生成R.java, resources.arsc

处理aidl文件, 生成相应接口文件

javac编译工程文件, 生成class文件

NDK编译C/C++文件

dx转换所有class文件生成classes.dex (压缩常量池等工作)

apkbuilder打包生成apk

jarsigner或signapk给apk签名

zipalign apk

Android 程序的安装流程



dex文件格式

dex 文件中的数据结构

类型描述
u1等同于uint8_t, 表示1字节的无符号数
u2等同于uint16_t, 表示2字节的无符号数
u4等同于uint32_t, 表示4字节的无符号数
u8等同于uint64_t, 表示8字节的无符号数
sleb128有符号LEB128, 可变长1~5字节
uleb128无符号LEB128, 可变长1~5字节
uleb128p1无符号LEB128值加1, 可变长1~5字节
每个LEB128由1~5个字节组成, 所有字节组合在一起表示一个32位数据, 每个字节只有7位有效位, 如果第一个字节的最高位是1, 表示LEB128需要使用到第二个字节, 以此类推, 最多能用5个字节.

dex 的文件结构

dex_header dex文件头, 指定dex的属性, 及其他6部分在dex中的物理偏移

string_ids

type_ids

proto_ids

field_ids

method_ids

class_def

data

link_data 目前为空

struct DexFile {

DexHeader Header,

DexStringId StringIds[stringIdsSize],

DexTypeId TypeIds[typeIdsSize],

DexProtoId ProtoIds[protoIdsSize],

DexFieldId FieldIds[fieldIdsSize],

DexMethodId MethodIds[methodIdsSize],

DexClassDef ClassDefs[classDefsSize],

DexData Data[],

DexLink LinkData

};

Dex文件结构分析

DexHeader

类型字段名描述
u1magic[8]dex版本标识
u4checksumadler32检验
u1signature[kSHA1DigestLen]SHA-1哈希值, kSHA1DigestLen为20, 见dalvik/libdex/DexFile.h.
u4headerSizeDexHeader结构大小
u4endianTag字节序标记
u4linkSize链接段大小
u4linkOff链接段偏移
u4mapOffDexMapList的文件偏移
u4stringIdsSizeDexStringId的个数
u4stringIdsOffDexStringId的文件偏移
u4typeIdsSizeDexTypeId的个数
u4typeIdsOffDexTypeId的文件偏移
u4protoIdsSizeDexProtoId的个数
u4protoIdsOffDexProtoId的文件偏移
u4fieldIdsSizeDexFieldId的个数
u4fieldIdsOffDexFieldId的文件偏移
u4methodIdsSizeDexMethodId的个数
u4methodIdsOffDexMethodId的文件偏移
u4classDefsSizeDexClassDef的个数
u4classDefsOffDexClassDef的文件偏移
u4dataSize数据段的大小
u4dataOff数据段的文件偏移
DexMapList

类型字段描述
u4sizeDexMapItem的个数
DexMapItemlistDexMapItem结构
DexMapItem

类型字段描述
u2typekDexType开头的类型
u2unused未使用, 用于字节对齐
u4size指定类型的个数
u4offset指定类型数据的文件偏移
DexStringId

类型字段描述
u4stringDataOff字符串的数据偏移
MUTF-8编码

DexTypeId

类型字段描述
u4descriptorIdx指向DexStringId列表的索引
DexProtoId

类型字段描述
u4shortyIdx指向DexStringId列表的索引
u4returnTypeIdx指向DexTypeId列表的索引
u4parametersOff指向DexTypeList的偏移
它表示一个方法声明, shortyIdx为方法声明字符串, returnTypeIdx为方法返回类型字符串, parametersOff指向DexTypeList结构体, 存放了方法的参数列表.

DexTypeList

类型字段描述
u4sizeDexTypeItem的个数
DexTypeItemlistDexTypeItem结构
DexTypeItem

类型字段描述
u2typeIdx指向DexTypeId列表的索引
DexFieldId

类型字段描述
u2classIdx类的类型, 指向DexTypeId列表的索引
u2typeIdx字段类型, 指向DexTypeId列表的索引
u4nameIdx字段名, 指向DexStringId列表的索引
DexMethodId

类型字段描述
u2classIdx类的类型, 指向DexTypeId列表的索引
u2protoIdx声明类型, 指向DexProtoId列表的索引
u4nameIdx方法名, 指向DexStringId列表的索引
DexClassDef

类型字段描述
u4classIdx类的类型, 指向DexTypeId列表的索引
u4accessFlags访问标志
u4superclassIdx父类类型, 指向DexTypeId列表的索引
u4interfacesOff接口, 指向DexTypeList的偏移
u4sourceFileIdx源文件名, 指向DexStringId列表的索引
u4annotationsOff注解, 指向DexAnnotataionDirectoryItem结构
u4classDataOff指向DexClassData结构的偏移
u4staticValuesOff指向DexEncodedArray结构的偏移
DexClassData

类型字段描述
DexClassDataHeaderheader指定字段与方法的个数
DexFieldstaticFields静态字段, DexField结构
DexMethoddirectMethods直接方法, DexMethod结构
DexMethodvirtualMethods虚方法, DexMethod结构
DexClassDataHeader

类型字段描述
u4staticFieldsSize静态字段个数
u4instanceFieldsSize实例字段个数
u4staticMethodsSize直接方法个数
u4virtualMethodsSize虚方法个数
DexField

类型字段描述
u4fieldIdx指向DexFieldId的索引
u4accessFlags访问标志
DexMethod

类型字段描述
u4methodIdx指向DexMethodId的索引
u4accessFlags访问标志
u4codeOff指向DexCode结构的偏移
DexCode

类型字段描述
u2registersSize使用的寄存器个数
u2insSize参数个数
u2outsSize调用其他方法时, 使用的寄存器个数
u2triesSizetry/catch个数
u4debugInfoOff指向调试信息的偏移
u4insnsSize[1]指令集
2字节空间用于结构对齐
try_item[triesSize]DexTry结构
try/catch中handler的个数
catch_handler_item[handlersSize]DexCatchHandler结构
odex文件格式

odex文件的生成略

odex文件的整体结构略

odex文件结构分析略

dexopt的工作过程略

破解dex文件
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: