ну в то, что в этих 5 байтах цикл будет, я верю еще меньше А если просто прыжок назад, в другую функцию - дык этот тут при чем? Это никакой роли не играет. берешь прыжок, считаешь адрес, куда он указывает (предполагаю, что ты сможешь это сделать). Потом, вместо копирования этого прыжка создаешь свой (он уже будет лежать в твоем буфере, но ссылаться будет туда же). Нужно найти всего-то разницу смещений и не более того. Разве это так сложно?
Разве для проверки нужно что-то обязательно инициализировать? Почему же? Элементарная проверка на сплайс.
а что и с чем ты собрался сравнивать в начале апи? регистры? переменные? ВНУТРИ АПИ??? даже cmp [xxx],yyy - это уже 6 байт! поэтому без инициализации конечно же никак тут вообще ниче не понял - что за проверка? проверка кем?
Да что угодно, хоть test eax, eax. Стандартные API разумеется жирные, и там это наверно вообще не встречается. Но в сторонних может быть что угодно.
если бы, да кабы... мы сейчас говорим про сплайсинг, для всех stdcall мой вариант подойдет. А ты начинаешь усложнять и искать варианты апи, которые встречаются только в зимбабве у пьяных пришельцев. Ессно есть сложности. Но так АБСОЛЮТНО ЛЮБОЙ метод можно назвать глючным и нерабочим. Мы ж не ВМ пишем и не ОС (кстати, как там дела у максимки? кто-нибудь знает? где релизы обещаные? )), а просто сплайсим, так что крайне маловероятные события можно откинуть имхо
1) ну покажи мне тогда пример апи, где мой вариант не сработает 2) восстанавливать каждый раз байты - это более надежно??? особенно в многопоточных приложениях 3) че-то я устал от дискуссии как-то
Сейчас, только все версии винды перелопачу. Да это вроде уже и не так актуально. Ну зачем же сразу восстанавливать, как уже писал, можно всю секцию скопировать и даже релоки настроить. Не надо никаких дизасмов. Согласен, пора уже закруглять этот офтоп.
Может просто Int 3 вписать по адресу ? На скорости заметно не скажется(я трассировал сервисный вход в ядре ничего не тормозило). И никаких проблем с потоками(для атомарности). При сплайсинге если джамп не помещается в одну инструкцию придётся останавливать потоки, перечислять их все, получать контекст и проверять регистр Eip каждого потока на вхождение в диапазон(чтоб на середине инструкции не оказался), если это так, то ресумить тред, делать задержку, снова суспендить и проверять. Повезёт если перед процедурой свободные 5 байт есть, тогда короткий джамп вписать можно. Либо если стандартный пролог: Код (Text): mov edi,edi push ebp mov ebp,esp То если Eip будет кудато на середину инструкции указывать, то можно это вручную в контексте подправить. А если более сложный случай - прощай стабильность.