Память чтения драйвера ядра не отправляет всю строку

У меня этот драйвер ядра используется для чтения строки из памяти процесса:

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 …

Вопрос заключается в том, почему он только читает (или, возможно, пишет) только первые четыре байта?

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

Другие решения

Добро пожаловать в «страну ядра». Этот ответ может быть немного поздно, но лучше, чем никогда, верно?

То, что вы делаете для отправки / чтения данных, небезопасно и уродливо.

Чтобы отправить всю строку в пользовательский режим, вот пример:

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%, он не завершен и нуждается в улучшении.

Наслаждаться.

0

По вопросам рекламы [email protected]