关于dexdump源代码

时间:2015-11-23 03:56:29

标签: 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(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;

1 个答案:

答案 0 :(得分:0)

方法读取,验证并返回整个class_data_item,而不仅仅是Header

classDataOff中的DexFile指向类结构,其中Class Data Structure保留了class_data_item的偏移量,而DexClassDataHeader依次保存有关Class的重要数据。

由于您提到的方法是验证size,指针将指向类数据的类型,它将指向有关类的非常重要的信息,例如找到代码的位置以及代码量在里面 因此,调用sizeof(DexClassData)来读取类的所有属性。

虽然static fields包含有关该类的元数据,例如instance fieldsdirect methodsvirtual methods,{{1}}和{{1}},但它不包含指向属于类的实际代码

的位置

This可能是关于该主题的好文章