Windows 内核驱动程序和未记录的 API

问题描述 投票:0回答:2

我在开发 Windows 内核驱动程序时尝试使用未记录的 API。请不要告诉我这不是最好的做法;)

无论如何,未记录的 API 是 PsGetProcessPeb,我在 ntoskrnl.exe 中使用 IDA 找到了

我定义了以下结构:

  • _PEB
  • _PEB_LDR_数据
  • _LDR_DATA_TABLE_ENTRY

另外,我发现我必须定义如下函数:

NTKERNELAPI PPEB NTAPI PsGetProcessPeb(IN PEPROCESS Process);

我尝试编译的代码(部分)是:

PsLookupProcessByProcessId(ProcessId, &pProcess);
PPEB pPeb = PsGetProcessPeb(pProcess);

当我尝试编译时,出现以下错误代码:

  • LNK2019
  • LNK1120:未解决的外部问题

未解析的外部是PsGetProcessPeb

我猜测链接器没有找到该函数并且不知道如何链接。

用于编译的操作系统是 Windows 10 build 19044 (x64),我使用 Visual Studio 2019。

如果您有任何想法,请告诉我。

问候

windows kernel driver
2个回答
0
投票

使用无文档API的关键是找到API的地址。

在内核态,有MmGetSystemRoutineAddress()。

https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/nf-wdm-mmgetsystemroutineaddress

MmGetSystemRoutineAddress
例程返回指向由
SystemRoutineName
指定的函数的指针。

语法

C++

PVOID MmGetSystemRoutineAddress(
  [in] PUNICODE_STRING SystemRoutineName
);

参数

[in] SystemRoutineName

指定要解析的系统例程的名称。

返回值

如果可以解析函数名,则例程返回指向该函数的指针。否则,例程返回 NULL。

备注

驱动程序可以使用此例程来确定例程在特定版本的 Windows 上是否可用。它只能用于内核或 HAL 导出的例程,不能用于任何驱动程序定义的例程。


0
投票

即使我在 KeInitializeEvent API 中遇到同样的问题,请让我知道它是如何解决的。

© www.soinside.com 2019 - 2024. All rights reserved.