У меня есть ловушка на команду 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);
}
LPCVOID — это указатель (на константу), lpBuffer — это указатель на этот указатель. я представляю себе
const char* pString = reinterpret_cast<const char *>(*lpBuffer);
это то, что вы хотите.
В вашем образце szTest
будет содержать мусор, потому что
swprintf_s(szTest, 45, L"%d|\n", pString);
говорит интерпретировать pString
как целое число (спасибо %d
) и преобразовать это целое число в ascii и сохранить его в szTest
Так что да, вы печатаете адрес, но, возможно, только его часть.
Ответ капитана жирафа указывает на еще одну ошибку: вы смотрите не на то место, где находится строка.