RvaToFileOffset 内存偏移转成文件偏移(滴水课后作业)
生活随笔
收集整理的這篇文章主要介紹了
RvaToFileOffset 内存偏移转成文件偏移(滴水课后作业)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目說明
將內存偏移RVA轉成文件偏移FOA的函數;
思路是遍歷節表,比較節內存偏移VirtualAddress和RVA,確定RVA所在的節之后,計算RVA距離所在節首地址的偏移offset,然后返回offset+PointerToRawData.
以xp的notepad.exe為例
.text節的文件偏移是400h,內存偏移是1000h,調用函數結果如下:
函數源碼
// RVA 轉 FOA DWORD RvaToFoa(LPVOID pFileBuffer, DWORD dwRva) {PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)pFileBuffer;PIMAGE_FILE_HEADER pPEHeader = (PIMAGE_FILE_HEADER)(pDosHeader->e_lfanew + (DWORD)pFileBuffer + 4);PIMAGE_OPTIONAL_HEADER32 pOptionHeader = (PIMAGE_OPTIONAL_HEADER32)((DWORD)pPEHeader + sizeof(IMAGE_FILE_HEADER));PIMAGE_SECTION_HEADER pSectionHeader = \(PIMAGE_SECTION_HEADER)((DWORD)pOptionHeader + pPEHeader->SizeOfOptionalHeader);// RVA在文件頭中或者文件對齊==內存對齊時,RVA==FOA 錯!第一句是對的,第二句是錯的if (dwRva < pOptionHeader->SizeOfHeaders){return dwRva;}// 遍歷節表,確定偏移屬于哪一個節 for (int i = 0; i < pPEHeader->NumberOfSections; i++){if (dwRva >= pSectionHeader[i].VirtualAddress && \dwRva < pSectionHeader[i].VirtualAddress + pSectionHeader[i].Misc.VirtualSize){int offset = dwRva - pSectionHeader[i].VirtualAddress;return pSectionHeader[i].PointerToRawData + offset;}}printf("找不到RVA %x 對應的 FOA,轉換失敗\n", dwRva);return 0; } 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的RvaToFileOffset 内存偏移转成文件偏移(滴水课后作业)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: FileBuffer 与 ImageBu
- 下一篇: 向代码节添加代码编程实现