鱼C论坛

 找回密码
 立即注册
查看: 1409|回复: 11

一个强转类型的疑问

[复制链接]
发表于 2020-5-24 15:59:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

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


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





  5. LPVOID ReadPEFile(LPSTR lpszFile)      
  6. {      
  7.     FILE *pFile = NULL;
  8.     DWORD fileSize = 0;
  9.     LPVOID pFileBuffer = NULL;  
  10.    
  11.     //打开文件
  12.     pFile = fopen(lpszFile, "rb");      
  13.     if(!pFile)  
  14.     {   
  15.         printf(" 无法打开 EXE 文件! ");
  16.         return NULL;
  17.     }   
  18.    
  19.     //从0开始读取文件大小,偏移量SEEK_END,就是到文件末尾      
  20.     fseek(pFile, 0, SEEK_END);  
  21.     fileSize = ftell(pFile);
  22.    
  23.     //重新设置到开头,后面还要用到读取
  24.     fseek(pFile, 0, SEEK_SET);  
  25.    
  26.     //分配缓冲区,malloc的返回值是一个缓冲区的指针
  27.     pFileBuffer = malloc(fileSize);
  28.    
  29.     if(!pFileBuffer)   
  30.     {   
  31.         printf(" 分配缓冲区失败! ");
  32.         fclose(pFile);
  33.         return NULL;
  34.     }   

  35.     //将文件数据读取到缓冲区   
  36.     size_t n = fread(pFileBuffer, fileSize, 1, pFile);  
  37.     if(!n)  
  38.     {   
  39.         printf(" 读取数据失败! ");
  40.         free(pFileBuffer);
  41.         fclose(pFile);
  42.         return NULL;
  43.     }

  44.     //关闭文件
  45.     fclose(pFile);  
  46.     return pFileBuffer;     
  47. }      

  48. VOID PrintNTHeaders()      
  49. {      
  50.     LPVOID pFileBuffer = NULL;  
  51.     PIMAGE_DOS_HEADER pDosHeader = NULL;   
  52.     PIMAGE_NT_HEADERS pNTHeader = NULL;
  53.     PIMAGE_FILE_HEADER pPEHeader = NULL;   
  54.     PIMAGE_OPTIONAL_HEADER32 pOptionHeader = NULL;  
  55.     PIMAGE_SECTION_HEADER pSectionHeader = NULL;   
  56.    
  57.     pFileBuffer = ReadPEFile(FILEPATH);
  58.     if(!pFileBuffer)   
  59.     {   
  60.         printf("文件读取失败\n");
  61.         return ;
  62.     }   
  63.    
  64.     //判断是否是有效的MZ标志,也就是0x5A4D,取前四个字节
  65.     if(*((PWORD)pFileBuffer) != IMAGE_DOS_SIGNATURE)   
  66.     {   
  67.         printf("不是有效的MZ标志\n");
  68.         free(pFileBuffer);
  69.         return ;
  70.     }   

  71.     pDosHeader = (PIMAGE_DOS_HEADER)pFileBuffer;   
  72.     //打印DOS头   
  73.     printf("********************DOS头********************\n");   
  74.     printf("MZ标志:%x\n",pDosHeader->e_magic);   
  75.     printf("PE偏移:%x\n",pDosHeader->e_lfanew);
  76.    
  77.     //判断是否是有效的PE标志  
  78.     if(*((PDWORD)((DWORD)pFileBuffer+pDosHeader->e_lfanew)) != IMAGE_NT_SIGNATURE)  
  79.     {   
  80.         printf("不是有效的PE标志\n");
  81.         free(pFileBuffer);
  82.         return ;
  83.     }   

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


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

  89.     pPEHeader = (PIMAGE_FILE_HEADER)(((DWORD)pNTHeader) + 4);  
  90.     printf("********************PE?********************\n");   
  91.     printf("PE->Machine:%x\n",pPEHeader->Machine);
  92.     printf("节的数量%x\n",pPEHeader->NumberOfSections);   
  93.     printf("可选头大小SizeOfOptionalHeader:%x\n",pPEHeader->SizeOfOptionalHeader);
  94.    
  95.     //可选PE头
  96.     pOptionHeader = (PIMAGE_OPTIONAL_HEADER32)((DWORD)pPEHeader+IMAGE_SIZEOF_FILE_HEADER);  
  97.     printf("********************OPTIOIN_PE?********************\n");   
  98.     printf("OPTION_PE:%x\n",pOptionHeader->Magic);  
  99.        

  100.                 }

  101.    
  102.     //释放内存  
  103.     free(pFileBuffer);  
  104. }   
复制代码



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


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




小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-5-24 16:26:48 | 显示全部楼层

回帖奖励 +1 鱼币

char t[40]="11"
int a=(int)t
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-24 16:27:19 | 显示全部楼层
领鱼币
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-24 16:36:34 | 显示全部楼层

回帖奖励 +1 鱼币

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-5-24 16:42:02 | 显示全部楼层
鱼币呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-24 16:44:42 | 显示全部楼层
再试一次
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-24 16:47:15 | 显示全部楼层

没有?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-24 18:31:02 | 显示全部楼层

回帖奖励 +1 鱼币

下面的
        pNTHeader = (PIMAGE_NT_HEADERS)(DWORD)(pFileBuffer+pDosHeader->e_lfanew);
是将后边的
        pFileBuffer+pDosHeader->e_lfanew
都转换了吧,你确定你要转换的是它们的结果而不是单独一个
        pFileBuffe
r么?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-24 18:40:22 | 显示全部楼层

回帖奖励 +1 鱼币

zhan
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-5-28 16:51:25 | 显示全部楼层

回帖奖励 +1 鱼币

鱼币还有吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-16 06:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表