#c #kernel32 #detours
#c #kernel32 #обходные пути
Вопрос:
У меня есть крючок на 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);
}
Ответ №1:
LPCVOID — это указатель (на константу), lpBuffer — это указатель на этот указатель. Я полагаю
const char* pString = reinterpret_cast<const char *>(*lpBuffer);
это то, что вы хотите.
Ответ №2:
В вашем примере szTest
будет содержаться мусор, потому что
swprintf_s(szTest, 45, L"%d|n", pString);
говорит интерпретировать pString
как целое число (благодаря %d
) и преобразовать это целое число в ascii и сохранить его в szTest
Итак, да, вы печатаете адрес, но, возможно, только его часть.
Добавление:
Ответ капитана Жирафа указывает на другую ошибку: вы смотрите на неправильное место для строки.
Комментарии:
1. Изменение %d на %s приводит к сбою программы
2. @user1698144 Пара причин для этого. Одна из ошибок, на которую указывает капитан Giraffe в своем ответе, а другая —
_s
функции, по умолчанию прерывающие программу, если ввод плохой, вместо того, чтобы пытаться хромать после неопределенного поведения. У вас две ошибки, а не одна.3. Ну, единственная цель программы — найти это значение. После реализации исправления Griaffe msgbox выводит, но это все тарабарщина. Похоже, что один и тот же китайский символ повторяется снова и снова
4. Время запустить отладчик и посмотреть, что происходит на самом деле. Что находится в этом буфере? Поскольку это указатель на указатель, вы уверены, что там что-то должно быть? Обычно, когда вы видите указатель на указатель в качестве параметра, ожидается, что функция предоставит указатель для кого-то другого.
5. Предполагается, что буфер должен содержать команду для последовательного порта (0x0A, 0xA0, 0x50, 0x05). Просмотр указателя в отладчике VS показывает, что он указывает на адрес mem 0x0c5cdb20. Похоже, проблема связана с моим приведением и выводом в msgbox?