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;
答案 0 :(得分:0)
方法读取,验证并返回整个class_data_item
,而不仅仅是Header
。
classDataOff
中的DexFile
指向类结构,其中Class Data Structure
保留了class_data_item
的偏移量,而DexClassDataHeader
依次保存有关Class的重要数据。
由于您提到的方法是验证size
,指针将指向类数据的类型,它将指向有关类的非常重要的信息,例如找到代码的位置以及代码量在里面
因此,调用sizeof(DexClassData)来读取类的所有属性。
虽然static fields
包含有关该类的元数据,例如instance fields
,direct methods
,virtual methods
,{{1}}和{{1}},但它不包含指向属于类的实际代码
This可能是关于该主题的好文章