Загрузка с произвольного адреса без секции релоков

Тема в разделе "WASM.WIN32", создана пользователем UTeX, 21 дек 2007.

  1. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    Сабж
    Как сгенерировать таблицу релоков "на лету"?
    У кого какие идеи кроме Дизасма инструкций и полного перебора как в PE Tools?
     
  2. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    можно рандомно фиксить рандомное число двордов, может получится ... когда-нибудь
     
  3. UTeX

    UTeX New Member

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

    постебаться?

    на самом деле - это проблема.
     
  4. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Типа, того, только не обижайся:)


    Ну сам подумай, как ты это сделаешь? Можно конечно попробовать загрузить образ на другой адрес и ловить исключения. Только обращение к оригинальнуму месту где должен располагаться образ не должно никому выделяться. + в таком варианте нужно чтобы прога прошла по всем своим ветвлениям, что пожалуй посложнее будет, чем полный перебор.
     
  5. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    ясно
    вобщем лучше дизассемблировать все иструкции в секции кода и там где встречается адрес - фиксить в соответствии с дельтой базы.
     
  6. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    ну-ну. ида то не может целиком это сделать. Или ты её переплюнуть хочешь?
     
  7. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    ну просто теоретически если дизасм движок нормальный, то ведь можно решить проблему
    и походу сложностей особых быть не должно?

    в чем бок может быть в этой идее?
     
  8. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    jmp eax
    ты как узнаешь куда прыгает? Эмулятор приделаешь?
     
  9. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    в еах ведь что-т о будет записано перед этим.
    тобишь все сводится к тому - как отличить адреса от обычных данных при непосредственной записи в регистр?
     
  10. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Ну вот собственно и приехали:)

    чтобы определить значение eax, нужен эмулятор. Есть желание делать - пожалуйста.
     
  11. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    имеешь в виду его тип?
    потому как его значение будет определено когда произойдет в него запись непосредственно или косвенно (если косвенно то тут все понятно, а если непосредственно то не понятно что за тип)

    я верно понимаю?
     
  12. PaCHER

    PaCHER New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2006
    Сообщения:
    852
    Имха определить можно, но сложно и не тривиально. Всеравно руками прийдется доделывать неоднозначности. Адреса которые фиксятся релоками лежат в пределах имэйджа файла, но тутже и обычная константа может иметь значение которое попадает в эти пределы.
    Нащет jmp eax в еах перед этим будет занесен адрес который предварительно будет прощитан, так что это тоже фиксится. Помоему больше проблем возникинит с конструкциями кейсов.
     
  13. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    Не совсем понятно, при чем тут кейсы
     
  14. PaCHER

    PaCHER New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2006
    Сообщения:
    852
    Структура кейса такая:

    lea eax,offset table_case
    mov eax,[eax+ecx*4]
    jmp eax
    или
    jmp [eax+ecx*4]

    table_case: ;вся таблица под релоками и находится может где угодно, даже в коде процедуры
    dd proc1
    dd proc2
    dd proc3
    dd proc4

    Тоесть нужно распозновать структуры кейсов, даже ида не всегда нормально их распознает.
     
  15. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Ну да, вроде так и сделано в petools.

    много багов будет. Даже такой код будет х.з. куда указывать
    call m1
    m1:
    pop eax
    add eax,123
    jmp eax


    Вообще в "Об упаковщиках в последний раз: Часть первая - теоретическая" в пункте "2.5 Директория перемещаемых элементов" описан способ с загрузкой образа по 2 разным адресам. Так что пожалуй мои подколки в начале топа были неуместны:)
     
  16. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    я бы даже сказал что ты спятил
    Проблема в том что этот способ вобще верен только в том случае кгда таблица релоков существовала и была повеждена пакером например.
    Тут же вопрос состоит в том как сделать универсальный загрузчик - тобишь ПЕ должен быть запущен из образа находящегося по UniImageBase
    UniImageBase = VirtualAlloc(0,...);
     
  17. UTeX

    UTeX New Member

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

    direct offset OR immediate data
     
  18. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    вобщем-то если присмотреться то видно что все константы не попадают в интервал ИмеджБейс .. ИмеджБейс + Сайз

    так что в принципе можно проверять тип данных только на попадание в этот интревал
     
  19. PaCHER

    PaCHER New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2006
    Сообщения:
    852
    asd
    ЛОЛ. Отжигаеш товарищ нащет "х.з. куда указывать" это базонезависимый код, разве невидно что по любому адресу загрузки он будет указывать куда надо?
     
  20. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    мда, туплю. Но всё равно дизасм это не вариант для сколь-либо сложных прог.