#c #pointers #winapi #buffer #easyhook
#c #указатели #winapi #буфер #easyhook
Вопрос:
Я разрабатываю программу перехвата win32 API. Насколько я понимаю, когда программа вызывает ReadFile для определенного файла, содержимое этого файла копируется в lpBuffer(см. Определение ниже),
Определение файла чтения:
BOOL ReadFile(
HANDLE hFile,
LPVOID lpBuffer,
DWORD nNumberOfBytesToRead,
LPDWORD lpNumberOfBytesRead,
LPOVERLAPPED lpOverlapped
);
Теперь моя цель — изменить этот lpBuffer и заполнить его предоставленным мной контентом!
Я использую EasyHook для подключения ReadFile. Я не знаком с типом LPVOID. Я смог изменить содержимое для GetCurrentDirectory, используя следующий код.
string b = "C:\my\altered\directory";
DWORD returnLength = b.length();
int i;
for (i = 0; i<b.length(); i )
{
lpBuffer[i] = b[i];
}
lpBuffer[i ] = '';
Определение GetCurrentDirectory:
DWORD GetCurrentDirectory(
DWORD nBufferLength,
LPTSTR lpBuffer
);
Как выполнить аналогичное присвоение значения для ReadFile (LPVOID lpBuffer)?
Комментарии:
1. Обрабатывайте его как указатель на первый элемент массива байтов, длиной не менее
nNumberOfBytesToRead
байта. Точно так же, как вы делаете дляGetCurrentDirectory
переопределения. Однако вам нужно привести указатель.2.
LPVOID
является указателем наvoid
.void
ничего. Вы не можете создатьvoid
, но вы можете привести ЧТО-ЛИБО к указателю наvoid
, поэтому вам не нужно ничего делать, кроме как получить указатель наstring
символьный буфер ‘s:ReadFile(handle, b.data(), ...)
. К сожалению, логически это не имеет никакого смысла.
Ответ №1:
Вот LPVOID
typedef:
#define far
typedef void far *LPVOID;
far
Макрос определяется как ничто, я думаю, это из-за некоторых исторических причин (багаж).
Таким образом, вы можете почти напрямую обрабатывать LPVOID
as void*
.
А теперь предположим, что у вас есть std::vector<uint8_t>
имя FakeData
, просто:
if (nNumberOfBytesToRead < FakeData.size()) {
SetLastError(ERROR_INSUFFICIENT_BUFFER);
return FALSE;
}
memcpy(lpBuffer, FakeData.data(), FakeData.size());
*lpNumberOfBytesRead = FakeData.size();
SetLastError(ERROR_SUCCESS);
return TRUE;
Комментарии:
1. Я думаю, что здесь вы движетесь в правильном направлении, но если я не уверен на 100%, вы, вероятно, недостаточно объясняете спрашивающему.
2. @user4581301 Да, я отредактировал ответ для дальнейшего объяснения.
3.
string content = "altered content"; memcpy(lpBuffer, content, content.length());
Могу ли я сделать что-то подобное? Я думаю, нужно указать содержимое в const void4. @MdSajid Вы можете сделать это для текстовых файлов, не рекомендуется для двоичных файлов. И это должно быть
memcpy(lpBuffer, content.c_str(), content.length());
5. Я выполняю это действие только для файлов такого типа, как «txt»