

MadVlad
Стажёры-
Постов
8 -
Зарегистрирован
-
Посещение
Тип контента
Профили
Форумы
Загрузки
Блоги
Весь контент MadVlad
-
Спасибо большое! сделал вот так, путём перехвата Reset функции: HRESULT __stdcall hkReset(LPDIRECT3DDEVICE9 dev, D3DPRESENT_PARAMETERS *pPresentationParameters) { if (font) { font->Release(); font = 0; } return oReset(dev, pPresentationParameters); } Я нашел в игре код, где идёт вызов функций EndScene или Reset, да вот только перехватить не смог. На ассемблере я легко бы это сделал, но пишу я на плюсах, и хукаю с помощью MS Detours, а этой штука предназначена хукать только целые функции, а не конкретные строчки кода (по моему). Писать свой хук путем замены байтов, прыжков, и прочей лабуды мне пока лень, я ведь только учусь, поэтому решил просто хукнуть эти функции, и всё отлично работает! ? Вот тут проблема, если просто приводить тип double к float - все линии идут в одну точку, и то хрен знает куда. Может координаты нужно домножить на какую-то матрицу... Кто его знает)) Но в любом случае спасибо!
-
Эту функцию использовать в конце хук-функции? И где взять аргумент для неё? Или перехватить её и в ней делать ReleaseFont? До меня долго доходит... И волнует так же вопрос насчёт координат, изложенный в моём посте выше (в инете ничего не нашел, а искал весь день).
-
Блин, чувак, спасибо огромное, всё заработало как часики!!! А можно пожалуйста по подробнее, что означает reset hook? То есть найти в коде игры, где игра вызывает EndScene, и этот вызов подменить своей функцией, и в конце своей функции вызвать EndScene? Окей, так и сделаю. И ещё есть вопросик: в игре координаты персонажа заданы в double координатах, причём они очень маленькие (например z: 6.63448740346359E-317). Как для них сделать WorldToScreen функцию? Функция D3DXVec3Project принимает параметр D3DXVECTOR3, состоящий из 3-х float значений. Как быть?
-
Сделал отрисовку только тогда, когда нажата кнопка. Всё работает. Игра вылетает, если к примеру изменить размер окна, сделать окно неактивным а потом его активировать. В чём дело - понятия не имею. Убрал все GetKeyState - проблема осталась. Убираем функцию font->DrawTextA - игра работает как обычно и не вылетает. Заменял функцию рисования текста на рисование линии - симптомы те же. Игра заходит в функцию PeekMessage, откуда уже не выходит. В отладчике перед входом в функцию PeekMessage видно, что регистры и стек в любом случае одинаковы, отличаются лишь некоторые флаги и ST регистры. Почему игра бесконечно ходит по этой функции и не выходит из неё - сказать сложно... Вопрос: почему функции рисования нарушают работу игры, и как с этим бороться? И почему я должен ждать +- 1 день, что бы мой пост одобрил модератор? Я что, гадости пишу? Это по меньшей мере глупо, не на одном форуме такого не встречал. Просто дико бесит, когда мне нужно просто так ждать овер дохрена времени, что бы получить ответ...
-
Опрашивать то опрашивает, но ведь не вечно в цикле крутится... Просто когда я делаю "шаг с обходом" через эту функцию в отладчике, то не через 1, и не через 5 минут функция не возвращает управление обратно, и следовательно приложение стает "мертвым". Да и с WinAPI я работаю уже не первый год... Вот тут не понял, можно по подробнее? Пробовал инжектить Cheat Engine'ом - эффект тот же. Всё работает до первого клика по окну (активация окна).
-
Доброго времени суток. Очень нуждаюсь в помощи. Вопрос по поводу рисования в чужом окне игры. Ищу сигнатуру функции EndScene, затем хукаю её на свою при помощи MS Detours. Хук ставится отлично, вопросов нет. Вопросы возникают далее... //Код функции - перехватчика, где font - глобальный указатель на структуру ID3DXFont. HRESULT __stdcall hkEndScene(LPDIRECT3DDEVICE9 dev) { if (!font) D3DXCreateFont(dev, 30, 0, FW_BOLD, 0, 0, 1, OUT_TT_ONLY_PRECIS, 0, 0 | FF_DONTCARE, "Arial", &font); RECT fontRect; fontRect.left = 500; fontRect.top = 500; fontRect.right = 1000; fontRect.bottom = 1000; font->DrawTextA(0, "Hello, WORLD!", -1, &fontRect, DT_CENTER, D3DCOLOR_RGBA(255, 0, 128, 196)); return oEndScene(dev); } Теперь если делаем инжект библиотеки в главном меню игры - всё отлично работает (даже если зайти в локацию) и надпись держится всё время, если же инжектим в локации - всё работает, но стоит дать игре какое-то сообщение (например, сделать окно активным или нажать в нём), то игра сразу виснет. Под отладчиком я понял, что игра зацикливается в функции PeekMessage, и больше от туда не выходит... ? Если же закоментировать вот эту строчку кода font->DrawTextA(0, "Hello, WORLD!", -1, &fontRect, DT_CENTER, D3DCOLOR_RGBA(255, 0, 128, 196)); то надписи естественно нет, но игра и не виснет не при каких раскладах. Следовательно эта функция что-то портит... Пробовал с помощью _asm вставок сохранять и потом восстанавливать регистры/флаги - не помогло. Стек вроде в порядке, хотя на 100% не уверен. Может что-то связано с согласованием вызовов? Хотя кто его знает, везде stdcall. Если что нужно - уточняйте, скину. Буду благодарен любым идеям.
-
Сделал перебор всех областей через VirtualQueryEx, и поиск нужной по размеру/протекту/типу. После перебора отсеивается штук 10, и мгновенно находится нужная сигнатура. Думаю, это самый быстрый и простой вариант. Всем спасибо =)
-
Здрасте. Начну пожалуй с того, что ещё не разу не видел, что бы навсегда банили за то, что ты в нике при регистрации 4 циферки поставил. Навсегда и без доступа к сайту, ник поменять тоже нельзя. Ну то такое, Бог им судья, благо у кождого есть впн + другой браузер, перерегистрироваться дело 5-ти минут. Ближе к делу: написал сканер, который ищет сигнатуры в коде. Вопрос в одном: где искать? адрес нужного мне кода не входит не в один модуль. Нашёл область (memory region) памяти, где находится нужный код. Скорее всего программа (а точнее модуль flash.ocx) динамически выделяет память и пишет туда код. Но как найти нужную область памяти? Вопрос: как получить начальный адрес и размер для поиска сигнатуры? Или единственный вариант в таком случае - искать вдоль и поперёк по процессу, захватывая всё на своём пути?