欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

各操作系统 获取EPROCESS中ActiveProcessLinks的偏移

各操作系统 获取EPROCESS中ActiveProcessLinks的偏移

看了一些代码  发现在找这个偏移的时候  大都是先判断当前操作系统类型 然后硬编码。
然后就想了这么个方法 通用性可能会好些 
仅测试xp sp3 其他没有测试  应该没什么问题吧。
//获取EPROCESS结构中 ImageFileName 的偏移
int GetNameOffset(PEPROCESS pEproc)
{
  for(int i=0; i<0x250; i++)
  {
    if (_stricmp("system", ((char *)pEproc + i)) == 0)
    {
      return i;
    }
  }
  return 0;
}
//检查是否是一个完整的双向链表,并根据之前获得的进程名 判断是否存在Explorer.exe进程
BOOLEAN CheckIsListEntry(PLIST_ENTRY pl, int iOffset, int iNameOffset)
{
  BOOLEAN bRet = FALSE;
  PLIST_ENTRY pStart = pl->Blink;
  for ( ;pStart != NULL && pStart != pl; pStart = pStart->Blink)
  {
    //DbgPrint("ProcName:%s", (char *)pStart - iOffset + iNameOffset);
    if (_stricmp("explorer.exe", (char *)pStart - iOffset + iNameOffset) == 0)
    {
      bRet = TRUE;
    }
  }
  if (pStart == pl && bRet)
  {
    return 1;
  }
  return 0;
}
//各操作系统通用代码 获取EPROCESS中ActiveProcessLinks的偏移
int GetLinkOffset(PEPROCESS pEproc)
{
  int iNameOffset = GetNameOffset(pEproc);
  for (int iOffset = 0; iOffset<0x200; iOffset++)
  {
    PLIST_ENTRY pList = (PLIST_ENTRY)((unsigned int)pEproc + iOffset);
    if (!MmIsAddressValid(pList->Blink))
    {
      continue;
    }
    if (!MmIsAddressValid(pList->Blink->Flink))
    {
      continue;
    }
    if (!MmIsAddressValid(pList->Flink))
    {
      continue;
    }
    if (!MmIsAddressValid(pList->Flink->Blink))
    {
      continue;
    }
    if (pList->Blink->Flink == pList && pList->Flink->Blink == pList && CheckIsListEntry(pList, iOffset, iNameOffset))
    {
      return iOffset;
      break;
    }
  }
  return 0;
}

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功