IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    linux下跨线程的越界访问hook方法

    admin发表于 2011-03-29 03:03:30
    love 0

    我们知道在linux下多线程之间,是共用同一片存储区域的,可以访问共享的全局变量等,但是能否访问线程内部的局部变量呢,会不会出现越界异常呢?今天笔者尝试了一下,发现可以在线程间越界访问!

    代码如下:

    /*
     * Author:yaronli <jidalyg_8711@163.com>
     * http://www.yaronspace.cn/blog
     *
     * File: hookpthread.c
     * Create Date: 2011-03-27 21:22:31
     *
     */
    #include 
    #include 
    void * fun(void * i)
    {
        int a=20;
        printf("fun: &a;:[%x]-----a:[%d]\n", &a,a);
        sleep(3);
        printf("fun: &a;:[%x]-----a:[%d]\n", &a,a);
        pthread_exit(NULL);
     
    }
     
    void * hook(void * a)
    {
        int b=10;
        sleep(1);
        printf("hook: &b;:[%x]\n", &b);
        printf("hook: &a;:[%d]\n", *(&b-10489856/4));
        *(&b-10489856/4)=30;
        pthread_exit(NULL);
    }
    int main()
    {
        pthread_t pidfun,pidhook;
        pthread_create(&pidfun, NULL, fun, NULL);
        pthread_create(&pidhook, NULL, hook, NULL);
        sleep(5);
        return 0;
    }
    /* vim: set ts=4 sw=4: */

    该程序首先是在启动两个线程,在fun线程中设置局部变量a=20并显示出来,在hook线程中尝试读取a的变量值并试图更改它,然后再次显示变量a的值
    在我的机器上的输出如下:

    fun: &a:[419c512c]-----a:[20]
    hook: &b:[423c612c]
    hook: &a:[20]
    fun: &a:[419c512c]-----a:[30]
    

    可以发现a的在值在线程hook中被修改成功了,并没有出现越界访问异常

    TIPS:
    1. 10489856/4 关于这个值的获取是通过&b和&a的地址相减得到的,至于为什么除4,是因为&b是int型的指针,而指针的加减法的单位是4个字节,所以需要除以4,这里我也是调试好半边才搞明白的.

    您可能对下面文章也感兴趣:

    • 使用Bash中Complete自动补全命令
    • Linux中关于Cache Memory的介绍
    • [shell学习笔记]sort、uniq、cut、paste和split用法详解
    • 关于pthread_cond_wait使用while循环判断的理解
    • linux通过Shell获得本机ip地址方法


沪ICP备19023445号-2号
友情链接