c++ - 是否可以修改内存中的函数?

标签 c++ c assembly

基本上,我有一个要修补的二进制文件,我不仅仅是想调用此函数上的 Hook ,而是想直接跳到其中并添加我自己的代码行,修改其他一些代码值也是如此。

例如:假设这个非常简单的函数位于二进制文件中,但我无法访问它,我只能查找一些签名,或者如果它是某个类的成员函数等的偏移量。

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

   cout << a << endl;
}

我想把它改成这样:

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

   cout << a + b << endl;
}

无需重新创建整个函数,因为在我的实际情况中..该函数非常复杂,需要数十个其他函数,我也必须对其进行签名扫描,最重要的是,它会不断更新。

最佳答案

考虑热补丁。我的库,如果使用 Windows ( https://www.codeproject.com/Articles/1043089/HotPatching-Deep-Inside ) 可以提供帮助。

有很多方法无法在这里深入讨论,但通常在告诉链接器为函数保留这些字节之后,您可以用跳转代码替换作为虚拟字节(xor rdi,rdi)的起始字节。

关于c++ - 是否可以修改内存中的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56201115/

相关文章:

c++ - 使用友元函数迭代另一个类的私有(private)成员

c - 在 ADT 中,结构声明必须位于单独的 .c 文件中吗?这有多重要?

使用可变参数计数调用 C 函数

程序集文件扩展名、.s79、.s82、s90、.asm、.s 等...它们有什么区别?

assembly - 汇编指令如何区分寄存器、内存地址、立即值或偏移参数?

pointers - 数据总是存储在 elf64 NASM 中的同一地址中?

c++ - if 语句和 --variable

c++ - 随机选择两个值

c++ - 如何声明一个以函数为参数的函数?

c - 为什么 size_t 类型的变量在 printf 调用中转换为 (unsigned)?