Перейти к содержанию

Хук на WINAPI функцию


Рекомендуемые сообщения

Спойлер
void ReadFromFile(LPVOID Buff)
{
	HANDLE FileHandle;
	DWORD R;
	DWORD Size;
	char Line[256]{};

	FileHandle = CreateFileA("C:\\123.txt", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
	Size = GetFileSize(FileHandle, &Size);
	if (Size > 255) Size = 255;
	ReadFile(FileHandle, Buff, Size, &R, NULL);
	*(Line + R) = 0;
	CloseHandle(FileHandle);
}

void main()
{
	getchar();

	LPVOID Line[256]{};
	ReadFromFile(Line);
	std::cout << (LPCSTR)Line << std::endl;
}

Для теста был написан код выше. Выводит в консоль текст - "TEST" из текстового документа 123.txt.
Пытаюсь поставить хук на ReadFile, чтобы подменять считанный результат, допустим вместо "TEST" чтобы выводило "TEST1234".

Спойлер
BOOL(WINAPI * TrueReadFile)(
	HANDLE       hFile,
	LPVOID       lpBuffer,
	DWORD        nNumberOfBytesToRead,
	LPDWORD      lpNumberOfBytesRead,
	LPOVERLAPPED lpOverlapped) 			= ReadFile;

__declspec(dllexport) BOOL WINAPI MyReadFile(
	HANDLE       hFile,
	LPVOID       lpBuffer,
	DWORD        nNumberOfBytesToRead,
	LPDWORD      lpNumberOfBytesRead,
	LPOVERLAPPED lpOverlapped)
{
	lpBuffer = (LPVOID)"TEST1234";
  
	return TrueReadFile(hFile, lpBuffer, nNumberOfBytesToRead, lpNumberOfBytesRead, lpOverlapped);
}

 

Но в итоге просто пустое поле появляется и все, может ли кто-нибудь помочь?

Изменено пользователем DragonForce
Ссылка на комментарий
Поделиться на другие сайты

Попробуй подменять буфер уже после того, как отработает оригинальная функция, а не наоборот. Ну и плюс ты в коде хука подменяешь адрес буфера, а в мейне читаешь из старого адреса, в котором, разумеется, пустота.

Ссылка на комментарий
Поделиться на другие сайты

19 минут назад, Xipho сказал:

Попробуй подменять буфер уже после того, как отработает оригинальная функция, а не наоборот. Ну и плюс ты в коде хука подменяешь адрес буфера, а в мейне читаешь из старого адреса, в котором, разумеется, пустота.

Сделал как Вы подсказали, сперва вызвал TrueReadFile, а только потом указал lpBuffer = (LPVOID)"1234", но щас не работает, выводит все равно - "TEST".
Из-за того что я в коде хука lpBuffer присваиваю другое значение(1234), я изменяю адрес самого lpBuffer?

Изменено пользователем DragonForce
Ссылка на комментарий
Поделиться на другие сайты

13 часов назад, DragonForce сказал:

Из-за того что я в коде хука lpBuffer присваиваю другое значение(1234), я изменяю адрес самого lpBuffer?

Тебе следует разобраться с указателями в С++, и как хранятся константные строки в памяти, при использовании их с С++. Но вкратце - да, конструкцией

lpBuffer = (LPVOID)"TEST1234"

ты создаешь в памяти новый кусок, куда кладешь строку TEST1234, и затем адрес начала этого куска ты записываешь в lpBuffer. Только это локальный для функции lpBuffer, а не внешний. А далее в коде используешь оригинальный адрес

Ссылка на комментарий
Поделиться на другие сайты

15 минут назад, Xipho сказал:

Тебе следует разобраться с указателями в С++, и как хранятся константные строки в памяти, при использовании их с С++. Но вкратце - да, конструкцией

lpBuffer = (LPVOID)"TEST1234"

ты создаешь в памяти новый кусок, куда кладешь строку TEST1234, и затем адрес начала этого куска ты записываешь в lpBuffer. Только это локальный для функции lpBuffer, а не внешний. А далее в коде используешь оригинальный адрес

Видимо для меня это пока не совсем понятно... Я думал достаточно в хук функции присвоить другое значение lpBuffer, а далее все что читает в оригинале этот буфер(после вызова ReadFile), будет получать уже новое значение lpBuffer`a(то, которое я присвоил в хуке)... Если у меня в собственной программе(в которой 30 строк кода-_-), которую я сделал для примера, не получается изменить lpBuffer, то о чем тогда еще речь...?

Изменено пользователем DragonForce
Ссылка на комментарий
Поделиться на другие сайты

@DragonForce, я на таком же уровне сейчас.

Я не увидел в твоем коде самого хука. Что именно ты хукаешь? Вызов ReadFile из main, или ReadFile в Kernel32.dll? Или подменяешь адрес ReadFile в разделе импорта?

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.