【问题标题】:Hack the standard function in library and call the native library function afterwards破解库中的标准函数,然后调用本机库函数
【发布时间】:2013-09-16 11:53:49
【问题描述】:

我试图破解 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()。如何解决这个问题?

【问题讨论】:

标签: c linux shared-libraries


【解决方案1】:

要覆盖共享函数,您需要编译自己的共享库并通过 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。

【讨论】:

    【解决方案2】:

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

    您还可以通过定义一个名为 malloc 的宏(即拼写为原始的 malloc)来实现您想要的,仅在编译您想要包含您的功能的源代码时。这个 malloc 宏然后将调用例如,函数称为wrappingMalloc,它应该在一个文件中声明,该文件在编译时没有定义宏malloc,然后又可以调用原始函数malloc。如果这个 makefile 摆弄对你来说太多了,你也可以通过调用 (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 运算符来相处。

    【讨论】:

    • 我也很喜欢你的回答。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-21
      • 1970-01-01
      • 2019-04-23
      • 2011-08-19
      • 1970-01-01
      • 2014-03-09
      • 1970-01-01
      • 2018-08-08
      相关资源
      最近更新 更多