MENU

动态定位 EPROCESS 进程名成员偏移

October 5, 2019 • 驱动相关

场景

  • 驱动中获取当前上下文进程的进程名
  • 通过 PsGetCurrentProcess 函数来获取当前调用驱动的进程的 EPROCESS 结构的地址,
    EPROCESS 结构的 0x174 偏移(现在就是要实现动态定位这个硬编码)处存放着进程名。

思路

  1. 驱动程序的入口 DriverEntry 是运行在 System 进程中的;
  2. 通过 PsGetCurrentProcess 可以获取 System 进程的内核 EPROCESS 结构的地址;
  3. 从该地址开始搜索特征码 System 字符串;
  4. 找到了便是 EPROCESS 的进程名存放的偏移处,计算得到进程名在 EPROCESS 结构中的偏移 offset
  5. 应用层调用驱动的时候,就可以直接在该偏移处获取当前进程名。
DWORD GetProcessNameOffset()
{

    PEPROCESS curproc;
    DWORD procNameOffset;
    //获取EPROCESS结构的地址
    curproc = PsGetCurrentProcess();
    for(int i=0; i< 4096; i++)
    {
        if( !strncmp( "System", (PCHAR) curproc + i, strlen("System") ))
        {
            procNameOffset = i;
            return procNameOffset;
        }
    }
    return 0;
}

优化

可以使用 Sunday 搜索匹配算法,大大提高搜索效率。