设为首页 加入收藏

TOP

2.14 PE结构:地址之间的转换(三)
2023-09-23 15:44:05 】 浏览:660
Tags:2.14 结构
PIMAGE_NT_HEADERS)((BYTE*)ImageBase + pDosHeader->e_lfanew); if (pNtHeaders->Signature != IMAGE_NT_SIGNATURE) { return NULL; } return pNtHeaders; } // 读取PE结构的封装 HANDLE OpenPeFile(LPTSTR FileName) { HANDLE hFile, hMapFile, lpMapAddress = NULL; DWORD dwFileSize = 0; // CreateFile 既可以创建文件,也可以打开文件,这里则是打开文件的含义 hFile = CreateFile(FileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) { return 0; } // 获取到文件大小 dwFileSize = GetFileSize(hFile, NULL); // 创建文件的内存映像 hMapFile = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, dwFileSize, NULL); if (hMapFile == NULL) { return 0; } // 读取映射中的内存并返回一个句柄 lpMapAddress = MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, dwFileSize); if (lpMapAddress != NULL) { return lpMapAddress; } return 0; } // 将 FOA(文件偏移) --> 转换为 VA(虚拟地址) DWORD FOA_To_VA(HANDLE ImageBase, DWORD dwFOA) { PIMAGE_NT_HEADERS pNtHead = NULL; PIMAGE_FILE_HEADER pFileHead = NULL; PIMAGE_SECTION_HEADER pSection = NULL; DWORD NumberOfSectinsCount = 0; DWORD dwImageBase = 0; pNtHead = GetNtHeader(ImageBase); pSection = IMAGE_FIRST_SECTION(pNtHead); dwImageBase = pNtHead->OptionalHeader.ImageBase; NumberOfSectinsCount = pNtHead->FileHeader.NumberOfSections; for (int each = 0; each < NumberOfSectinsCount; each++) { DWORD PointerRawStart = pSection[each].PointerToRawData; // 文件偏移开始位置 DWORD PointerRawEnds = pSection[each].PointerToRawData + pSection[each].SizeOfRawData; // 文件偏移结束位置 if (dwFOA >= PointerRawStart && dwFOA <= PointerRawEnds) { DWORD RVA = pSection[each].VirtualAddress + (dwFOA - pSection[each].PointerToRawData); // 计算出RVA DWORD VA = RVA + pNtHead->OptionalHeader.ImageBase; // 计算出VA return VA; } } return -1; } int main(int argc, char * argv[]) { // 打开文件 HANDLE lpMapAddress = NULL; lpMapAddress = OpenPeFile(L"d://lyshark.exe"); // 转换 DWORD VA = FOA_To_VA(lpMapAddress, 0x1000); printf("FOA --> VA 结果为: 0x%X \n", VA); system("pause"); return 0; }

运行后即可将文件偏移0x1000转换为内存虚拟地址0x401000如下图所示;

本文作者: 王瑞
本文链接: https://www.lyshark.com/post/ccb722fb.html
版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

首页 上一页 1 2 3 下一页 尾页 3/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇学习笔记 下一篇4.1 应用层Hook挂钩原理分析

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目