Подскажите, чем править relocation table

Тема в разделе "WASM.BEGINNERS", создана пользователем Dmitry_Milk, 31 дек 2007.

  1. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    535
    Собственно, сабж.

    При модификации не удалось обойтись без команд, использующих абсолютную адресацию. Пока работает, но это dll, вдруг загрузится не по рекомендед адресу.
     
  2. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    в смысле? я так и не понял, че ты хотел сказать.
    какие команды? где? что они делают? зачем править релоки???
     
  3. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    535
    Хмм, возможно я как новичок чего-то не допонимаю.

    Как я понимаю, DLL может быть отображена в адресном пространстве процесса не обязательно по тому адресу, который подразумевался при компиляции этой DLL. Соответственно, адреса переходов или адреса обращений к данным, росполодженным по фиксированным адресам, изменятся. В большинстве случаев это не существенно, если в команде используется адресация с указанием приращения относительно адреса следующей команды. Но если в команде используется абсолютный адрес (подразумевающий, что код размещен по строго определенному адресу), то при размещении DLL в другом месте адресного пространства процесса этот адрес буде туказывать уже не туда, и соответственно должен быть откорректирован. И как я понял из туториала izceliona про PE, где то в заголовке PE-файла есть некая таблица, говорящая, в каких местах кода расположены такие абсолютные адреса, подлежащие модификации при размещении DLL в другом месте адресного пространства процесса.

    При исправлении некой DLL я добавил команду обращения к ячейке в сегменте данных с использованием абсолютного адреса (раньше на этом месте были только nop). И как понимаю, операнд этой команды должен быть при необходимости исправлен, а значит, байты операнда должны быть указаны вышеуказанной таблице. Или я что-то неправильно понимаю?
     
  4. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    535
    конкретно вот

    Код (Text):
    1. .text:100C1F53                 push    ebx                     [53]
    2. .text:100C1F54                 mov     ebx, ctrlMoveTick  [8B 1D F8 FF 0C 10]
    3. .text:100C1F5A                 add     ebx, 200              [81 C3 C8 00 00 00]
    Здесь в команде указан абсолютный адрес переменной ctrlMoveTick [100CFFF8], а значит байты с 100С1А56 по 100С1A59 должны быть при необходимости исправлены при перемещении, то есть как-то указаны в relocation table.
     
  5. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Dmitry_Milk лучше напиши базонезависимый код.
    вместо
    mov ebx, ctrlMoveTick
    ввставь
    call label
    label:
    pop eax
    mov ebx,[eax - offset label + offset ctrlMoveTick]
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Если очень хочется править - берешь и правишь. В чем проблема?
    IMAGE_OPTIONAL_HEADER::lol: ataDirectory[IMAGE_ENTRY_BASE_RELOCATION].VirtualAddress укажет на эту таблицу.
     
  7. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    535
    asd, спасибо, так и сделаю:)

    Это в чем? Я правлю Идой, у меня там пункт меню Patch, мне удобно, поскольку сразу пишу асм-инструкции и могу использовать сразу символьные имена и смещения полей структур. А указанную вами конструкцию где использовать? в скриптах Иды?
     
  8. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    это в структуре PE
     
  9. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    Dmitry_Milk
    например так

    Код (Text):
    1. BOOL PELdrProcessingRelocations(__in LPVOID VirtualImageBase,
    2.                                 __in DWORD RelocationsRVA,
    3.                                 __in DWORD BaseDelta)
    4. //Processing the relocations if needed
    5. {
    6.     __try//just to be sure
    7.     {
    8.         PIMAGE_BASE_RELOCATION NextRelocBlock = (PIMAGE_BASE_RELOCATION)((DWORD)VirtualImageBase + RelocationsRVA);
    9.         while(NextRelocBlock->VirtualAddress)
    10.         {
    11.             DWORD RelocsNumber = (NextRelocBlock->SizeOfBlock - sizeof(IMAGE_BASE_RELOCATION)) >> 1;
    12.             PRELOCATION_ENTRY RelocEntries = (PRELOCATION_ENTRY)((DWORD)NextRelocBlock + sizeof(IMAGE_BASE_RELOCATION));
    13.             for(DWORD i = 0; i < RelocsNumber; i++)
    14.                 if(RelocEntries[i].Type==IMAGE_REL_BASED_HIGHLOW)
    15.                     *(LPDWORD)((DWORD)VirtualImageBase/*base*/ + NextRelocBlock->VirtualAddress/*page*/ + (DWORD)RelocEntries[i].Offset)/*offset*/ += BaseDelta;
    16.             NextRelocBlock = (PIMAGE_BASE_RELOCATION)((DWORD)NextRelocBlock + NextRelocBlock->SizeOfBlock);
    17.         }
    18.     }
    19.     __except(EXCEPTION_EXECUTE_HANDLER)
    20.     {
    21.         return FALSE;
    22.     }
    23.     return TRUE;
    24. }
    25.  
    26. //пример вызова
    27.  
    28.     //------------------------------------------
    29.     //applying relocations if needed
    30.     PELdrValidate(VirtualImageBase, &DosH, &NTH, &SecH);
    31.     if(NSImageBase)//standart or non-stadart ImageBase
    32.     {
    33.         DWORD BaseDelta = (DWORD)VirtualImageBase - NTH->OptionalHeader.ImageBase;
    34.         if(NTH->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress)
    35.             PELdrProcessingRelocations(VirtualImageBase, NTH->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress, BaseDelta);
    36.         else
    37.         {
    38.             //------------------------------------------
    39.             //release allocated space
    40.             PELdrReleaseSpace(VirtualImageBase, NTH->OptionalHeader.SizeOfImage);
    41.             //------------------------------------------
    42.             return CANT_FIXUP_RELOCS;
    43.         }
    44.     }
    45.     //------------------------------------------
    Да и вообще совет, чтобы в этом дерьме разобраться и не задавать глупых вопросов - напиши какую-нибудь прогу по работе с ПЕ - даже ПЕ браузер сойдет.
    Просто чтобы разобраться со структурами.
     
  10. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    535
    UTeX, не, вы привели уже применение релоков при загрузке при измененной базе. Я же всего лишь спрашиваю про добавление или удаление релоков, когда я вношу изменения в экзешник или длл. Понятно, что все это можно сделать либо руками, либо написав прогу. А я спрашивал про уже готовые утилиты. Что-нибудь типа PETools или PEiD, но чтоб не только показывали релоки, но и позволяли добавлять или удалять. А еще лучше, чтоб какой-нибудь IDC или плагин для IDA, который бы изменял релоки в альтернативном имидже в Иде, когда я что-то патчу в альтернативном имидже в Иде, чтоб сразу потом создавать DIF-файл, учитывающий отличия от оригинала как в секциях с кодом, данными, импортом/экспортом, так и в секции с релоками.

    Сегодня я уже разобрался с PE-структурами и в общем то уже получилось изменить прямо в Иде секцию импорта, добавив в нее новую функцию. Но с релоками сложнее - почему то Ида не показывает мне ту часть имиджа, на которую должна попасть секция с релоками.
     
  11. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    535
    Great писал:
    так чем править-то? не руками же в Hiew побайтно? И не писать же собственную программу, как предлагает UTeX - я так думаю, что я не первый на свете человек, которому при патчинге понадобилось еще поправить и релоки - неужели каждый столкнувшийся с этой задачей пишет свою собственную прогу для этих целей?
     
  12. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    а че там писать то? от силы на полчаса работы
     
  13. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    535
    Ну теперь то да, когда на разбирательство с форматом PE убит почти весь день :dntknw:
     
  14. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Да там в принципе все просто, ну конечно если знать)
     
  15. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    535
    Все, вопрос отпал. Поправил руками в Heiw, благо .reloc секция последняя и могу элементарно исправлять ее длину при необходимости. Действительно все просто. Если знать. Только на "знать" (в том числе и на "знать" то, что инструментов готовых нет) ушло дня полтора. А на исправление - минут 15. Обидно :dntknw:
     
  16. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Почему обидно? Зато теперь знать будешь. Это же единовременно уходит, а потом уже с полученными знаниями гораздо проще
     
  17. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    Dmitry_Milk
    а так всегда обидно - надейся только на свои силы в основном