Можно ли передать выполнение на _любой_ адрес памяти? Как это реализовать в машинном коде? Общая задача: есть код, нужно его загрузить в память и передать на него выполнение. столкнулся с проблемой, что jmp работать не хочет, даже если поправить ему адрес. парился 4 часа, так и не понял, почему не работает. код ассемблирую сам, перепробовал все - ничего работать не хочет ( Остановился на том, что ближе всего к истине FF 25 <4 байта адреса>
видимо ты неправильно рассчитываеш смещение у jmp'a вбей в ольке jmp xxxx и увидиш что это возможно еще есть push xxxx / retn
мне нужно сделать переход на заданный абсолютный адрес. кто может - плз помогите, мозг уже не работает...
Какой режим, реальный или защищённый? Если защищённый, с сегментацией или без оной? Ну или вообще 64-разрядный?
Странно немного звучит. 'FF 25' -- это код 'jmp reg/mem'. Если тебе нужен такой переход, то заведи переменную, положи туда адрес и сделай переход по нему. mov dword [addr], 0xADDR jmp dword [addr] Или какое-то еще условие есть? P.S. Кстати, да. Про режим забыл спросить. Эти строки для 32битного режима.
Вроде разобрался, только возник вопрос... Использую E9 <целевой адрес - адрес JMP - 5> Всегда ли оно будет работать. Режим защищенный 32-х битный
'jmp' не может прыгать между сегментами. Для этого есть 'jmp far'. Это в случае, если сегменты не пересекаются. Если пересекаются -- можно прыгать как угодно. Со страницами тоже все хорошо . В случае, если есть NX бит, то страница должна быть исполняемая, чтобы код на ней выполнялся.