C Считывает значения указателя LPCVOID

#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?