Батут функции ptrace x86 - PullRequest
       15

Батут функции ptrace x86

0 голосов
/ 26 июня 2018

В настоящее время я работаю над проектом, и он предполагает замену функции другой. Допустим, у меня есть эта простая функция, которую я хочу подключить:

int bad_func(int a, int b) {
    return a * b;
}

Я хочу заменить его следующим методом:

int good_func(int a, int b) {
    return a + b;
}

На данный момент вот как я поступаю:

  1. Присоединить к процессу с помощью ptrace
  2. Получить адрес bad_func в сегменте кода
  3. Внедрить mmap2 системный вызов для выделения нового rwx сегмента памяти
  4. Скопируйте код сборки good_func во вновь выделенный сегмент
  5. Заменить первые байты bad_func на JMP good_func инструкцию

Все это прекрасно работает, я могу подтвердить, что дочерний процесс переходит в только что выделенную память и выполняет good_func. Проблема в том, что он никогда не возвращается к остальному коду, который еще не был выполнен.

Поскольку оба метода содержат следующие инструкции,

push %ebp
mov  %esp, %ebp
...
pop  %ebp
ret

Полагаю, мне не нужно сохранять / изменять регистры ebp и esp, чтобы это работало, но, думаю, я не прав ...

Кто-нибудь знает, как мне достичь своей цели?

Большое спасибо заранее за ваше время.

...