Android 关于dexdump源代码
dexdump中有一些代码位于文件DexClass.c中Android 关于dexdump源代码,android,dalvik,dex,Android,Dalvik,Dex,dexdump中有一些代码位于文件DexClass.c中 DexClassData* dexReadAndVerifyClassData(const u1** pData, const u1* pLimit) { ...... size_t resultSize = sizeof(DexClassData) + (header.staticFieldsSize * sizeof(DexField)) + (header.instanceFieldsSize * sizeof(D
DexClassData* dexReadAndVerifyClassData(const u1** pData, const u1* pLimit) {
......
size_t resultSize = sizeof(DexClassData) +
(header.staticFieldsSize * sizeof(DexField)) +
(header.instanceFieldsSize * sizeof(DexField)) +
(header.directMethodsSize * sizeof(DexMethod)) +
(header.virtualMethodsSize * sizeof(DexMethod));
DexClassData* result = malloc(resultSize);
u1* ptr = ((u1*) result) + sizeof(DexClassData);// I have problem here!
......
result->header = header;
if (header.staticFieldsSize != 0) {
result->staticFields = (DexField*) ptr;
ptr += header.staticFieldsSize * sizeof(DexField);
} else {
result->staticFields = NULL;
}
代码“u1*ptr=((u1*)result)+sizeof(DexClassData);”是为了使指针ptr指向staticField(我认为是这样,但我不确定),但为什么要使用sizeof(DexClassData)?我认为它应该是sizeof(DexClassDataHeader)。我不明白。有人能告诉我吗
typedef struct DexClassDataHeader
{
u4 staticFieldSize;
u4 instanceFieldSize;
u4 directMethodSize;
u4 virtualMethodSize;
}DexClassDataHeader;
typedef struct DexClassData
{
DexClassDataHeader header;
DexField* staticField;
DexField* instanceFiled;
DexMethod* directMethod;
DexMethod* vitualMethod;
}DexClassData;
方法读取、验证并返回整个
类数据项,而不仅仅是标题
类结构由DexFile
中的classDataOff
指向,该文件保存到class数据结构的偏移量,而class数据结构又保存关于类的重要数据
由于您提到的方法是验证class\u data\u项
,指针将指向类数据的类型,该类型将指向有关类的非常重要的信息,例如在哪里找到代码以及类中有多少代码
因此,调用sizeof(DexClassData)来读取类的所有属性
虽然DexClassDataHeader
保存有关类的元数据,例如大小
,静态字段
,实例字段
,直接方法
和虚拟方法
,但它并不指向属于类的实际代码所在的位置
这可能是一篇关于这个主题的好文章代码的要点是创建一个单独的自包含块,该块以一个充满指针的结构开始。更直接的做法是,通过一系列分配来完成,首先是DexClassData,然后是静态字段的块,然后是实例字段的块,依此类推;然后只需设置指向所有已分配块的指针。这需要多次分配和多次释放
dexReadAndVerifyClassData()
将所有这些序列化为单个分配。它首先创建足够的空间来容纳所有数据。然后,它为DexClassData中的各种块设置指针,通过推进ptr
遍历存储。然后,它读取中每个类别的数据,并对其进行验证
请注意,ptr
不用于遍历*pData
,而是用于遍历结果。它不用于解析内存映射文件,而是用于为返回的数据布局存储
当函数返回时,所有数据以及DexClassData中的一组方便的指针都位于一个分配的块中。有关相同结构的另一个示例,请参阅Dex.java。