【问题标题】:PE file format pointers using bitwise operators使用位运算符的 PE 文件格式指针
【发布时间】:2012-11-24 21:12:47
【问题描述】:

我想知道这些代码行背后的数学原理。处理指针。有人可以用 if 语句中的 + 运算符和 & 位运算符来指导我进行数学运算吗?我只是不太明白。

 // check signatures -- must be a PE
    pDosHeader = (PIMAGE_DOS_HEADER)hMap;
    if(pDosHeader->e_magic != IMAGE_DOS_SIGNATURE) goto cleanup;

    pNtHeaders = (PIMAGE_NT_HEADERS)((DWORD)hMap + pDosHeader->e_lfanew);
    if(pNtHeaders->Signature != IMAGE_NT_SIGNATURE) goto cleanup;

// Not dll
 if (pNtHeaders->FileHeader.Characteristics & IMAGE_FILE_DLL
  && pNtHeaders->FileHeader.Characteristics & IMAGE_FILE_EXECUTABLE_IMAGE) goto cleanup;

    // get last section's header...
    pSectionHeader = (PIMAGE_SECTION_HEADER)((DWORD)hMap + pDosHeader->e_lfanew + sizeof(IMAGE_NT_HEADERS));
    pSection = pSectionHeader;
 pSection += (pNtHeaders->FileHeader.NumberOfSections - 1);

【问题讨论】:

    标签: c++ c file assembly portable-executable


    【解决方案1】:

    + 运算符只是算术加号。当与指针一起使用时,现在变得更清楚为什么 C 和 C++ 中的指针是类型化的 - 它不仅将字节添加到地址,而且添加了它指向的任何类型的大小。

    例如,如果我们有:

    struct stuff x;
    struct stuff *p = &x;    /* p now points at x */
    p = p + 1;
    /* the address at p has been incremented by the sizeof(struct stuff), 
        and is pointing at the next struct stuff in memeory */
    

    用作二元运算符的 & 是按位与,它携带在两个操作数中设置的位。例如:

    unsigned int b = 99;      /* 99 is binary 01100011 */
    unsigned int w = b & 6;   /*  6 is binary 00000110 */
    /* w is now 2                 2 is binary 00000010 */
    

    在您的示例代码中,它似乎用于测试是否在结构成员中设置了位掩码 IMAGE_FILE_DLL 和 IMAGE_FILE_EXECUTABLE_IMAGE。

    【讨论】:

    • 是的,我在规范中注意到了这些值:0000 0000 0000 0000 0000 0000 0000 0010 (IMAGE_FILE_EXECUTABLE_IMAGE) 0000 0000 0000 0000 0010 0000 0000 00_--------(IMAGE) ------------------------------
    • +1 和侧边栏,在执行指针差异时也相反(很少谈论)。如果两个相同类型的指针不同(减去),即size_t n = (p-q);,其中 p 和 q 是两个相同类型的指针,结果是它们之间的类型化对象的数量;不是 bytes 的数量(除非类型 char 或 unsigned char,duh)。这有时会非常派上用场。
    猜你喜欢
    • 2017-07-18
    • 1970-01-01
    • 2013-05-23
    • 2020-11-09
    • 2013-07-22
    • 2016-11-09
    • 2011-05-09
    • 1970-01-01
    相关资源
    最近更新 更多