使用MapViewOfFile发送结构并读取未知值

问题描述 投票:-1回答:1

我基本上试图将我的结构转换或复制到我的其他进程部分视图但我一直收到错误

C2760:语法错误:意外令牌'标识符',预期'声明'

这就是我在做的事情:

type RPM(UINT_PTR ReadAddress)
{
    if (hDriver == INVALID_HANDLE_VALUE) {
        return {};
    }

    DWORD64 Bytes;
    KM_READ_REQUEST ReadRequest{};

    type response{};

    ReadRequest.ProcessId = PID;
    ReadRequest.Address = ReadAddress;
    ReadRequest.Size = sizeof(type);
    ReadRequest.Output = &response;

问题出在这里:

auto pBuf = (ReadRequest)MapViewOfFile(hMapFile, FILE_MAP_WRITE, 0, 0, 4096);
if (!pBuf)
{
    printf("OpenFileMappingA(write) fail! Error: %u\n", GetLastError());
    system("pause");
}

printf("MapViewOfFile(write) created ! \n");

我在尝试从内核驱动程序中读取未知值时遇到了另一个问题。它基本上读取内存,然后根据我读取的内容,如果它的int,float等将该值更改为另一个值。

PKM_READ_REQUEST ReadInput = (PKM_READ_REQUEST)SharedSection; // cast readRequest to our struct which is in SharedSection.
void* ReadOutput = ReadInput->Output;

Status = ReadKernelMemory(Process, ReadInput->Address, ReadOutput, ReadInput->Size);

我正在尝试将其复制到我的共享部分,以便我可以从用户模式中读取它,但是idk如何投射它或者值是什么。

memcpy(SharedSection, &ReadOutput, sizeof(ReadOutput));

这就是我想要尝试读取它的方法,但是以同样的方式将其转换为因为我不想将其作为void读取,我想将其作为从我的内核模式给出的值读取。

auto pBuf = MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, 4096);
if (!pBuf)
{
    printf("OpenFileMappingA(write) fail! Error: %u\n", GetLastError());
    system("pause");
}

printf("MapViewOfFile(write) created ! \n");

顺便说一下,我在我的内核驱动程序中使用了未记录的函数mmcopyvirtualmemory

c++ c winapi kernel
1个回答
0
投票

1.

auto pBuf = (ReadRequest)MapViewOfFile(hMapFile, FILE_MAP_WRITE, 0, 0, 4096);

ReadRequest不是一个类型而是一个对象,如果你想将文件映射地址写为struct KM_READ_REQUEST,你应该将返回指针转换为PKM_READ_REQUEST的类型,并且还要控制文件映射的大小:

auto pBuf = (PKM_READ_REQUEST)MapViewOfFile(hMapFile, FILE_MAP_WRITE, 0, 0, sizeof(KM_READ_REQUEST));

这样你就可以设置PIDAddressSizeOutput

2.

memcpy(SharedSection, &ReadOutput, sizeof(ReadOutput));
  • ReadOutput已经是输出值的地址,所以你不需要操作&
  • Sizeof(指针)总是等于4(32位)和8(64位);
  • 您最好使用新变量来存储复制的值,而不是覆盖以前的数据。

所以

type new_var;
memcpy(&new_var, ReadOutput, sizeof(KM_READ_REQUEST));

编辑:回答你的意见,

您可以设置单个事件以在驱动程序和UM之间进行通信。

应用程序:

hDevice = CreateFile(Device);
hEvent = CreateEvent(...);
DeviceIoControl(hDevice, IOCTL_SET_EVENT, &hEvent,...);
WaitForSingleObject(hEvent, INFINITE);

司机:

case IOCTL_SET_EVENT:
{
    HANDLE hUserEvent = *(HANDLE *)pIrp->AssociatedIrp.SystemBuffer;
    status = ObReferenceObjectByHandle(hUserEvent, EVENT_MODIFY_STATE,*ExEventObjectType, KernelMode, (PVOID*)&pDevExt->pEvent, NULL);
    ObDereferenceObject(pDevExt->pEvent);
    break;
}

然后设置事件:

KeSetEvent(pdx->pEvent,...);
© www.soinside.com 2019 - 2024. All rights reserved.