libc中的hook机制

原创 2015年11月20日 20:29:58

libc中的hook机制,主要用于内存分配,它就像无处不在的钩子一样,一旦设置好了 hook,我们就可以在内存分配的地方随心所欲地做我们想做的事情。
在malloc.h中,声明了一些hook,原型如下:

/* Hooks for debugging and user-defined versions. */
extern void (*__free_hook) (void *__ptr, const void *);
extern void *(*__malloc_hook)(size_t __size, const void *);
extern void *(*__realloc_hook)(void *__ptr, size_t __size, const void *);
extern void *(*__memalign_hook)(size_t __alignment, size_t __size, const void *);
extern void (*__after_morecore_hook) (void);

从上面的注释中可以看出,我们可以自定义这些hook,用于debug。这些hook都是函数指针,以__malloc_hook为例,当指定__malloc_hook为自定义的钩子后,调用malloc时,就会进入我们指定的自定义钩子,下面以一个例子说明。

// test.cpp
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

static void* (*old_malloc_hook)(size_t, const void*); // 函数指针,用于保存原始的malloc钩子

static void* my_malloc(size_t size, const void *caller) // 自定义malloc钩子
{
    static int malloc_time = 0; // 记录malloc钩子调用了几次
    __malloc_hook = old_malloc_hook; // 还原malloc钩子,否则下面真正的malloc调用会造成递归死循环
    void *ptr = malloc(size); // 真正的内存分配
    __malloc_hook = my_malloc; // 重置malloc钩子为自定义值
    printf("%s, addr: %p, size: %lu, time:%d\n", __func__, ptr, size, ++malloc_time);
    return ptr;
}

void __attribute__((constructor)) malloc_init() // __attribute__((constructor)) 是gcc的一个特性
// 意思是在进入main主方法之前会首先调用这个函数,我们用它来初始化malloc钩子
{
    old_malloc_hook = __malloc_hook; // 保存原始的malloc钩子
    __malloc_hook = my_malloc; // 设置malloc钩子为自定义值
}

int main()
{
    char *c = (char*)malloc(sizeof(char)); // malloc
    free(c);

    int *i = new int; // new
    delete i;

    FILE *f = fopen("./file", "r"); //fopen
    if (NULL != f) {
        fclose(f);
    }

    return 0;
} 

运行结果如下:

$g++ -o test test.cpp
$./test
my_malloc, addr: 0x209c010, size: 1, time:1
my_malloc, addr: 0x209c010, size: 4, time:2
my_malloc, addr: 0x209c030, size: 568, time:3

从上面的结果可以看出,不仅malloc调用会进入我们自定义的malloc钩子,而且new、fopen(还有许多其它的函数)也会进入malloc钩子。需要注意的一点是,这些内存分配的钩子需要不断的还原和重置,也真是因为如此,hook机制不适用于多线程。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

一种hook libc库函数的简易方案

有时候我们分析/逆向ELF文件时,可能想直接运行ELF看看效果,同时又想捕获ELF文件用了哪些字符串、回连地址&端口、操作了哪些文件等等特征信息。这时我们可以巧妙的借用LD_PRELOAD,来实现一种...

内存分配钩子__malloc_hook, __reallac_hook, __free_hook的使用

mem.h #ifndef __MEM_H__ #define __MEM_H__ #include #include static void *(*old_malloc_hook)(siz...
  • hoi0714
  • hoi0714
  • 2012年08月26日 17:11
  • 1348

通过HOOK系统的API接口实现对API功能的修改

一、实现功能头文件:AnalysisIniFile.h #ifndef __ANALYSISINIFILE_H__ #define __ANALYSISINIFILE_H__ #include ...

在应用程序中替换Linux中Glibc的malloc的四种方法

打算优化系统的内存分配,接管glibc提供的内存管理,但是整个工程的代码量很大,使用malloc、realloc、calloc和free的地方到处都是,如果自己写好的接口需要重命名所有的调用,先不说工...

拦截malloc、free等库函数(malloc钩子)

__malloc_hook是一组glibc提供的malloc调试变量中的一个,这组变量包括: void *(*__malloc_hook)(size_t size, const void *calle...
  • LBO4031
  • LBO4031
  • 2016年05月29日 22:59
  • 2324

拦截malloc、free等库函数(malloc挂钩)

参考:http://www.gnu.org/software/libtool/manual/libc/Hooks-for-Malloc.html 3.2.2.10 Memory Allocation ...

Linux下Hook一个共享库函数

有时程序员需要完成这类任务: 假如你有一个二进制版的系统,例如现在流行的android,你需要为这个系统开发一个软件。这个软件牵涉到系统行为,因此需要对系统做修改。然而你并没有这个系统的所有源码...

linux 下的hook

◆ 如何修改动态库符号表 作者:wangdb (mailto:wangdb@nsfocus.com) 主页:http://www.nsfocus.com/ 日期:2000-10-14 一、E...

Libc堆管理机制及漏洞利用技术 (一)

0×01 Libc堆浅析 1.1 堆管理结构 struct malloc_state {  mutex_t mutex;                 /* Serialize access...
  • sdulibh
  • sdulibh
  • 2015年12月31日 18:02
  • 573

利用ret2libc绕过DEP安全机制

文中的例子是引用了别人的,计作转载吧,具体哪里引用的忘记了数据执行保护:           DEP就是将非代码段的地址空间设置成不可执行属性,一旦系统从这些地址空间进行取指令时,CPU就是报内存违例...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:libc中的hook机制
举报原因:
原因补充:

(最多只允许输入30个字)