Подскажите плиз рабочую формулу для перевода VA в абсолютный внутрифайловый оффсет. Использовал старую добрую формулу с скреклаб: offset=RVA-IMAGE_SECTION_HEADE.VirtualAddress+IMAGE_SECTION_HEADER.PointerToRawData offset=48700-49000+19c00=19300 Но мой адрес не соответствует правильному. Эта формула работает в разных ехе по разному,в одних выдает правильный результат в других неправильный.Можете подсказать почему так? Это ведь за счет выравнивания секций в памяти и на диске такое происходит?Какая в этом случае будет правильная формула?
Code: DWORD RVAtoOffset(DWORD Base,DWORD RVA) { PIMAGE_NT_HEADERS pPE=(PIMAGE_NT_HEADERS)((long)Base+((PIMAGE_DOS_HEADER)Base)->e_lfanew); short NumberOfSection=pPE->FileHeader.NumberOfSections; long SectionAlign=pPE->OptionalHeader.SectionAlignment; PIMAGE_SECTION_HEADER Section=(PIMAGE_SECTION_HEADER) (pPE->FileHeader.SizeOfOptionalHeader+(long)& (pPE->FileHeader)+sizeof(IMAGE_FILE_HEADER)); long VirtualAddress,PointerToRawData; bool flag=false; for (int i=0;i<NumberOfSection;i++) { if ((RVA>=(Section->VirtualAddress))&& (RVA<Section->VirtualAddress+ ALIGN_UP((Section->Misc.VirtualSize),SectionAlign) )) { VirtualAddress=Section->VirtualAddress; PointerToRawData=Section->PointerToRawData; flag=true; break; } Section++; } if (flag) return RVA-VirtualAddress+PointerToRawData; else return RVA; }
Code: #define ALIGN_DOWN(x, align) (x & ~(align-1))//выравнивание вниз #define ALIGN_UP(x, align) ((x & (align-1))?ALIGN_DOWN(x,align)+align:x)//выравнивание вверх Но работает как часы