【问题标题】:Relocate Thread Control Block重定位线程控制块
【发布时间】:2014-01-09 19:47:34
【问题描述】:

我目前处于需要重新定位 TCB(线程控制块)的情况。 据我了解,调用VDSO时流程执行中采用了以下方案(根据this article

  • 全部由call *%gs:0x10指令触发
  • %gs 是一个使用全局描述符表的段寄存器。 GDT是存储在与进程关联的内核堆栈中的关联表,保持段寄存器值与进程地址空间中的地址之间的对应关系。它是随机初始化的,由加载器(glibc 库的一部分)选择
  • 一旦建立对应关系,处理器就会读取 *(GDT[%gs]+0x10) 处的地址,并在 VDSO 中进行调用。
  • 执行系统调用并从内核返回到用户进程使用内核 AS 中的返回地址存储。

我的问题是我需要用其他东西覆盖我的一些进程内存,而且大多数时候,它会擦除​​地址 (GDT[%gs]+0x10) 处的部分。

我想做的是将 TCB 的内容(从 GDT[%gs] 到 GDT[%gs]+0x..)重新定位到我的进程 AS 中的空闲位置,但这意味着改变GDT 内容,我认为我无法从用户模式执行此操作。换句话说,我想在我的 GDT 中更改 %GS 的关联。

提前感谢您的任何回答, /iansus

【问题讨论】:

    标签: assembly process kernel internals


    【解决方案1】:

    好的,我找到了解决方案:

    int relocateTCB()
    {
    
    #ifndef TCB_LDT_INDEX
    #define TCB_LDT_INDEX 6
    #endif
    
    
        struct user_desc* u_info = (struct user_desc*) malloc(sizeof(struct user_desc));
        int r,j;
        int mstart, map;
        int PS = sysconf(_SC_PAGESIZE);
    
        if(u_info == NULL)
        {
            errno = EFAULT;
            return -1;
        }
    
        u_info->entry_number = TCB_LDT_INDEX;
        r = syscall(SYS_get_thread_area, u_info);
    
        if(r==-1) return -1;
    
        mstart = (u_info->base_addr) & ~(PS-1);
        map = (int) mmap(NULL, PS, PROT_EXEC|PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, (off_t)0);
    
        if(!map)
        {
            errno = EFAULT;
            return -1;
        }
    
        for(j=mstart; j<mstart+PS; j+=sizeof(int))
        {
            * ((int*) (map+j-mstart)) = * ((int*) j);
        }
    
        u_info->base_addr = map + u_info->base_addr - mstart;
        r = syscall(SYS_set_thread_area, u_info);
    
        if(r==-1)
        {
            errno = EINVAL;
            return -1;
        }
    
        for(j=mstart; j<mstart+PS; j+=sizeof(int))
            *((int*) j) = 0;
    
        // Keep *%gs = %gs
        *((int*) u_info->base_addr) = u_info->base_addr;
    
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-06
      • 1970-01-01
      • 2011-10-14
      • 2019-09-14
      • 1970-01-01
      • 1970-01-01
      • 2019-03-29
      相关资源
      最近更新 更多