无法将结构指针转换为 PUCHAR
Cannot cast struct pointer to PUCHAR
我正在测试代码(基于此 reference),我收到一条错误消息:
'type cast': cannot convert from 'SYSTEM_SERVICE_TABLE' to 'PUCHAR'
如何解决?
版次:
目标是尝试在 Windows 10 32 位上找到 Shadow SSDT table 地址。
#include <ntddk.h>
#define NTOSAPI __declspec(dllimport)
typedef struct tag_SYSTEM_SERVICE_TABLE {
PULONG ServiceTable;
PULONG CounterTable;
ULONG ServiceLimit;
PCHAR ArgumentTable;
} SYSTEM_SERVICE_TABLE, *PSYSTEM_SERVICE_TABLE, **PPSYSTEM_SERVICE_TABLE;
NTOSAPI SYSTEM_SERVICE_TABLE KeServiceDescriptorTable;
NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING RegistryPath) {
NTSTATUS NtStatus = STATUS_SUCCESS;
pDriverObject->DriverUnload = DriverUnload;
DbgPrint("DriverEntry()!\n");
PUCHAR p = NULL;
PSYSTEM_SERVICE_TABLE KeServiceDescriptorTableWIN32K = NULL;
for (p = (PUCHAR)KeServiceDescriptorTable - PAGE_SIZE; p < (PUCHAR)KeServiceDescriptorTable + PAGE_SIZE; p++)
{
if (p != (PUCHAR)KeServiceDescriptorTable)
{
if (memcmp(p, &KeServiceDescriptorTable, sizeof(SYSTEM_SERVICE_TABLE)) == 0)
{
KeServiceDescriptorTableWIN32K = (PSYSTEM_SERVICE_TABLE)(p + sizeof(SYSTEM_SERVICE_TABLE));
break;
}
}
}
return NtStatus;
}
你的标题说“无法将 struct pointer 转换为 PUCHAR”,但代码并没有尝试转换 pointer,它是试图转换 结构本身 ,这就是编译器抱怨的原因。您需要获取结构的 地址 并将其强制转换,即:
(PUCHAR)&KeServiceDescriptorTable
我正在测试代码(基于此 reference),我收到一条错误消息:
'type cast': cannot convert from 'SYSTEM_SERVICE_TABLE' to 'PUCHAR'
如何解决?
版次:
目标是尝试在 Windows 10 32 位上找到 Shadow SSDT table 地址。
#include <ntddk.h>
#define NTOSAPI __declspec(dllimport)
typedef struct tag_SYSTEM_SERVICE_TABLE {
PULONG ServiceTable;
PULONG CounterTable;
ULONG ServiceLimit;
PCHAR ArgumentTable;
} SYSTEM_SERVICE_TABLE, *PSYSTEM_SERVICE_TABLE, **PPSYSTEM_SERVICE_TABLE;
NTOSAPI SYSTEM_SERVICE_TABLE KeServiceDescriptorTable;
NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING RegistryPath) {
NTSTATUS NtStatus = STATUS_SUCCESS;
pDriverObject->DriverUnload = DriverUnload;
DbgPrint("DriverEntry()!\n");
PUCHAR p = NULL;
PSYSTEM_SERVICE_TABLE KeServiceDescriptorTableWIN32K = NULL;
for (p = (PUCHAR)KeServiceDescriptorTable - PAGE_SIZE; p < (PUCHAR)KeServiceDescriptorTable + PAGE_SIZE; p++)
{
if (p != (PUCHAR)KeServiceDescriptorTable)
{
if (memcmp(p, &KeServiceDescriptorTable, sizeof(SYSTEM_SERVICE_TABLE)) == 0)
{
KeServiceDescriptorTableWIN32K = (PSYSTEM_SERVICE_TABLE)(p + sizeof(SYSTEM_SERVICE_TABLE));
break;
}
}
}
return NtStatus;
}
你的标题说“无法将 struct pointer 转换为 PUCHAR”,但代码并没有尝试转换 pointer,它是试图转换 结构本身 ,这就是编译器抱怨的原因。您需要获取结构的 地址 并将其强制转换,即:
(PUCHAR)&KeServiceDescriptorTable