强制转换可能丢失值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | // testpehead.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <stdio.h> #include <windows.h> #include <Commdlg.h> int main( int argc, char * argv[]) { char szFilePath[MAX_PATH]; //要分析的文件名及路径 OPENFILENAME ofn; //定义结构,调用打开对话框选择要分析的文件及其保存路径 HANDLE hFile; // 文件句柄 HANDLE hMapping; // 映射文件句柄 LPVOID ImageBase; // 映射基址 PIMAGE_DOS_HEADER pDH = NULL; //指向IMAGE_DOS结构的指针 PIMAGE_NT_HEADERS pNtH = NULL; //指向IMAGE_NT结构的指针 PIMAGE_FILE_HEADER pFH = NULL; //指向IMAGE_FILE结构的指针 PIMAGE_OPTIONAL_HEADER pOH = NULL; //指向IMAGE_OPTIONALE结构的指针 //必要的初始换 memset (szFilePath, 0, MAX_PATH); memset (&ofn, 0, sizeof (ofn)); ofn.lStructSize = sizeof (ofn); ofn.hwndOwner = NULL; ofn.hInstance = GetModuleHandle(NULL); ofn.nMaxFile = MAX_PATH; ofn.lpstrInitialDir = L "." ; ofn.lpstrFile = ( LPWSTR )szFilePath; ofn.lpstrTitle = L "选择 PE文件打开 by For" ; ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY; ofn.lpstrFilter = L "*.exe\0*.exe\0" ; //过滤器 if (!GetOpenFileName(&ofn)) //调用打开对话框,选择要分析的文件 { MessageBox(NULL, L "打开文件错误" , NULL, MB_OK); return 0; } //选择要分析的文件后,经过3步打开并映射选择的文件到虚拟内存中 //1.创建文件内核对象,其句柄保存于hFile,将文件在物理存储器的位置通告给操作系统 hFile = CreateFile(ofn.lpstrFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if (!hFile) { MessageBox(NULL, L "打开文件错误" , NULL, MB_OK); return 0; } //2.创建文件映射内核对象(分配虚拟内存),句柄保存于hFileMapping hMapping = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL); if (!hMapping) { CloseHandle(hFile); return FALSE; } //3.将文件数据映射到进程的地址空间,返回的映射基址保存在ImageBase中 ImageBase = MapViewOfFile(hMapping, FILE_MAP_READ, 0, 0, 0); if (!ImageBase) { CloseHandle(hMapping); CloseHandle(hFile); return FALSE; } //IMAGE_DOS Header结构指针 pDH = (PIMAGE_DOS_HEADER)ImageBase; //IMAGE_NT Header结构指针 pNtH = (PIMAGE_NT_HEADERS)(( DWORD )pDH + pDH->e_lfanew); //IMAGE_File Header结构指针 pFH = &pNtH->FileHeader; //IMAGE_Optional Header结构指针 pOH = &pNtH->OptionalHeader; //输出各个结构中重要成员的取值 printf ( "Dos header RVA:%08lX\n" , pDH - ImageBase); printf ( "NT header RVA:%08lX\n" , pDH->e_lfanew); printf ( "File header RVA:%08lX\n" , pDH->e_lfanew + sizeof (pNtH->Signature)); printf ( "Optional header RVA:%08lX\n" , pDH->e_lfanew + sizeof (pNtH->Signature) + + sizeof (pNtH->FileHeader)); printf ( "Section header RVA:%08lX\n" , pDH->e_lfanew + sizeof (pNtH->Signature) + sizeof (pNtH->OptionalHeader) + sizeof (pNtH->FileHeader)); printf ( "e_magic: %04X ASCII值为:%c%c\n" , pDH->e_magic, pDH->e_magic % 256, pDH->e_magic / 256); printf ( "e_lfarlc: %08X\n" , pDH->e_lfarlc); printf ( "\n\nSignature: %08X ASCII值:%c%c00\n" , pNtH->Signature, pNtH->Signature % 4096, pNtH->Signature / 256); printf ( "Machine: %04X\n" , pFH->Machine); printf ( "NumberOfSections: %04X\n" , pFH->NumberOfSections); printf ( "Characteristics: %04X\n" , pFH->Characteristics); printf ( "Magic: %04X\n" , pOH->Magic); printf ( "SizeOfCode: %08X\n" , pOH->SizeOfCode); printf ( "AddressOfEntryPoint:%08X\n" , pOH->AddressOfEntryPoint); printf ( "ImageBase: %08X\n" , pOH->ImageBase); printf ( "SectionAlignment: %08X\n" , pOH->SectionAlignment); printf ( "FileAlignment: %08X\n" , pOH->FileAlignment); printf ( "SizeOfImage: %08X\n" , pOH->SizeOfImage); system ( "pause" ); return 0; }ofn.lpstrFile = ( LPWSTR )szFilePath;szFilePath值C<br><br><br>注:此方式是错误的获取方式 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2018-04-16 查看程序内存是否泄露
2018-04-16 Ubuntu 安装QT5 后编译程序报错: FindQt5Widgets.cmake
2018-04-16 pcd转换ply
2018-04-16 点云数据保存为pcd文件_pcd_write.cpp