代码之家  ›  专栏  ›  技术社区  ›  cipher_junkie

如何在windows中将图像指针传递到图像_dos_头

  •  0
  • cipher_junkie  · 技术社区  · 2 年前

    如何正确构建 NtHeader 打电话的时候 PIMAGE_NT_HEADERS64 微软文档似乎对此功能没有太多评论,问题是从 void* DWORD 失败

    int runPE64(void* Image)
    {
        /*
        non relevant code 
        */
        char CurrentFilePath[1024];
        DOSHeader = PIMAGE_DOS_HEADER(Image); // Initialize Variable
        NtHeader = PIMAGE_NT_HEADERS64( DWORD(Image) + DOSHeader->e_lfanew); // Initialize
        GetModuleFileNameA(0, CurrentFilePath, 1024); // path to current executable
    
        return 0;
    }
    
    
    
    int main()
    {
    
        unsigned char data[] = {0x4D,0x5A,0x00}; // this is dummy data 
        runPE64(data);
    
        return 0;
    }
    
    

    编译时出错

    $ g++ runPE64.cpp 
    runPE64.cpp: In function 'int runPE64(void*)':
    runPE64.cpp:31:41: error: cast from 'void*' to 'DWORD' {aka 'long unsigned int'} loses precision [-fpermissive]
       31 |         NtHeader = PIMAGE_NT_HEADERS64( DWORD(Image) + DOSHeader->e_lfanew); // Initialize
          |                                         ^~~~~~~~~~~~
    runPE64.cpp:31:20: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
       31 |         NtHeader = PIMAGE_NT_HEADERS64( DWORD(Image) + DOSHeader->e_lfanew); // Initialize
          |                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    

    有没有其他方法可以做到这一点,或者有什么好的解释可以通过 PIMAGE_NT_校长64

    1 回复  |  直到 2 年前
        1
  •  0
  •   Remy Lebeau    2 年前

    DWORD 在32位和64位系统中,大小均为32位(4字节)。

    编译器警告您 德沃德 它的大小不同于 void* 编译中的指针,因此会丢失位。这意味着您必须编译一个64位可执行文件,其中指针的大小为64位(8字节)。

    你需要打字 DWORD_PTR 相反,它与指针大小相同,无论编译为32位还是64位。

    NtHeader = PIMAGE_NT_HEADERS64( DWORD_PTR(Image) + DOSHeader->e_lfanew);
    

    或者,可以使用指针算术而不是整数算术:

    NtHeader = PIMAGE_NT_HEADERS64( LPBYTE(Image) + DOSHeader->e_lfanew); // Initialize