陈爹地 发表于 2020-5-24 15:59:32

一个强转类型的疑问


#include<windows.h>
#include<stdio.h>


#define FILEPATH "C:\\Documents and Settings\\Administrator\\桌面\\123.exe"
   





LPVOID ReadPEFile(LPSTR lpszFile)      
{      
    FILE *pFile = NULL;
    DWORD fileSize = 0;
    LPVOID pFileBuffer = NULL;
   
    //打开文件
    pFile = fopen(lpszFile, "rb");      
    if(!pFile)
    {   
      printf(" 无法打开 EXE 文件! ");
      return NULL;
    }   
   
    //从0开始读取文件大小,偏移量SEEK_END,就是到文件末尾      
    fseek(pFile, 0, SEEK_END);
    fileSize = ftell(pFile);
   
    //重新设置到开头,后面还要用到读取
    fseek(pFile, 0, SEEK_SET);
   
    //分配缓冲区,malloc的返回值是一个缓冲区的指针
    pFileBuffer = malloc(fileSize);
   
    if(!pFileBuffer)   
    {   
      printf(" 分配缓冲区失败! ");
      fclose(pFile);
      return NULL;
    }   

    //将文件数据读取到缓冲区   
    size_t n = fread(pFileBuffer, fileSize, 1, pFile);
    if(!n)
    {   
      printf(" 读取数据失败! ");
      free(pFileBuffer);
      fclose(pFile);
      return NULL;
    }

    //关闭文件
    fclose(pFile);
    return pFileBuffer;   
}      

VOID PrintNTHeaders()      
{      
    LPVOID pFileBuffer = NULL;
    PIMAGE_DOS_HEADER pDosHeader = NULL;   
    PIMAGE_NT_HEADERS pNTHeader = NULL;
    PIMAGE_FILE_HEADER pPEHeader = NULL;   
    PIMAGE_OPTIONAL_HEADER32 pOptionHeader = NULL;
    PIMAGE_SECTION_HEADER pSectionHeader = NULL;   
   
    pFileBuffer = ReadPEFile(FILEPATH);
    if(!pFileBuffer)   
    {   
      printf("文件读取失败\n");
      return ;
    }   
   
    //判断是否是有效的MZ标志,也就是0x5A4D,取前四个字节
    if(*((PWORD)pFileBuffer) != IMAGE_DOS_SIGNATURE)   
    {   
      printf("不是有效的MZ标志\n");
      free(pFileBuffer);
      return ;
    }   

    pDosHeader = (PIMAGE_DOS_HEADER)pFileBuffer;   
    //打印DOS头   
    printf("********************DOS头********************\n");   
    printf("MZ标志:%x\n",pDosHeader->e_magic);   
    printf("PE偏移:%x\n",pDosHeader->e_lfanew);
   
    //判断是否是有效的PE标志
    if(*((PDWORD)((DWORD)pFileBuffer+pDosHeader->e_lfanew)) != IMAGE_NT_SIGNATURE)
    {   
      printf("不是有效的PE标志\n");
      free(pFileBuffer);
      return ;
    }   

    pNTHeader = (PIMAGE_NT_HEADERS)((DWORD)pFileBuffer+pDosHeader->e_lfanew);


    //打印NT头
    printf("********************NT头********************\n");   
    printf("NT:%x\n",pNTHeader->Signature);
   

    pPEHeader = (PIMAGE_FILE_HEADER)(((DWORD)pNTHeader) + 4);
    printf("********************PE?********************\n");   
    printf("PE->Machine:%x\n",pPEHeader->Machine);
    printf("节的数量%x\n",pPEHeader->NumberOfSections);   
    printf("可选头大小SizeOfOptionalHeader:%x\n",pPEHeader->SizeOfOptionalHeader);
   
    //可选PE头
    pOptionHeader = (PIMAGE_OPTIONAL_HEADER32)((DWORD)pPEHeader+IMAGE_SIZEOF_FILE_HEADER);
    printf("********************OPTIOIN_PE?********************\n");   
    printf("OPTION_PE:%x\n",pOptionHeader->Magic);
       

                }

   
    //释放内存
    free(pFileBuffer);
}   


判断是否是有效PE标志中的
    pNTHeader = (PIMAGE_NT_HEADERS)((DWORD)pFileBuffer+pDosHeader->e_lfanew);
这个的DWORD可以直接将pFileBuffer强转成DWORD吗
为什么强转类型不能写成下面这样


    pNTHeader = (PIMAGE_NT_HEADERS)(DWORD)(pFileBuffer+pDosHeader->e_lfanew);




xiaosi4081 发表于 2020-5-24 16:26:48

char t="11"
int a=(int)t

xiaosi4081 发表于 2020-5-24 16:27:19

领鱼币

永恒的蓝色梦想 发表于 2020-5-24 16:36:34

xiaosi4081 发表于 2020-5-24 16:42:02

鱼币呢?

xiaosi4081 发表于 2020-5-24 16:44:42

再试一次

xiaosi4081 发表于 2020-5-24 16:47:15

xiaosi4081 发表于 2020-5-24 16:44
再试一次

没有?{:10_269:}

BIYU 发表于 2020-5-24 18:31:02

下面的
        pNTHeader = (PIMAGE_NT_HEADERS)(DWORD)(pFileBuffer+pDosHeader->e_lfanew);
是将后边的
        pFileBuffer+pDosHeader->e_lfanew
都转换了吧,你确定你要转换的是它们的结果而不是单独一个
        pFileBuffe
r么?

KevinHu 发表于 2020-5-24 18:40:22

zhan

XFCoding 发表于 2020-5-28 16:51:25

鱼币还有吗
页: [1]
查看完整版本: 一个强转类型的疑问