EB и прыгаем на нужный адресс

Тема в разделе "WASM.BEGINNERS", создана пользователем featurelles, 24 окт 2009.

  1. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    Простите за нубский вопрос.
    Мне нужно поместить на определённый адресс команду JMP ( EB ) И переход на конкретный адресс.
    Мне интересно, как именно этот адресс должен быть занесёт в память? и как должен выглядеть опкод команды прыжка на адресс 0x12345678 .
    EB 78 56 34 12 ?
     
  2. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Может и есть какой-нибудь алгоритм высчитывания, но я в таких случаях просто открывал программу в отладчике, находил нужный адрес и писал туда нужную инструкцию. После этого смотрел значение изменившихся байтов. Всё.
     
  3. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    Жду ещё предложений.
     
  4. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    featurelles
    Никак. EB - это короткий относительный прыжок. Т.е. после него идёт один байт, означающий знаковое (т.е. как в положительную, так и в отрицательную сторону) смещение от адреса начала следующей инструкции.
    Если хотите использовать длинные прыжки, то используйте опкод E9, после которого идёт двойное слово, также означающее знаковое смещение от адреса начала следующей инструкции.
    Прыжки по абсолютному адресу (опкод EA) не имеет смысла использовать, т.к. они занимают на байт больше аналогичного push+ret за счёт указания селектора сегмента.
     
  5. TermoSINteZ

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

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.564
    Адрес:
    Russia
    Могу дать формулу вычисления адреса (когда-то давно писал в своей статье (http://www.wasm.ru/article.php?article=srp_sintez))

     
  6. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    TermoSINteZ
    Спасибо за ссылку на статью. Щас почитаю.
    А так, мне это нужно для модуля ядра linux , пробую вставить прыжок с функции ядра на свою функцию обработчик.
    Сначала получаю в модуле адрес функции ядра ..предположим он равен 0xC0102030
    потом получаю адрес своей функции по адресу 0xF203040
    Через hexedit открываю /dev/kmem посмотреть на функцию по адресу 0xC0102030 .. там стандартный пролог. Вот и подумал, если вместо этого пролога вставить код джампа на мою функцию (у них с оригинальной аргументы одинаковые) то по идее моя функция должна отработать, без накладок? (вроде стек не изменяется)
    Так ли это? (я пока статью не прочитал)
     
  7. TermoSINteZ

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

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.564
    Адрес:
    Russia
    featurelles
    Если ваша функция должна вернуть управление, то она должна его вернуть с тем же состоянием стека, который был до входа.
     
  8. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    TermoSINteZ
    Она так и сделает.

    Сейчас просмотрел статью, и у меня вопрос по этому моменту
    "Первый байт 0E9h это опкод самой инструкции, а четыре оставшихся - это адрес в ту область памяти, куда мы хотим передать управление. При чем этот адрес необходимо вычислить так, как это делает процессор."
    Тоесть после E9 Должен идти физический адресс функции?
     
  9. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    featurelles
    Эм... меня игнорируете что ли? :)
     
  10. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    l_inc
    Я совсем запутался)...

    как мне вставить в начало функции по адрему? 0xC0102030 ..... переход на функцию по адресу 0xF12345678
    ?...
     
  11. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Странноватые у Вас адреса какие-то... 36-битные...
    В общем с поправкой в сторону 32-битности:
    Самый простой вариант (push+ret):
    68 78 56 34 11 C3
    Самый бессмысленный вариант (jmp far):
    EA 78 56 34 11 1B 00 (здесь нужно учитывать, что 00 1B - это стандартный селектор сегмента кода под Windows. Что там в Linux, надо смотреть)
    Самый правильный вариант (jmp near):
    E9 43 36 24 52 (где 0x52243643 = 0x12345678 - (0xC0102030+5), где 0xC0102030+5 - адрес следующей за прыжком инструкции).
     
  12. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Ой... что-то я в первых двух вариантах цифру не ту втыкнул... должно быть 68 78 56 34 12 C3 и EA 78 56 34 12 1B 00 соответственно.
     
  13. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    l_inc
    Большое спасибо! в течении часа попробую.
    (хоть мне пока и не стало ясно, почему процессор...для вычисления адреса jmp , делает подобные подсчёты..)
     
  14. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    featurelles
    Как минимум это даёт возможность делать код базонезависимым (т.е. не привязанным к каким-либо конкретным адресам загрузки кода).
     
  15. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    l_inc
    Щас буду пробовать...если не выйдет..то будут ещё вопросы по этой теме )
     
  16. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    my_func =fbd75130 (адрес функции куда нужно передать управление)
    modify_func =c035bcd0 (адрес функции, в которую нужно внедрить JMP на my_func)

    find_address = my_func - (modify_func+5);
    modify_func+5 =c035bcd5
    fbd75130 - c035bcd5 = 3ba1945b
    find_address =3ba1945b

    Пока всё верно?
     
  17. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    Чтото не выходит...
    my_func =fba757d0
    modify_func =c035bcd0
    modify_func+5 =c035bcd5
    find_address =3b719afb

    В dev/kmem по адресу c035bcd0 модифицирую байты так.
    E9 FB 9A 71 3B
    И ничего не выходит (
     
  18. TermoSINteZ

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

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.564
    Адрес:
    Russia
    и так
    x=0-(y-z)
    Z = fba757d0
    Y = адрес куда пишешь jmp + 5 то есть = c035bcd5
    Считаем:
    x=0-(y-z) = 0 - (c035bcd5 - fba757d0) = 3B719AFB
    В памяти: E9 FB9A713B
    Проверяйте :)
     
  19. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    TermoSINteZ
    Спасибо за проверку =)
    Опкод у меня верен. Но почему-то код не выполняется. Завтра буду искать проблему. А щас спать =)
     
  20. TermoSINteZ

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

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.564
    Адрес:
    Russia
    featurelles
    поставь int 3 и трейси :)
    дойди до jmp своего , посмотри куда идет прыжок.