В настоящее время я работаю над проектом, и он предполагает замену функции другой. Допустим, у меня есть эта простая функция, которую я хочу подключить:
int bad_func(int a, int b) {
return a * b;
}
Я хочу заменить его следующим методом:
int good_func(int a, int b) {
return a + b;
}
На данный момент вот как я поступаю:
- Присоединить к процессу с помощью
ptrace
- Получить адрес
bad_func
в сегменте кода
- Внедрить
mmap2
системный вызов для выделения нового rwx
сегмента памяти
- Скопируйте код сборки
good_func
во вновь выделенный сегмент
- Заменить первые байты
bad_func
на JMP good_func
инструкцию
Все это прекрасно работает, я могу подтвердить, что дочерний процесс переходит в только что выделенную память и выполняет good_func
. Проблема в том, что он никогда не возвращается к остальному коду, который еще не был выполнен.
Поскольку оба метода содержат следующие инструкции,
push %ebp
mov %esp, %ebp
...
pop %ebp
ret
Полагаю, мне не нужно сохранять / изменять регистры ebp
и esp
, чтобы это работало, но, думаю, я не прав ...
Кто-нибудь знает, как мне достичь своей цели?
Большое спасибо заранее за ваше время.