hook方法整理

本文介绍了hook技术在内存监控和稳定性检测中的应用,重点讲解了glibc malloc hook的原理及非线程安全的缺点。然后,文章详细探讨了PLT Hook,包括其工作原理、环境配置、流程分析,并通过xhook项目举例说明如何找到并修改重定位地址以实现函数hook。最后提到了LD_PRELOAD和inline hook作为补充。
摘要由CSDN通过智能技术生成

hook基础库函数可以实现多种功能,比如:
1.malloc/free,内存监控;
2.pthread_create,线程泄漏;
3.open/close,fd泄漏;
有助于程序的稳定性检测。

本文记录hook方法和原理,持续补充
glic malloc hook,plt hook(xhook)

1 glic malloc hook


原理:glic提供__malloc_hook, __realloc_hook, __free_hook可以实现hook自定义mallco/free函数

  1. __malloc_initialize_hook是弱变量malloc初始化的时候会调用1次,赋值指向hook指针初始化函数my_init_hook
  2. __malloc_hook指向自定义的malloc函数my_malloc_hook,在调用malloc的时候,实际会调用到my_malloc_hook
  3. my_malloc_hook中,还原__malloc_hook,再调用mallco,真正分配内存,最后__malloc_hook指向my_malloc_hook,下次调用malloc时,再次进入my_malloc_hook
__malloc_hook = old_malloc_hook;
result = malloc(size);
old_malloc_hook = __malloc_hook;
__malloc_hook = my_malloc_hook;

free和realloc同理。

man __malloc_initialize_hook,直接查看源码和例子
定义:

 #include <malloc.h>
 void *(*__malloc_hook)(size_t size, const void *caller);
 void *(*__realloc_hook)(void *ptr, size_t size, const void *caller);
 void *(*__memalign_hook)(size_t alignment, size_t size,
                          const void *caller);
 void (*__free_hook)(void *ptr, const void *caller);
 void (*__malloc_initialize_hook)(void);
 void (*__after_morecore_hook)(void);

例子:

#include <stdio.h>
#include <malloc.h>

/* Prototypes for our hooks.  */
static void my_init_hook(void);
static void *my_malloc_hook(size_t, const void *);

/* Variables to save original hooks. */
static void *(*old_malloc_hook)(size_t, const void *);

/* Override initializing hook from the C library. */
void (*__malloc_initialize_hook) (void) = my_init_hook;

static void
my_init_hook(void)
{
   
    printf("in my_init_hook __malloc_hook:%p \n", __malloc_hook);
    old_malloc_hook = __malloc_hook;
    __malloc_hook = my_malloc_hook;
}

static void *
my_malloc_hook(size_t size, const void *caller)
{
   
    void *result;

    /* Restore all old hooks */
    __malloc_hook = old_malloc_hook;

    /* Call recursively */
    result = malloc(size);

    /* Save underlying hooks */
    old_malloc_hook = __malloc_hook;

    /* printf() might call malloc(), so protect it too. */
    printf("malloc(%u) called from %p returns %p\n",
            (unsigned int) size, caller, result);

    /* Restore our own hooks */
    __malloc_hook = my_malloc_hook;
    return result;
}
int main(){
   
    int *a = (int *)malloc(10);
    int *c = (int *)malloc(20);
    int *b = new int;
    return 0;
}

结果:

malloc(10) called from 0x5647f6d77b07 returns 0x5647f7e07280
malloc(20
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值