这个内核特征搜索该怎么用

我想这个用特征搜索函数搜到这个call所在的地址,该怎么用这个函数?已知可以使用下面函数获取PsLookupProcessByProcessId代码所在的地址

img

//特征码搜索代码
//pSearchBeginAddr 扫描的内存(内核)起始地址
//ulSearchLength 需要扫描的长度
//pSpecialCode 扫描特征码,传入一个UCHAR类型的字节数组
//ulSpecialCodeLength 特征码长度,传入字节数组长度
// By: LyShark.com
PVOID SearchSpecialCode(PVOID pSearchBeginAddr, ULONG ulSearchLength, PUCHAR pSpecialCode, ULONG ulSpecialCodeLength)
{
  PVOID pDestAddr = NULL;
  PUCHAR pBeginAddr = (PUCHAR)pSearchBeginAddr;
  PUCHAR pEndAddr = pBeginAddr + ulSearchLength;
  PUCHAR i = NULL;
  ULONG j = 0;

  for (i = pBeginAddr; i <= pEndAddr; i++)
  {
    // 遍历特征码
    for (j = 0; j < ulSpecialCodeLength; j++)
    {
      // 判断地址是否有效
      if (FALSE == MmIsAddressValid((PVOID)(i + j)))
      {
        break;
      }
      // 匹配特征码
      if (*(PUCHAR)(i + j) != pSpecialCode[j])
      {
        break;
      }
    }

    // 匹配成功
    if (j >= ulSpecialCodeLength)
    {
      pDestAddr = (PVOID)i;
      break;
    }
  }
  return pDestAddr;
}
获取PsLookupProcessByProcessId代码所在的地址
    UNICODE_STRING st = { 0 };
    RtlInitUnicodeString(&st, L"PsLookupProcessByProcessId");

    PVOID PsLookupProcessByProcessIdaddr = MmGetSystemRoutineAddress(&st);

''该回答引用ChatGPT''
如对你的问题有帮助,请点击右侧采纳即可,谢谢!
首先,你需要获取PsLookupProcessByProcessId的地址,这可以通过使用MmGetSystemRoutineAddress函数来实现,如下代码所示:

UNICODE_STRING st = { 0 };
RtlInitUnicodeString(&st, L"PsLookupProcessByProcessId");
PVOID PsLookupProcessByProcessIdaddr = MmGetSystemRoutineAddress(&st);

然后,可以使用SearchSpecialCode函数来搜索PsLookupProcessByProcessId的地址,传递需要扫描的起始地址和长度、特征码、特征码长度。例如:

PUCHAR pSpecialCode = [Your feature code];
ULONG ulSpecialCodeLength = [length of feature code];
PVOID pFoundAddress = SearchSpecialCode(PsLookupProcessByProcessIdaddr, [Search Length], pSpecialCode, ulSpecialCodeLength);

如果搜索成功,pFoundAddress将是PsLookupProcessByProcessId的地址。

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^