kernel32 — C ++ Чтение значений указателя LPCVOID

У меня есть ловушка на команду Writefile файла kernel32.dll. Хук срабатывает, однако я не могу прочитать содержимое буфера.

Цель: Msgbox показывает содержимое буфера, отправляемого на com-порт.

Выпуск: Msgbox выводит на первый взгляд случайную последовательность чисел, которая, как я предполагаю, является адресом памяти, а не фактическим содержимым lpBuffer.

Код C ++:

void hookedFunc(HANDLE hfile, LPCVOID * lpBuffer, DWORD nNumberBytesToWrite, LPWORD lpNumberofBytesWritten, LPOVERLAPPED lpOverlapped) {

char *pString = reinterpret_cast<char *>(lpBuffer);

//Msgbox - arg 1//////////////////////////////////////////////////////////////////////////////
WCHAR szTest[45];
swprintf_s(szTest, 45, L"%d|\n", pString);
MessageBox(NULL, szTest, L"BUFFER CONTENTS", MB_OK);
swprintf_s(szTest, 45, L"%d", nNumberBytesToWrite);
MessageBox(NULL, szTest, L"TEST", MB_OK);

}

0

Решение

LPCVOID — это указатель (на константу), lpBuffer — это указатель на этот указатель. я представляю себе

const char* pString = reinterpret_cast<const char *>(*lpBuffer);

это то, что вы хотите.

1

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

В вашем образце szTest будет содержать мусор, потому что

swprintf_s(szTest, 45, L"%d|\n", pString);

говорит интерпретировать pString как целое число (спасибо %d) и преобразовать это целое число в ascii и сохранить его в szTest

Так что да, вы печатаете адрес, но, возможно, только его часть.

Ответ капитана жирафа указывает на еще одну ошибку: вы смотрите не на то место, где находится строка.

1

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