RVA => Raw offset, как?

Тема в разделе "WASM.BEGINNERS", создана пользователем Ko1d, 3 ноя 2007.

  1. Ko1d

    Ko1d New Member

    Публикаций:
    0
    Регистрация:
    11 апр 2006
    Сообщения:
    8
    здравствуйте,

    делаю 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

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    необходимо вычислить смещение в памяти относительно начала секции, далее суммировать
    его с файловым смещением начала секции

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

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    http://www.google.com/search?q=RVAToOffset
    http://www.google.com/search?q=RVA2Offset
     
  4. EvilsInterrupt

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

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Ko1d
    <:|||:>ГОРМОШКО
     
  5. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.347
    Ko1d
    Покажи как получаешь адрес функции
     
  6. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    формула правильная
    но смещение по идее должно быть назад
     
  7. Ko1d

    Ko1d New Member

    Публикаций:
    0
    Регистрация:
    11 апр 2006
    Сообщения:
    8
    Прошу прощения, немного не так изьяснился:

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



    Код (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 Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    nitrotoluol
    Зачем че-либо показывать? В статье про упаковщики приведена даже формула, да я понимаю что есть случаи когда она не работает, но это автор уж сам додумает
     
  9. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.347
    EvilsInterrupt
    Формулу он знает, он еще в первом посте ее показал. Внимательней смотрим :)

    Ko1d
    это как?
     
  10. Ko1d

    Ko1d New Member

    Публикаций:
    0
    Регистрация:
    11 апр 2006
    Сообщения:
    8
    исправил )
     
  11. yuzvir

    yuzvir New Member

    Публикаций:
    0
    Регистрация:
    20 май 2005
    Сообщения:
    97
    дык логическая ошибка
    Код (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
    а надо
    Код (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

    Публикаций:
    0
    Регистрация:
    11 апр 2006
    Сообщения:
    8
    Большое спасибо всем!

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

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Ko1d
    Кажется сочетательный закон сложения (раскрытие скобок) классе во втором изучается.