0

我试图破解 malloc 函数以首先调用我的 malloc 函数。一旦我的 malloc 函数在其中执行,我想调用标准 malloc。但是,我得到了一个递归,因为它只是加载我定义的 malloc。如何修复以下代码?

#include <dlfcn.h>
#include "stdio.h"
//#include "stdlib.h"


void *handle;

void *handle_malloc;

int (*loadprg)(void);

void * (*malloc_sysm)(size_t);


void init()
{
    handle = dlopen ("/export/home/joshis1/Foxtel/temp/libloadmap.so", RTLD_LAZY);
    if( handle == NULL)
     {
       puts(dlerror());
     }


   handle_malloc = dlopen ("/lib/libc.so.6", RTLD_LAZY);
    if( handle_malloc == NULL)
     {
       puts("handle malloc error\r\n");
       puts(dlerror());
     }


}


#include "stdio.h"


void *malloc(int size)
{
   printf("called..my malloc\r\n");

   malloc_sysm = dlsym(handle_malloc,"malloc");

   if ( dlerror() != NULL)
    {
       puts("malloc symbol not found..");
       exit(1);
    }


    printf("This should call actual malloc now..\r\n");
    return  malloc_sysm(size);




}


int main()
{
  int *t;
  init();
  printf("call load program now\r\n");

  loadprg = dlsym(handle, "loadprg");

  if( dlerror()!= NULL)
   {
      puts("Symbol load errror");
   }

  (*loadprg)();  

  printf("Close the handle now..\r\n");

  dlclose(handle);


  t = (int *) malloc (100);

  dlclose(handle_malloc);



  return 0;

}

输出是对我定义的 malloc() 的递归。如何解决这个问题?

4

3 回答 3

3

要覆盖共享函数,您需要编译自己的共享库并通过 LD_PRELOAD 环境变量预加载它。

#define _GNU_SOURCE

#include <stdlib.h>
#include <stdio.h>
#include <dlfcn.h>

void *malloc(size_t size) {
    printf("called..my malloc\r\n");

    void *(*original_malloc)(size_t size);
    // Find original malloc function
    original_malloc = dlsym(RTLD_NEXT, "malloc");

    if ( dlerror() != NULL)
    {
        puts("malloc symbol not found..");
        exit(1);
    }

    printf("This should call actual malloc now..\r\n");
    return (*original_malloc)(size);
}

$ gcc -Wall -fPIC -shared -o mymalloc.so mymalloc.c -ldl
$ LD_PRELOAD=./mymalloc.so ./prog

现在您的程序将使用预加载库中的 malloc。

于 2013-09-16T12:28:16.803 回答
1

我一直使用的标准方法是创建一个名为MALLOCMYMALLOC或其他)的宏,它可以满足您的需求。当然,所有出现的mallocI 都必须用宏替换,当这不是你想要的时候,我可以理解。

您还可以通过仅在编译您想要包含您的功能的源代码时定义一个名为malloc(即拼写为原始的)的宏来实现您想要的。然后这个宏将​​调用一个名为的函数,比如说,它应该在文件中声明它在没有定义宏的情况下编译,然后又可以调用原始函数。如果这个 makefile 摆弄对你来说太多了,你也可以通过调用来调用原始函数(这样可以避免再次运行到宏中):mallocmallocwrappingMallocmallocmalloc(malloc)

    #include <stdlib.h>
    #include <stdio.h>

    #define malloc(size) myMalloc(size)

    void *myMalloc(size_t size) {
      void *result;
      printf("mallocing %ld bytes", size);
      result = (malloc)(size);
      printf(" at %p\n", result);
      return result;
    }

    int main(int argc, char *argv[]) {
      char *buffer;
      buffer = malloc(10);
      return 0;
    }

在 C++ 中,您可能会通过重载类的运算符来相处new

于 2013-09-16T12:29:40.427 回答
0

我在您的代码中看不到问题。但是为什么不malloc_sysm = dlsym(handle_malloc,"malloc");进入你的init()功能呢?

于 2013-09-16T12:18:43.780 回答