формула для перевода VA в оффсет

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by ShkiperLol, 7 Jun 2011.

  1. ShkiperLol

    ShkiperLol Banned

    Joined:
    17 Apr 2010
    Messages:
    182
    Likes Received:
    1
    Reputations:
    0
    Подскажите плиз рабочую формулу для перевода VA в абсолютный внутрифайловый оффсет.
    Использовал старую добрую формулу с скреклаб:
    offset=RVA-IMAGE_SECTION_HEADE.VirtualAddress+IMAGE_SECTION_HEADER.PointerToRawData

    [​IMG]

    offset=48700-49000+19c00=19300
    Но мой адрес не соответствует правильному.
    [​IMG]
    Эта формула работает в разных ехе по разному,в одних выдает правильный результат в других неправильный.Можете подсказать почему так?
    Это ведь за счет выравнивания секций в памяти и на диске такое происходит?Какая в этом случае будет правильная формула?
     
  2. zeppe1in

    zeppe1in Elder - Старейшина

    Joined:
    12 Jul 2006
    Messages:
    343
    Likes Received:
    66
    Reputations:
    18
    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;
    }
     
  3. ShkiperLol

    ShkiperLol Banned

    Joined:
    17 Apr 2010
    Messages:
    182
    Likes Received:
    1
    Reputations:
    0
    zeppe1in,в коде такая же формула,о которой я писал
    Это макрос?Или это твоя функция?
     
  4. zeppe1in

    zeppe1in Elder - Старейшина

    Joined:
    12 Jul 2006
    Messages:
    343
    Likes Received:
    66
    Reputations:
    18
    Code:
    #define ALIGN_DOWN(x, align)  (x & ~(align-1))//выравнивание вниз
    #define ALIGN_UP(x, align)    ((x & (align-1))?ALIGN_DOWN(x,align)+align:x)//выравнивание вверх
    Но работает как часы:)
     
  5. desTiny

    desTiny Elder - Старейшина

    Joined:
    4 Feb 2007
    Messages:
    1,006
    Likes Received:
    444
    Reputations:
    94
    а теперь подумай ещё раз.
     
  6. ShkiperLol

    ShkiperLol Banned

    Joined:
    17 Apr 2010
    Messages:
    182
    Likes Received:
    1
    Reputations:
    0
    Все правильно вроде
     
  7. ShkiperLol

    ShkiperLol Banned

    Joined:
    17 Apr 2010
    Messages:
    182
    Likes Received:
    1
    Reputations:
    0
    zeppe1in спасибо все работает,просто я незнал как нужно выравнивать.
     
  8. desTiny

    desTiny Elder - Старейшина

    Joined:
    4 Feb 2007
    Messages:
    1,006
    Likes Received:
    444
    Reputations:
    94
    и ещё раз.
    что больше: 48700 или 49000?
     
  9. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Зачем тебе оффсет считать до секции? Если в таблице секций есть PointerToRawData ??