我在开发 Windows 内核驱动程序时尝试使用未记录的 API。请不要告诉我这不是最好的做法;)
无论如何,未记录的 API 是 PsGetProcessPeb,我在 ntoskrnl.exe 中使用 IDA 找到了
我定义了以下结构:
另外,我发现我必须定义如下函数:
NTKERNELAPI PPEB NTAPI PsGetProcessPeb(IN PEPROCESS Process);
我尝试编译的代码(部分)是:
PsLookupProcessByProcessId(ProcessId, &pProcess);
PPEB pPeb = PsGetProcessPeb(pProcess);
当我尝试编译时,出现以下错误代码:
未解析的外部是PsGetProcessPeb
我猜测链接器没有找到该函数并且不知道如何链接。
用于编译的操作系统是 Windows 10 build 19044 (x64),我使用 Visual Studio 2019。
如果您有任何想法,请告诉我。
问候
使用无文档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 导出的例程,不能用于任何驱动程序定义的例程。
即使我在 KeInitializeEvent API 中遇到同样的问题,请让我知道它是如何解决的。