从DLL调用函数

时间:2014-01-23 18:19:24

标签: c++ dll-injection

是否可以使用DLL Injection调用程序内的已知函数(我们知道函数类型,名称和参数)?

例如,我的程序中有以下功能:

void func(string text)
{
    cout << text << endl;
}

如何从DLL调用它?

1 个答案:

答案 0 :(得分:0)

可以调用一个任意函数,只给出原型及其在内存中的地址,但是你必须能够在另一个进程地址空间调用它(这可以通过链接到共享库或附加调试器来完成)< / p>

typedef int func(void);
func* f = (func*)0xabcd123;
int i = f(); // execute

但是我也试过将代码复制到内存的可执行部分并运行它,如下所示:

  char code[] = {0x55,0x48,0x89,0xe5,0x89,0x7d,0xfc,0x48,0x89,0x75,
                 0xf0,0xb8,0x2a,0x00,0x00,0x00,0xc9,
                 0xc3,0x00};    // it is just compiled: return  42 
                                // (with prologue, etc)
  void *buf;

  /* copy code to executable buffer */    
  buf = mmap (0,sizeof(code),PROT_READ|PROT_WRITE|PROT_EXEC,
              MAP_PRIVATE|MAP_ANON,-1,0);
  memcpy (buf, code, sizeof(code));

  /* run code */
  int i = ((int (*) (void))buf)();
  printf("the code returned: %d\n", i);

所以,如果您知道要执行的代码的大小,那么它就是可能的。