关闭

【C】libc中的hook机制

标签: libcmallochook
1613人阅读 评论(0) 收藏 举报
分类:

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

1
0
查看评论

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

有时候我们分析/逆向ELF文件时,可能想直接运行ELF看看效果,同时又想捕获ELF文件用了哪些字符串、回连地址&端口、操作了哪些文件等等特征信息。这时我们可以巧妙的借用LD_PRELOAD,来实现一种简易的hook libc库函数方案来打印我们想要的特征信息。
  • wonderdaydream
  • wonderdaydream
  • 2017-07-04 18:21
  • 314

Linux系统调用Hook姿势总结

http://www.cnblogs.com/LittleHann/p/3854977.html 主题 Linux 相关学习资料 http://xiaonieblog.com/?post=121 http://hbprotoss.github.io/posts/li-yo...
  • tianyeming
  • tianyeming
  • 2016-03-24 19:31
  • 5116

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

一、实现功能头文件:AnalysisIniFile.h #ifndef __ANALYSISINIFILE_H__ #define __ANALYSISINIFILE_H__ #include #include #define BUFFER_SIZE 256 #define MAX_IP...
  • ouchengguo
  • ouchengguo
  • 2014-04-01 13:03
  • 1374

逆向角度分析 CydiaSubstrate Hook 原理

简介 CydiaSubstrate,iOS7越狱之前名为 MobileSubstrate(下文简称为MS或MS框架),作者为大名鼎鼎的Jay Freeman(saurik). MS框架为越狱iDevice提供了一个稳定的代码修改平台。开发者可以很方便的利用它进行各种插件开发工作。可以说目前很多插...
  • u013702935
  • u013702935
  • 2014-02-28 16:25
  • 2849

如何hook dlopen和dlsym底层函数

如何hook dlopen和dlsym底层函数android 逆向分析过程有时候需要hook dlopen和dlsym函数,打印调用的库或者函数名。 利用cydia substrate的动态库,或者ThomasKing大大的ELF-ARM-HOOK-Library 两个都行,但是cydia 支持x...
  • zhuanshenai
  • zhuanshenai
  • 2016-06-24 14:32
  • 3453

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

mem.h #ifndef __MEM_H__ #define __MEM_H__ #include #include static void *(*old_malloc_hook)(size_t, const void*); static void *(*old_realloc_hook...
  • hoi0714
  • hoi0714
  • 2012-08-26 17:11
  • 1492

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

__malloc_hook是一组glibc提供的malloc调试变量中的一个,这组变量包括: void *(*__malloc_hook)(size_t size, const void *caller); void *(*__realloc_hook)(void *ptr, size_t siz...
  • LBO4031
  • LBO4031
  • 2016-05-29 22:59
  • 2614

Android下的挂钩(hook)和代码注入(inject)

Android是基于linux内核的操作系统,根据语言环境可以简单的划分为java层、native C层、linux内核层。java层通过jni与native层交互,使用linux提供的底层函数功能。 因此,类似linux系统,我们可以在Android下实现对另一个进程的挂钩和代码注入。在这简...
  • wang_walfred
  • wang_walfred
  • 2015-09-06 15:52
  • 9033

使用gcc的-finstrument-functions选项进行函数跟踪

GCC Function instrumentation机制可以用来跟踪函数的调用关系,在gcc中对应的选项为“-finstrument-functions”。可查看gcc的man page来获取更详细信息。 编译时如果为gcc加上“-finstrument-functions”选项,那在每个函数...
  • zhongyunde
  • zhongyunde
  • 2015-08-23 19:34
  • 1593

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

打算优化系统的内存分配,接管glibc提供的内存管理,但是整个工程的代码量很大,使用malloc、realloc、calloc和free的地方到处都是,如果自己写好的接口需要重命名所有的调用,先不说工作量,部分没有权限查看代码的.a文件就搞不定了。所以需要替换掉系统的malloc,保证原有调用的名称...
  • littlefang
  • littlefang
  • 2010-12-03 12:35
  • 15342
    个人资料
    • 访问:383560次
    • 积分:6673
    • 等级:
    • 排名:第4242名
    • 原创:263篇
    • 转载:0篇
    • 译文:5篇
    • 评论:52条
    Make Others Better.
    博客专栏
    文章分类