Релоки в x64

Тема в разделе "WASM.X64", создана пользователем Garik, 19 июн 2009.

  1. Garik

    Garik New Member

    Публикаций:
    0
    Регистрация:
    19 июн 2009
    Сообщения:
    3
    Добрый день, к сожалению у меня нету платформы x64, так что проверить самостоятельно не могу. Может ли мне кто-то подсказать, как загрузчику удаётся обработать релоки в такой конструкции

    volatile struct q{
    ...
    } Hello;

    volatile struct p {
    DWORD m;
    } variable = { (DWORD)&Hello };

    Обрабатывая релоки в ручную, IMAGE_REL_BASED_DIR64 предполагает в этом [(DWORD)&Hello] месте прибавить 64х битный адрес, в то время как поле 32х битное.

    Спасибо! ( в приложении я прикрепил функцию, которую я написал для этой задачи )
     
  2. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Вообще variable = { (DWORD)&Hello } выглядит как динамическая инициализация. Тогда при использовании rip-relative адресации в этом месте не будет релоков вообще:
    Код (Text):
    1. lea rax, [rip + Hello]
    2. mov dword [rip + varialbe], eax
     
  3. Garik

    Garik New Member

    Публикаций:
    0
    Регистрация:
    19 июн 2009
    Сообщения:
    3
    спасибо за ваш ответ, но всё же, она там есть. в приложении я прикрепил файл, в котором используется такая структура. Дело в том, что это не динамическая инициализация.

    вот код, который генерируется компилятором Visual Studio 2008:
    (обратите внимание на то, что адреса указаны, как FLAT)
    Код (Text):
    1. ?m_Thunks@@3RCU_IMAGE_THUNK_DATA64@@C DQ FLAT:?m_NameList@@3PAUimport_by_name_s@@A ; m_Thunks
    2.     DQ  FLAT:?m_NameList@@3PAUimport_by_name_s@@A+22
    3.     DQ  FLAT:?m_NameList@@3PAUimport_by_name_s@@A+44
    4.     DQ  0000000000000000H
    5. ?m_Thunks2@@3RCU_IMAGE_THUNK_DATA64@@C DQ FLAT:?m_NameList@@3PAUimport_by_name_s@@A+176 ; m_Thunks2
    6.     DQ  0000000000000000H
    7. ?m_NameList@@3PAUimport_by_name_s@@A DW 00H     ; m_NameList
    8.     DB  'GetModuleHandleA', 00H
    9.     ORG $+3
    10.     DW  00H
    11.     DB  'LoadLibraryA', 00H
    12.     ORG $+7
    13.     DW  00H
    14.     DB  'GetProcAddress', 00H
    15.     ORG $+5
    16.     DW  00H
    17.     DB  'FreeLibrary', 00H
    18.     ORG $+8
    19.     DW  00H
    20.     DB  'VirtualAlloc', 00H
    21.     ORG $+7
    22.     DW  00H
    23.     DB  'VirtualProtect', 00H
    24.     ORG $+5
    25.     DW  00H
    26.     DB  'KERNEL32.DLL', 00H
    27.     ORG $+7
    28.     DW  00H
    29.     DB  'USER32.DLL', 00H
    30.     ORG $+9
    31.     DW  00H
    32.     DB  'EnumChildWindows', 00H
    33.     ORG $+3
    34.     ORG $+2
    35. ?ProtectionFlags@@3PAY111HA DD 01H          ; ProtectionFlags
    36.     DD  08H
    37.     DD  02H
    38.     DD  04H
    39.     DD  010H
    40.     DD  080H
    41.     DD  020H
    42.     DD  040H
    43. ?m_IID@@3RCU_IMAGE_IMPORT_DESCRIPTOR@@C DD FLAT:?m_Thunks@@3RCU_IMAGE_THUNK_DATA64@@C ; m_IID
    44.     DD  00H
    45.     DD  00H
    46.     DD  FLAT:?m_NameList@@3PAUimport_by_name_s@@A+134
    47.     DD  FLAT:?m_Thunks@@3RCU_IMAGE_THUNK_DATA64@@C
    48.     DD  FLAT:?m_Thunks2@@3RCU_IMAGE_THUNK_DATA64@@C
    49.     DD  00H
    50.     DD  00H
    51.     DD  FLAT:?m_NameList@@3PAUimport_by_name_s@@A+156
    52.     DD  FLAT:?m_Thunks2@@3RCU_IMAGE_THUNK_DATA64@@C
    53.     DD  00H
    54.     ORG $+16
    55. inject  ENDS
     
  4. Garik

    Garik New Member

    Публикаций:
    0
    Регистрация:
    19 июн 2009
    Сообщения:
    3
    Прошу прощения, я опечатался. Хотел написать, что динамической инициализации там нет :)
     
  5. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Ага, мы так и восприняли на самом деле.
    Хм... Посмотрели в VS2008:

    Вариант1.
    Код (Text):
    1. struct A
    2. {} a;
    3.  
    4. struct B
    5. {
    6.     DWORD dummy;          // sizeof(dummy) == _4_
    7. };
    8.  
    9. volatile B b = {(DWORD)&a};
    Переменная b инициализируется динамически (не во время компиляции). Именно с использованием rip-relative адресации, без релоков.

    Вариант2.
    Код (Text):
    1. struct A
    2. {} a;
    3.  
    4. struct B
    5. {
    6.     size_t dummy;          // sizeof(dummy) == _8_
    7. };
    8.  
    9. volatile B b = {(size_t)&a};
    Переменная b инициализируется статически (во время компиляции). Нужны релоки. Но в этом случае и размер поля == 64бита.

    В приложенном коде ничего не понятно :)
    Имелась в виду m_Thunks[] = { {(ULONGLONG)&m_NameList[id_GetModuleHandle]}, ... }? Но sizeof(ULONGLONG) == 8. Размер поля 64бита.
     
  6. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.553
    Адрес:
    Russia
    Если нет реальной машины, заюзай QEMU. Ось может и не потянет (А может и запуститься, я не проверял), но легко переводится в 64 битный режим и можно дальше тестить ваши релоки самостоятельно)
    А вообще купите Pentium D или Amd Athlon X2 64 простенький. Дешево и сердито.