欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Linux下系统调用的hook机制

程序员文章站 2024-01-21 21:31:52
...

Linux下系统调用的hook机制

[http://blog.csdn.net/sdulibh/article/details/42078681]
http://0pointer.de/blog/projects/mutrace.html
http://0pointer.de/blog/projects/mutrace.html – 对mutex进行trace的hook
https://github.com/dbpercona/mutrace/blob/master/README

  • linux下系统调用hook机制的原理
    • LD_PRELOAD机制:允许用户手动指定使用的动态链接库,将系统库函数hook->lib.so.6
    • dlyopen;dlsym: 通过句柄和连接符名称获取真实库函数名或者变量名
  • 实例
    • main.c
    • 编译:gcc -o main main.c
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
  if( strcmp(argv[1], "123") )
  {
    printf("Incorrect\n");
  }
  else
  {
    printf("Correct\n");
  }
  return 0;
}
  • hook.c
  • 编译:gcc -fPIC -shared -o hook.so hook.c -ldl
#include<stdio.h>
#include<string.h>
#include<dlfcn.h>
typedef int (*STRCMP) (const char*, const char*);
int strcmp(const char* s1, const char* s2) {
        static void *handle = NULL;
        static STRCMP old_strcmp = NULL;
        if(!handle) {
                handle = dlopen("libc.so.6", RTLD_LAZY);
                old_strcmp = (STRCMP)dlsym(handle, "strcmp");
        }
        if(old_strcmp) printf("addr=%p\n", old_strcmp);
        printf("you are hacked. s1=<%s>,s2=<%s>\n", s1, s2);
        return old_strcmp(s1, s2);
}
  • 运行: LD_PRELOAD= ./hook.so ./main 123

未完待续…