RVA => Raw offset, как?

Discussion in 'WASM.BEGINNERS' started by Ko1d, Nov 3, 2007.

  1. Ko1d

    Ko1d New Member

    Blog Posts:
    0
    здравствуйте,

    делаю LoadLibrary dll'ки, далее, получаю адрес внутри подгруженной dll'ки(функция этой же dll'ки возвращает) - rva.
    После этого необходимо этот же адрес найти в этой дллке на жестком диске, т.е. открывая её с CreateFile, CreateFileMapping, MapViewOfFile.

    известно, в какой секции этот адрес(.data)
    формула offset = rva - image_section_header.virtual_address + image_section_header.pointer_to_raw_data - возвращает непонятный результат, а именно с каким-то непонятным смещением вперед...
    откуда оно берется как раз и хочется спросить
    а так же, как правильно перевести rva полученное вышеуказанным образом в физическое смещение

    большое спасибо!
     
  2. Asterix

    Asterix New Member

    Blog Posts:
    0
    необходимо вычислить смещение в памяти относительно начала секции, далее суммировать
    его с файловым смещением начала секции

    об этом написано в "Упаковщиках" на сайте, хотя слегка и мутновато
     
  3. W4FhLF

    W4FhLF New Member

    Blog Posts:
    0
    http://www.google.com/search?q=RVAToOffset
    http://www.google.com/search?q=RVA2Offset
     
  4. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Blog Posts:
    0
    Ko1d
    <:|||:>ГОРМОШКО
     
  5. rmn

    rmn Well-Known Member

    Blog Posts:
    0
    Ko1d
    Покажи как получаешь адрес функции
     
  6. nitrotoluol

    nitrotoluol New Member

    Blog Posts:
    0
    формула правильная
    но смещение по идее должно быть назад
     
  7. Ko1d

    Ko1d New Member

    Blog Posts:
    0
    Прошу прощения, немного не так изьяснился:

    ...
    После этого необходимо этот же адрес ( а не адрес функции)
    ...



    Code (Text):
    1. invoke LoadLibrary, offset dllName
    2. mov hdll, eax
    3.  
    4. invoke GetProcAddress, eax, offset funcName
    5.  
    6. push offset pArray     
    7. call eax
    8.  
    9. mov ebx, pArray
    10. sub ebx, hdll       ; в ebx, RVA из которого нужно вычислить offset
    11. mov rva, ebx
    12.  
    13. ...             ; открываю эту длл (CreateFile, CreateFileMapping, MapViewOfFile)
    14.  
    15.  
    16. mov edi, pDataSection   ; .data в открытой на хард драйве длл
    17. assume edi : ptr IMAGE_SECTION_HEADER
    18.  
    19. mov esi, [edi].VirtualAddress
    20. add esi, [edi].PointerToRawData
    21.  
    22. mov ebx, rva
    23. sub ebx, esi        ; получаю странную фигню
    может и назад, не скажу точно сейчас..
    в любом случае, как можно определить точное смещение?..
     
  8. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Blog Posts:
    0
    nitrotoluol
    Зачем че-либо показывать? В статье про упаковщики приведена даже формула, да я понимаю что есть случаи когда она не работает, но это автор уж сам додумает
     
  9. rmn

    rmn Well-Known Member

    Blog Posts:
    0
    EvilsInterrupt
    Формулу он знает, он еще в первом посте ее показал. Внимательней смотрим :)

    Ko1d
    это как?
     
  10. Ko1d

    Ko1d New Member

    Blog Posts:
    0
    исправил )
     
  11. yuzvir

    yuzvir New Member

    Blog Posts:
    0
    дык логическая ошибка
    Code (Text):
    1. mov esi, [edi].VirtualAddress
    2. add esi, [edi].PointerToRawData
    3.  
    4. mov ebx, rva
    5. sub ebx, esi        ; получаю странную фигню
    это offset = rva - image_section_header.virtual_address - image_section_header.pointer_to_raw_data
    а надо
    Code (Text):
    1. mov esi, [edi].VirtualAddress
    2. sub esi, [edi].PointerToRawData
    3.  
    4. mov ebx, rva
    5. sub ebx, esi
    вообще вот есть либа http://usar.pp.ru/download/index.php?path=&download=yzPELib.v0.4.rar
    там функция VA2RO, работает с учетом всяких извращений в PE файле
     
  12. Ko1d

    Ko1d New Member

    Blog Posts:
    0
    Большое спасибо всем!

    особенно yuzvir :)
    непонятно, только почему ошибка в логике, очевидно ето тонкости формата PE....
     
  13. l_inc

    l_inc New Member

    Blog Posts:
    0
    Ko1d
    Кажется сочетательный закон сложения (раскрытие скобок) классе во втором изучается.