内核驱动程序读取内存不发送整个字符串

时间:2016-02-11 18:17:49

标签: c++ c kernel kmdf

我有这个内核驱动程序用于从进程内存中读取字符串:

KeAttachProcess(GlobalProcessPE);
char* source = *(ULONG*)pBuf;

RtlZeroMemory(pBuf, pIoStackLocation->Parameters.DeviceIoControl.OutputBufferLength);
RtlCopyMemory(pBuf, source, 256);

KeDetachProcess();

这是C ++中的沟通过程:

DWORD ReadBuffer2[180] = { 0 };
DeviceIoControl(hDevice, IOCTL_READPROCMEM_S, &msg, sizeof(msg), ReadBuffer2, sizeof(ReadBuffer2), &dwBytesRead, NULL);
printf("Message: %s\n", ReadBuffer2);
printf("Bytes read: %d\n", dwBytesRead);

在运行并搜索字符串时,它实际上会从中捕获前四个字母,并显示以下内容:

Message: ABCD
Bytes read: 4

我已经使用替代方法检查了字符串,它应该显示ABCDEFGHIJKL ......

问题在于此,为什么它只是单独读取(或可能写入)前四个字节?

2 个答案:

答案 0 :(得分:0)

我设法通过读取每个地址+4的每4个字符来读取字符串。

这是通信代码:(我在驱动程序中添加了一些__try {} _except(){},因此它没有BSOD)

std::string str = "";
bool scanning = true;
for (int i = 0; i < 35; i++) {
    if (!scanning) break;

    msg = 0x095A2A28 + i * 0x4;
    DWORD ReadBuffer2[50] = {0};
    DeviceIoControl(hDevice, IOCTL_READPROCMEM_S, &msg, sizeof(msg), ReadBuffer2, sizeof(ReadBuffer2), &dwBytesRead, NULL);
    char dtostr[4];
    sprintf(dtostr, "%s", ReadBuffer2);
    for (int l = 0; l < 4; l++) {
        str += dtostr[l];
        if (dtostr[l] == '\0') {
            scanning = false;
            break;
        }
    }
}
std::cout << "~Message: " << str << std::endl;

答案 1 :(得分:0)

欢迎来到&#34; kernel land&#34;。这个答案可能有点迟,但总比不对?

您正在做的发送/读取数据并不安全和丑陋。

要将整个字符串发送到用户模式,下面是一个示例:

PCHAR data = "This String is from Device Driver !!!";
size_t datalen = strlen(data) + 1;//Length of data including null

RtlCopyBytes(Irp->AssociatedIrp.SystemBuffer, data, irpStack->Parameters.DeviceIoControl.OutputBufferLength);

这假设您没有使用UNICODE,并注意虽然此示例100%正常工作,但它并不完整,需要进行改进。

享受。