Перейти к содержанию
Авторизация  

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

Всем прив. Возникла небольшая проблема, не могу разобраться почему.

Собственно писал обход запрета запуска CE/olly/artmoney и прочего. В игре это устроено циклом.

Ищет окна по названию(FindWindowA)

Делает снапшот процессов и прогоняет их(Process32NextW)

Нумерует окна(EnumWindows)

Если что-то прокнуло, дисконект от сервера.

По сути поставленую задачу я решил, хукнул выше указаные функции

в FindWindowA в любом случае возвращаю NULL, В Process32NextW Проверяю нужно ли прятать приложение, если да, то просто обнуляю LPPROCESSENTRY32W и делаю рекурсивный вызов хукнутой Process32NextW.

Далее EnumWindows:

BOOL __stdcall Hooked_EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam)
{
	// структура для возвращения оригинальной функции и параметров
	tORGENUMINFO tWinEnumInfo = { lpEnumFunc, lParam };

	// Запускаем наш нумератор и фильтруем то, что не должно видеть приложение :)
	return oEnumWindows(MyEnumWindowsProc, (LPARAM)&tWinEnumInfo);
}

Отрабатывает на ура.

Вызывается мой нумератор:

SIZESTR - дефайн sizeof - 1

static BOOL __stdcall MyEnumWindowsProc(HWND hWnd, LPARAM lParam)
{
	if (hWnd)
	{
		char WindowTitle[1024];
		WindowTitle[0] = WindowTitle[SIZESTR(WindowTitle)] = 0;
		if (GetWindowTextA(hWnd, WindowTitle, SIZESTR(WindowTitle)) > 0) // Я не получаю заголовок окна и возращаю FALSE
            {
        	// Код моего нумератора приводить смысла нету
            }
	}
	return(FALSE);
}

Но по итогу игра получает FALSE всегда, даже для тех окон которые прятать не нужно. т.к. я не получаю заголовок окна. 

В принципе работает и ладно, но очень хотелось бы разобратся почему так.

GetLastError показывает 2 кода

0x12 или 0x2

 

Хотя поставленая задача была решена, но, мне очень интересно, почему мне не получить заголовок окна О_о

Поделиться сообщением


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

Думаю так будет лучше и проще, попробуй описать свой функционал в колбеке.

 

Спойлер

BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
	char win_text[255];
	if (GetWindowText(hwnd, win_text, sizeof(win_text)))
	{
		CharToOem(win_text, win_text);
		printf("%s\n", win_text);
	}
	return 1;
}

int main()
{
	EnumWindows(&EnumWindowsProc, NULL);
	return 0;
}

 

А твой код вроде правильный, ничего необычного в нем нет, ну не считая этого:

 

7 часов назад, temtriss сказал:

WindowTitle[0] = WindowTitle[SIZESTR(WindowTitle)] = 0;

 

Но оно не должно мешать.

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

 

image.thumb.png.3f5b22280c110dd79b42537e5a615d5c.png

 

  • Плюс 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
33 минуты назад, partoftheworlD сказал:

Но оно не должно мешать.

Ну по сути да, просто задался вопросом почему так, 43 строки лишние написал))

Да и задача решена. 

36 минут назад, partoftheworlD сказал:

попробуй описать свой функционал в колбеке

Так CALLBACK - дефайн __stdcall 

Так что так и есть. Да и под отладчиком все вроде нормально да и мой нумератор вызывается вместо оригинального.

44 минуты назад, partoftheworlD сказал:

ничего необычного в нем нет, ну не считая этого

Оббил переменную 0 с двух сторон :D

 

Ладно,  я еще этот вопрос завтра помучаю, сегодня я до функции декода пакетов дорвался,  уже желания с нумератором нету копаться)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
27 минут назад, temtriss сказал:

Так CALLBACK - дефайн __stdcall 

я имел ввиду внутри этого колбека/функции вдруг заработает😁

пробовал воспроизвести твой код, но в итоге все работало, возможно где-то ошибка нумератора, да и других вариантов нет.

BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
18 часов назад, temtriss сказал:

Но по итогу игра получает FALSE всегда, даже для тех окон которые прятать не нужно. т.к. я не получаю заголовок окна. 

В принципе работает и ладно, но очень хотелось бы разобратся почему так.

GetLastError показывает 2 кода

0x12 или 0x2

 

Судя по коду игра может всегда возвращать FALSE. Других return не видно. Возможно еще стоит написать обработчик исключения и вывод информации. Можно прогнать под пошаговой отладкой в отладчике

Коды ошибок при работе с файлами

Поделиться сообщением


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

вероятно надо IsWindowVisible проверку

Поделиться сообщением


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

×

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

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