是否可以在内存中修改功能

Is it possibly to modify a function in memory?

本文关键字:修改 功能 内存 是否      更新时间:2023-10-16

基本上,我有一个要修补的二进制文件,我不仅想在此功能上调用一个挂钩,而且我想跳入它并添加我的自己的代码行,也修改了其他一些值。

例如:说这个非常简单的功能是在二进制中,但是我无法访问它,如果它是某些类的成员函数,我只能查找某些签名或偏移。

void Test()
{
   int a = 10;
   int b = 15;
   cout << a << endl;
}

我想将其更改为例如:

void Test()
{
   int a = 20;
   int b = 15;
   cout << a + b << endl;
}

不必重新创建整个功能,因为在我的真实情况下。该功能确实很复杂,并且需要数十个其他功能,我也必须sig扫描,最重要的是,它不断更新。

考虑热点。我的库,如果使用Windows(https://www.codeproject.com/articles/1043089/hotpatching-deep-inside(可能会有所帮助。

在此处,您可以用您的跳跃代码替换有许多方法,但是通常您会用跳转代码替换启动字节(Xor rdi,rdi(,因为告诉链接器将这些字节保留为函数。<<<<<<<<<<<<<<<</p>

是的,确实可以修改内存中的功能,这称为'自我修饰代码'。也就是说,它非常复杂,并且对干净的代码库不利。

您想用一个功能指针来解决这个问题,这使您可以将各种功能传递到现有函数中:

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);