为什么C++将此值乘以4?

Jas*_*son -3 c++

  • pDosHeader 加载到 ECX
  • pDosHeader->f_lfanew加载到EAX(值,而不是指针)

    pNtHeaders = (PIMAGE_NT_HEADERS)((DWORD)pDosHeader + (DWORD)pDosHeader->e_lfanew);
    
    Run Code Online (Sandbox Code Playgroud)

上面的代码ades ECX + EAX并得到了我想要的结果......但是如果我决定在x64上编译一些东西,那么显然是把它指向DWORD的坏习惯了

  1. pNtHeaders = (PIMAGE_NT_HEADERS)( (PDWORD)pDosHeader + (DWORD)pDosHeader->e_lfanew );
  2. pNtHeaders = (PIMAGE_NT_HEADERS)( (PDWORD)pDosHeader + pDosHeader->e_lfanew );

上面的代码添加ECX + EAX * 4并得到了我不想要的结果.对于1和2.

我的问题是为什么?为什么C++会像这样编译我的代码?当我将dos标头转换为指针时,为什么它将e_lfanew乘以4?

它是否假设我想让我的指针指向下一个元素x次?因此将它乘以4以便我可以到e_lfanew(th)元素而不是添加e_lfanew?它可能会.

那我该怎么办?以C++方式编译此代码的正确方法是什么,以便在不使用坏习惯的情况下获得所需的结果?

我不想要的e_lfanewth元素pDosHeader.我只是希望它添加e_lfanewpDosHeader.

NPE*_*NPE 10

当我将dos标头转换为指针时,为什么它将e_lfanew乘以4?

因为这是指针算法在C和C++中的工作原理.向指针添加整数时,指针将按给定的元素数调整,而不是字节.由于PDWORD指向DWORDDWORD宽度为四个字节,n因此添加4 * n到地址会增加.

要使其按您希望的方式工作,请将指针更改为PBYTE.