【问题标题】:C++: Store function in byte array, then execute function through function pointerC++:将函数存储在字节数组中,然后通过函数指针执行函数
【发布时间】:2021-02-16 05:11:32
【问题描述】:

~ 是否可以读取函数的字节,放入数组,创建指向数组起始地址的函数指针,然后执行函数指针

所以显然有很多事情需要做,我目前在函数中获取字节的最佳方法是创建一个指针,并遍历每个内存地址,直到我点击 RET (0xc3 ) 操作说明。我已经设法将一些代码放在《科学怪人》中,但无论发生什么我都会遇到访问冲突,这导致我的问题是,这是否可能,是否需要遵循一个程序才能让这种情况发生。

粗略的例子:

void function() {
    //do something
    return;
}

int main() {
    size_t size = sizeofFunc(function); //uses method listed earlier
    unsigned char* bytes = new unsigned char[size];
    // for each memory address from 'function' to 'function + size' put contents into 'bytes'
    void(*vFuncPtr)(void) = (void(*)(void))bytes;
    vFuncPtr(); // Access Violation, is this even possible???
}

【问题讨论】:

标签: c++ arrays function pointers memory


【解决方案1】:

方法如下:

void function() {
    printf("hello\n");
    return;
}

int main()
{
   char* bytes = new char[4];
   bytes = reinterpret_cast<char*>(function);

   void(*vFuncPtr)(void) = (void(*)(void))bytes;

   vFuncPtr();

   return 0;
}

【讨论】:

  • 这不会“将函数存储在一个字节数组中”。它只是通过指针调用一个函数。它还会泄漏内存作为奖励。
  • 函数 - 是一个地址,你可以以任何你喜欢的方式存储这个地址,然后使用函数指针调用它。 “将函数存储在字节数组中”听起来很奇怪。这就是我理解问题的方式
  • 再次阅读问题。他们在询问如何将二进制代码读入一块内存,然后执行该代码。这是可能的,但需要一些特定于操作系统的代码来将任意内存块标记为可执行。
  • @Blastfurnace 您介意详细说明将代码块标记为可执行的代码或过程。我在 Windows 上,但任何提示都会有所帮助
  • @NathanMorris 我没有找到很好的副本,但它是 something like this question。
猜你喜欢
  • 1970-01-01
  • 2016-02-12
  • 2021-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多