DragonForce Опубликовано 14 января, 2022 Поделиться Опубликовано 14 января, 2022 (изменено) Спойлер 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); } Но в итоге просто пустое поле появляется и все, может ли кто-нибудь помочь? Изменено 14 января, 2022 пользователем DragonForce Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 14 января, 2022 Поделиться Опубликовано 14 января, 2022 Попробуй подменять буфер уже после того, как отработает оригинальная функция, а не наоборот. Ну и плюс ты в коде хука подменяешь адрес буфера, а в мейне читаешь из старого адреса, в котором, разумеется, пустота. Ссылка на комментарий Поделиться на другие сайты Поделиться
DragonForce Опубликовано 14 января, 2022 Автор Поделиться Опубликовано 14 января, 2022 (изменено) 19 минут назад, Xipho сказал: Попробуй подменять буфер уже после того, как отработает оригинальная функция, а не наоборот. Ну и плюс ты в коде хука подменяешь адрес буфера, а в мейне читаешь из старого адреса, в котором, разумеется, пустота. Сделал как Вы подсказали, сперва вызвал TrueReadFile, а только потом указал lpBuffer = (LPVOID)"1234", но щас не работает, выводит все равно - "TEST". Из-за того что я в коде хука lpBuffer присваиваю другое значение(1234), я изменяю адрес самого lpBuffer? Изменено 14 января, 2022 пользователем DragonForce Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 15 января, 2022 Поделиться Опубликовано 15 января, 2022 13 часов назад, DragonForce сказал: Из-за того что я в коде хука lpBuffer присваиваю другое значение(1234), я изменяю адрес самого lpBuffer? Тебе следует разобраться с указателями в С++, и как хранятся константные строки в памяти, при использовании их с С++. Но вкратце - да, конструкцией lpBuffer = (LPVOID)"TEST1234" ты создаешь в памяти новый кусок, куда кладешь строку TEST1234, и затем адрес начала этого куска ты записываешь в lpBuffer. Только это локальный для функции lpBuffer, а не внешний. А далее в коде используешь оригинальный адрес Ссылка на комментарий Поделиться на другие сайты Поделиться
DragonForce Опубликовано 15 января, 2022 Автор Поделиться Опубликовано 15 января, 2022 (изменено) 15 минут назад, Xipho сказал: Тебе следует разобраться с указателями в С++, и как хранятся константные строки в памяти, при использовании их с С++. Но вкратце - да, конструкцией lpBuffer = (LPVOID)"TEST1234" ты создаешь в памяти новый кусок, куда кладешь строку TEST1234, и затем адрес начала этого куска ты записываешь в lpBuffer. Только это локальный для функции lpBuffer, а не внешний. А далее в коде используешь оригинальный адрес Видимо для меня это пока не совсем понятно... Я думал достаточно в хук функции присвоить другое значение lpBuffer, а далее все что читает в оригинале этот буфер(после вызова ReadFile), будет получать уже новое значение lpBuffer`a(то, которое я присвоил в хуке)... Если у меня в собственной программе(в которой 30 строк кода-_-), которую я сделал для примера, не получается изменить lpBuffer, то о чем тогда еще речь...? Изменено 15 января, 2022 пользователем DragonForce Ссылка на комментарий Поделиться на другие сайты Поделиться
Antonshka Опубликовано 15 января, 2022 Поделиться Опубликовано 15 января, 2022 @DragonForce, я на таком же уровне сейчас. Я не увидел в твоем коде самого хука. Что именно ты хукаешь? Вызов ReadFile из main, или ReadFile в Kernel32.dll? Или подменяешь адрес ReadFile в разделе импорта? Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения