Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 关于dexdump源代码_Android_Dalvik_Dex - Fatal编程技术网

Android 关于dexdump源代码

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

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;

方法读取、验证并返回整个
类数据项
,而不仅仅是
标题

类结构由
DexFile
中的
classDataOff
指向,该文件保存到
class数据结构的偏移量,而
class数据结构又保存关于类的重要数据

由于您提到的方法是验证
class\u data\u项
,指针将指向类数据的类型,该类型将指向有关类的非常重要的信息,例如在哪里找到代码以及类中有多少代码 因此,调用sizeof(DexClassData)来读取类的所有属性

虽然
DexClassDataHeader
保存有关类的元数据,例如
大小
静态字段
实例字段
直接方法
虚拟方法
,但它并不指向属于类的实际代码所在的位置


这可能是一篇关于这个主题的好文章

代码的要点是创建一个单独的自包含块,该块以一个充满指针的结构开始。更直接的做法是,通过一系列分配来完成,首先是DexClassData,然后是静态字段的块,然后是实例字段的块,依此类推;然后只需设置指向所有已分配块的指针。这需要多次分配和多次释放

dexReadAndVerifyClassData()
将所有这些序列化为单个分配。它首先创建足够的空间来容纳所有数据。然后,它为DexClassData中的各种块设置指针,通过推进
ptr
遍历存储。然后,它读取中每个类别的数据,并对其进行验证

请注意,
ptr
不用于遍历
*pData
,而是用于遍历
结果。它不用于解析内存映射文件,而是用于为返回的数据布局存储


当函数返回时,所有数据以及DexClassData中的一组方便的指针都位于一个分配的块中。

有关相同结构的另一个示例,请参阅Dex.java。