【发布时间】:2016-02-11 18:17:49
【问题描述】:
我有这个内核驱动程序用来从进程内存中读取一个字符串:
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...
问题就在这里,为什么它只读取(或可能写入)前四个字节?
【问题讨论】:
-
char* source = *(ULONG*)pBuf;wtf? -
pBuf是Irp->AssociatedIrp.SystemBuffer,应该是我正在读取的内存地址。
-
那不是我的意思!
-
请说明您的观点,因为我不明白从 unsigned long 获取 char 指针是否错误...?
-
这假定
ULONG等价于一个指针,而不是一个安全的赌注。SystemBuffer已经是一个指针,所以不需要这样做。