Пресчет переходов

Тема в разделе "WASM.ASSEMBLER", создана пользователем Android, 10 мар 2006.

  1. Android

    Android New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2003
    Сообщения:
    183
    Адрес:
    Ukraine
    Привет!

    Изучаю метод сплайсинга и столкнулся со следующими вопросами: допустим нужно установить перехват на процедуру, которая начинается следующим кодом
    Код (Text):
    1.  
    2. jmp m1      ;2 байта
    3. m3:
    4. xor eax,eax ;2 байта
    5.     jmp m2      ;2 байта
    6. m1:
    7.     add eax,5       ;3 байта
    8. m2:
    9.  


    В этом случае надо сохранить первые 3 команды (6 байт) и поверх них записать jmp XXXX. Вот тут-то и начинаются приколы. Что бы сохранить правильность кода нам надо пересчитать все относительные переходы. Начинаем пересчитывать - первый jmp не трогаем, он действуе в пределах переносимого кода, второй jmp из ближнего превращается в дальний, т.к. скорее всего код будет переноситься за пределы 127 байт, и уже занимает не 2 байта, а 5!!!!!!!! И вот теперь надо пересчитать первый jmp, т.к. длина второго изменилась. Такие случаи конечно маловероятны, но все же хочется получить универсальный метод перехвата.



    Самый простой способ решения этой проблемы, который пришел мне в голову, – это преобразовать все переходы в дальние, что бы за ранее знать их длину, пересчитать их и сохранить полученный код.

    Может кто-то этим занимался и у него уже есть готовый перечень команд, которые используют относительный переход. (jmp, je, ja, jb……). Если есть таковые - помогите, плз.
     
  2. _BC_

    _BC_ БЦ

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




    т.н. rel'ы...

    JMP (EB/E9)

    CALL (E8)

    Jcc (7x/0F 8x)

    LOOP (E2)

    LOOPNZ (E0)

    LOOPZ (E1)

    JECXZ (E3)



    все вроде. ;)
     
  3. Android

    Android New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2003
    Сообщения:
    183
    Адрес:
    Ukraine
    _BC_

    Спасибо

    Еще я в Юрове кажется видел схему команд 8086
     
  4. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    Немного уточню _BC_:

    (исходник - мануалы AMD/Intel)
    Код (Text):
    1.  
    2. E8 xx xx xx xx     CALL   Jz (near)
    3. E9 xx xx xx xx     JMP    Jz (near)
    4. EB xx              JMP    Jb (short)
    5. 7x xx              Jcc    Jb (short)
    6. 0F 80 xx xx xx xx  Jcc    Jz (near)
    7. E0 xx              LOOPNZ Jb (short)
    8. E1 xx              LOOPZ  Jb (short)
    9. E2 xx              LOOP   Jb (short)
    10. E3 xx              JECXZ  Jb (short)
    11.  
     
  5. kropalik

    kropalik New Member

    Публикаций:
    0
    Регистрация:
    27 апр 2005
    Сообщения:
    155
    Адрес:
    msk
    может проще выяснить куда ведет jmp/call

    в начале перехватываемой функции и вписывать

    свой jmp туда ? то есть в твоем случае записать

    jmp (на новый код) по адресу m1 а не в самом начале

    функции. я так делал в случае когда нужную

    функцию уже перехватили до нас (таким же методом).

    P.S. интересно бывают функции которые начинаются с Jcc ?
     
  6. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    Практика показывает что достаточно обрабатывать только jmp и call с rel32 смещениями, так как ни в одной dll других команд в начале экспортируемых функций нет.