pDosHeader 加载到 ECXpDosHeader->f_lfanew加载到EAX(值,而不是指针)
pNtHeaders = (PIMAGE_NT_HEADERS)((DWORD)pDosHeader + (DWORD)pDosHeader->e_lfanew);
Run Code Online (Sandbox Code Playgroud)上面的代码ades ECX + EAX并得到了我想要的结果......但是如果我决定在x64上编译一些东西,那么显然是把它指向DWORD的坏习惯了
pNtHeaders = (PIMAGE_NT_HEADERS)( (PDWORD)pDosHeader + (DWORD)pDosHeader->e_lfanew );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_lfanew到pDosHeader.
NPE*_*NPE 10
当我将dos标头转换为指针时,为什么它将e_lfanew乘以4?
因为这是指针算法在C和C++中的工作原理.向指针添加整数时,指针将按给定的元素数调整,而不是字节.由于PDWORD指向DWORD和DWORD宽度为四个字节,n因此添加4 * n到地址会增加.
要使其按您希望的方式工作,请将指针更改为PBYTE.
| 归档时间: |
|
| 查看次数: |
197 次 |
| 最近记录: |