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

时间:2019-03-10 18:30:46

标签: c++ c winapi kernel

我基本上是在尝试将结构转换或复制到其他进程截面视图,但是我一直遇到错误

  

C2760:语法错误:意外的令牌'identifier',预期的'declaration'

这就是我在做什么:

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);

我正在尝试将其复制到共享部分,以便可以从用户模式下读取它,但是请知道如何转换它或值是多少。

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

1 个答案:

答案 0 :(得分:0)

1。

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

ReadRequest不是类型而是对象,如果要将文件映射地址写为结构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(in 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,...);