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 文件中的数据结构
每个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
DexMapList
DexMapItem
DexStringId
MUTF-8编码
DexTypeId
DexProtoId
它表示一个方法声明, shortyIdx为方法声明字符串, returnTypeIdx为方法返回类型字符串, parametersOff指向DexTypeList结构体, 存放了方法的参数列表.
DexTypeList
DexTypeItem
DexFieldId
DexMethodId
DexClassDef
DexClassData
DexClassDataHeader
DexField
DexMethod
DexCode
odex文件格式
odex文件的生成略
odex文件的整体结构略
odex文件结构分析略
dexopt的工作过程略
破解dex文件
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字节 |
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
类型 | 字段名 | 描述 |
---|---|---|
u1 | magic[8] | dex版本标识 |
u4 | checksum | adler32检验 |
u1 | signature[kSHA1DigestLen] | SHA-1哈希值, kSHA1DigestLen为20, 见dalvik/libdex/DexFile.h. |
u4 | headerSize | DexHeader结构大小 |
u4 | endianTag | 字节序标记 |
u4 | linkSize | 链接段大小 |
u4 | linkOff | 链接段偏移 |
u4 | mapOff | DexMapList的文件偏移 |
u4 | stringIdsSize | DexStringId的个数 |
u4 | stringIdsOff | DexStringId的文件偏移 |
u4 | typeIdsSize | DexTypeId的个数 |
u4 | typeIdsOff | DexTypeId的文件偏移 |
u4 | protoIdsSize | DexProtoId的个数 |
u4 | protoIdsOff | DexProtoId的文件偏移 |
u4 | fieldIdsSize | DexFieldId的个数 |
u4 | fieldIdsOff | DexFieldId的文件偏移 |
u4 | methodIdsSize | DexMethodId的个数 |
u4 | methodIdsOff | DexMethodId的文件偏移 |
u4 | classDefsSize | DexClassDef的个数 |
u4 | classDefsOff | DexClassDef的文件偏移 |
u4 | dataSize | 数据段的大小 |
u4 | dataOff | 数据段的文件偏移 |
类型 | 字段 | 描述 |
---|---|---|
u4 | size | DexMapItem的个数 |
DexMapItem | list | DexMapItem结构 |
类型 | 字段 | 描述 |
---|---|---|
u2 | type | kDexType开头的类型 |
u2 | unused | 未使用, 用于字节对齐 |
u4 | size | 指定类型的个数 |
u4 | offset | 指定类型数据的文件偏移 |
类型 | 字段 | 描述 |
---|---|---|
u4 | stringDataOff | 字符串的数据偏移 |
DexTypeId
类型 | 字段 | 描述 |
---|---|---|
u4 | descriptorIdx | 指向DexStringId列表的索引 |
类型 | 字段 | 描述 |
---|---|---|
u4 | shortyIdx | 指向DexStringId列表的索引 |
u4 | returnTypeIdx | 指向DexTypeId列表的索引 |
u4 | parametersOff | 指向DexTypeList的偏移 |
DexTypeList
类型 | 字段 | 描述 |
---|---|---|
u4 | size | DexTypeItem的个数 |
DexTypeItem | list | DexTypeItem结构 |
类型 | 字段 | 描述 |
---|---|---|
u2 | typeIdx | 指向DexTypeId列表的索引 |
类型 | 字段 | 描述 |
---|---|---|
u2 | classIdx | 类的类型, 指向DexTypeId列表的索引 |
u2 | typeIdx | 字段类型, 指向DexTypeId列表的索引 |
u4 | nameIdx | 字段名, 指向DexStringId列表的索引 |
类型 | 字段 | 描述 |
---|---|---|
u2 | classIdx | 类的类型, 指向DexTypeId列表的索引 |
u2 | protoIdx | 声明类型, 指向DexProtoId列表的索引 |
u4 | nameIdx | 方法名, 指向DexStringId列表的索引 |
类型 | 字段 | 描述 |
---|---|---|
u4 | classIdx | 类的类型, 指向DexTypeId列表的索引 |
u4 | accessFlags | 访问标志 |
u4 | superclassIdx | 父类类型, 指向DexTypeId列表的索引 |
u4 | interfacesOff | 接口, 指向DexTypeList的偏移 |
u4 | sourceFileIdx | 源文件名, 指向DexStringId列表的索引 |
u4 | annotationsOff | 注解, 指向DexAnnotataionDirectoryItem结构 |
u4 | classDataOff | 指向DexClassData结构的偏移 |
u4 | staticValuesOff | 指向DexEncodedArray结构的偏移 |
类型 | 字段 | 描述 |
---|---|---|
DexClassDataHeader | header | 指定字段与方法的个数 |
DexField | staticFields | 静态字段, DexField结构 |
DexMethod | directMethods | 直接方法, DexMethod结构 |
DexMethod | virtualMethods | 虚方法, DexMethod结构 |
类型 | 字段 | 描述 |
---|---|---|
u4 | staticFieldsSize | 静态字段个数 |
u4 | instanceFieldsSize | 实例字段个数 |
u4 | staticMethodsSize | 直接方法个数 |
u4 | virtualMethodsSize | 虚方法个数 |
类型 | 字段 | 描述 |
---|---|---|
u4 | fieldIdx | 指向DexFieldId的索引 |
u4 | accessFlags | 访问标志 |
类型 | 字段 | 描述 |
---|---|---|
u4 | methodIdx | 指向DexMethodId的索引 |
u4 | accessFlags | 访问标志 |
u4 | codeOff | 指向DexCode结构的偏移 |
类型 | 字段 | 描述 |
---|---|---|
u2 | registersSize | 使用的寄存器个数 |
u2 | insSize | 参数个数 |
u2 | outsSize | 调用其他方法时, 使用的寄存器个数 |
u2 | triesSize | try/catch个数 |
u4 | debugInfoOff | 指向调试信息的偏移 |
u4 | insnsSize[1] | 指令集 |
2字节空间用于结构对齐 | ||
try_item[triesSize] | DexTry结构 | |
try/catch中handler的个数 | ||
catch_handler_item[handlersSize] | DexCatchHandler结构 |
odex文件的生成略
odex文件的整体结构略
odex文件结构分析略
dexopt的工作过程略
破解dex文件
相关文章推荐
- Android启动过程分析——init.c(一)
- Android学习之适配器BaseAdapter
- Android开发实战总结(持续更新中)
- Android 利用xUtils框架实现对sqllite的增删改查
- android studio打apk包
- android里面有多个activity如何设置一个为主界面上的activity
- Android SDK Tools功能
- Android(二)遇到的小问题
- 4.8.4 如何去掉Android 应用的actionbar
- 《Android源码设计模式解析与实战》——原型模式
- Android应用界面开发_学习笔记_第一周
- Android图片状态选择器, 点击时和抬起时的切换
- 【Android实战】DroidPlugin插件化应用分析
- Android应用开发中实现apk皮肤文件换肤的思路分析
- Android 编程下 Touch 事件的分发和消费机制(上)
- Android 知识杂记(MVP模式)
- Android 属性动画(Property Animation) 完全解析 (下)
- Android四大组件——BroadcastReceiver
- Android 属性动画(Property Animation) 完全解析 (上)
- Android事件分发机制完全解析