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机制不适用于多线程。

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

相关文章推荐

逆向角度分析 CydiaSubstrate Hook 原理

简介 CydiaSubstrate,iOS7越狱之前名为 MobileSubstrate(下文简称为MS或MS框架),作者为大名鼎鼎的Jay Freeman(saurik). MS框架为越狱iDe...

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

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

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

Android中的so注入(inject)和挂钩(hook)

对于Android for arm上的so注入(inject)和挂钩(hook),网上已有牛人给出了代码-libinject(http://bbs.pediy.com/showthread.php?t...
  • eqera
  • eqera
  • 2014-07-21 18:35
  • 23521

在Linux上使用AFL对Stagefright进行模糊测试

前言 模糊测试是一种自动向程序传递输入数据并监控其输出的自动化测试技术。通过这种技术,安全人员可以测试程序的可靠性以及识别潜在的安全漏洞。 我们(360成都安全响应中心)将对Stagefr...

Linux 共享库LD_PRELOAD环境变量

共享库转载器有许多可供配置的环境变量,比如我们前面介绍的LD_LIBRARY_PATH环境变量。本文只重点介绍LD_PRELOAD环境变量,因为这个环境变量体现了共享库一个非常重要的特性:共享库覆盖。...
  • wayz11
  • wayz11
  • 2013-03-19 13:59
  • 2501

【Linux】LD_PRELOAD用法

LD_PRELOAD,是个环境变量,用于动态库的加载,动态库加载的优先级最高,一般情况下,其加载顺序为LD_PRELOAD>LD_LIBRARY_PATH>/etc/ld.so.cache>/lib>...

使用google-perftools剖析程序性能瓶颈

1.perftools        google-perftool,它是由google开发的用来分析C/C++程序性能的一套工具,这里的性能分析主要包括内存和CPU两个方面,内存分析使用google...

afl-fuzz技术白皮书

通过在编译期间instrument一些指令来捕获branch (edge) coverage和运行时分支执行计数。

小心环境变量-浅谈LD_PRELOAD

/* author:少仲 blog:   http://blog.csdn.net/py_panyu weibo: http://weibo.com/u/3849478598 欢迎转载,转载请注明出处...

linux下采用LD_PRELOAD机制动态修改方法和注入代码

LD_PRELOAD是linux下的一个环境变量,动态链接器在载入一个程序所需的所有动态库之前,首先会载入LD_PRELOAD环境变量所指定的动态库。运用这个机制,我们可以修改/替换已有动态库中的方法...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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