Возможно ли изменить функцию в памяти? - PullRequest
0 голосов
/ 18 мая 2019

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

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

void Test()
{
   int a = 10;
   int b = 15;

   cout << a << endl;
}

Я хочу изменить это, например:

void Test()
{
   int a = 20;
   int b = 15;

   cout << a + b << endl;
}

Без необходимости воссоздавать всю функцию, потому что в моем реальном случае ... функция действительносложный и требует десятков других функций, которые мне тоже придется сканировать, и, самое главное, он постоянно обновляется.

Ответы [ 2 ]

1 голос
/ 18 мая 2019

Рассмотрим хотпатч.Моя библиотека, если использовать Windows (https://www.codeproject.com/Articles/1043089/HotPatching-Deep-Inside) может помочь.

Есть много методов, которые не могут быть обсуждены здесь подробно, но обычно вы заменяете начальные байты, которые являются фиктивными байтами (xor rdi, rdi) с вашим кодом перехода, сказав компоновщику зарезервировать эти байты для функции.

0 голосов
/ 18 мая 2019

Да, действительно возможно модифицировать функции в памяти, это называется «самоизменяющийся код». Тем не менее, он чрезвычайно сложен и не очень хорошо подходит для чистой базы кода.

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

void Test(int (*stringFunction)(int a, int b))
{
   int a = 10;
   int b = 15;

   cout << stringFunction(a,b) << endl;
}

Вы можете затем вызвать свою функцию так, чтобы получить другое поведение:

int defaultFunction(int a, int b) {
   return a;
}
int specialFunction(int a, int b) {
   return a+b;
}
Test(defaultFunction);
Test(specialFunction);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...