Показать сообщение отдельно

  #7  
Старый 27.12.2011, 19:02
Chrome~
Постоянный
Регистрация: 13.12.2008
Сообщений: 354
С нами: 9162683

Репутация: 175
По умолчанию

Цитата:
Сообщение от 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.
 
Ответить с цитированием