Сообщение от
DooD
есть ли тогда смысл останавливать,а потом возобновлять потоки?Хотя я с этим не встречался.
Нет. Здесь нужен дизассемблер длин. Если использовать способ с перезаписыванием первых 5 байт, то алгоритм примерно такой:
0. С помощью дизассемблера длин выделяем столько целых первых команд перехватываемой функции, длина которых >= 5. Запоминаем эту длину в переменную
len.
1. Запоминаем адрес следующей команды в переменную
next_opcode.
2. Выделяем
len + 5 байт памяти, адрес этой памяти записываем в переменную
old_func.
3. В выделенный участок памяти копируем первые
len байт из перехватываемой функции и дописываем команду
jmp next_opcode (для нее мы выделели 5 дополнительных байт).
4. Перезаписываем первые 5 байт перехватываемой функции командой
jmp .
5. Когда нужно вызвать старую функцию, делаем
call old_func.