破解库中的标准函数,然后调用本机库函数

时间:2013-09-16 11:53:49

标签: c linux shared-libraries

我正在尝试破解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()的递归。如何解决这个问题?

3 个答案:

答案 0 :(得分: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。

答案 1 :(得分:1)

我一直在使用的标准方法是创建一个名为MALLOC(或MYMALLOC或其他)的宏,它可以满足您的需求。所有出现的malloc当然,我必须用宏来代替,而且我可以理解这不是你想要的。

您还可以通过定义一个名为malloc的宏(即拼写为原始malloc)来实现您想要的功能。仅在编译您想要使用您的功能的源时。{{1}然后,宏将调用一个名为malloc的函数,该函数应该在一个文件中声明,该文件在没有定义宏wrappingMalloc的情况下编译,然后可以调用原始函数malloc 。如果这个makefile摆弄对你来说太过分了,你也可以通过调用malloc调用原始函数(这样可以避免再次进入宏):

(malloc)

在C ++中,您可能会为您的类重载 #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; } 运算符。

答案 2 :(得分:0)

我在代码中看不到问题。但为什么不将malloc_sysm = dlsym(handle_malloc,"malloc");移到init()函数中?