Спасибо за урок, Кенг. Очень грамотно объяснил, сейчас попробую сделать хук с EndScene функцией =)
@mremizov12 жыл бұрын
Рад стараться! С EndScene будет практически то же самое, кроме смещения до самой функции (17 для Present, какое-то другое для EndScene) и описания самой функции - аргументы там другие. Смещение можно посмотреть в заголовочных файлах (d3d9.h), или же нагуглить.
@mremizov12 жыл бұрын
Ну, я начитался когда-то исходников, в которых использовался сканер сигнатур, но не считаю такое решение достаточно универсальным. С одной стороны - да, это попроще, зная сигнатуру, но всегда есть шанс, что сигнатура изменится - вариант не самый надёжный. С точки зрения же библиотеки буфер можно курочить совершенно безболезненно, т.е. в цепочку "BeginScene - EndScene - Present" можно вклиниваться в любом месте, лишь бы эта цепочка сохранялась.
@MrAirrussia11 жыл бұрын
нет, Михаил спасибо тебе огромное, что записал эти уроки!!! Блин на Delphi искал что-нибудь подобное ничего нету... какие-то убогие примеры есть, но все бес мысленно, т.к. они не рабочие а тут все таки показана суть!!! Жаль, что вы упустили особый момент!!! DLL загружена в память и поэтому до таблицы методов тоже самое смещение!!!
@PaxBeach7 жыл бұрын
Что-нибудь получилось на Delphi с этим примером? Почему-то в DLL CreateDevice всегда возвращает nil устройство, а в обычном приложении устройство создается нормально. Помоги с примером пожалуйста.
@MrAirrussia7 жыл бұрын
Получилось, давно это было, всех нюансов сейчас не помню, кидай почту или другой контакт мне в личку скину свой говнокод. :-)
@mremizov12 жыл бұрын
Плюс, на производительности сказывается только кривость алгоритма рисования - т.е. вся цепочка (Begin - End - Present) в любом случае выполнится, но если там будет какой-нибудь ресурсоёмкий код - само собой, будут и проседания производительности, независимо от того, в какой функции это будет выполнено.
@mremizov12 жыл бұрын
Ага, я уже нагуглил. Весёлая штука, будет особнячком стоять для новых уроков. ;)
@mremizov12 жыл бұрын
По-идее, должна быть, но пока никак себя не проявила. Это легко лечится, покажу в следующем видео, как. Спасибо за внимательность. :)
@gim_y76394 жыл бұрын
Если винда старше 7 версии, то ставьте в свойствах экзешника, в который будете инжектить, совместимость с windows xp.
@gabriel_95728 жыл бұрын
Куда ты исходник выложил ???
@Sten37rus12 жыл бұрын
У меня крашутся игры с этой DLL примерно через 3-5 минут) А тестовый проект сразу при инжекте крашится. В чем может быть косяк ? Винда 7 x64 , студия 2012 ultimate , DX SDK такой же как у тебя
@СтасПеченских8 жыл бұрын
Спасибо огромное за видео. Писал свой hook, но на C#. В итоге не мог никак понять что не так, оказалось у меня неправильная логика работы была: нету вызова перехваченного Present и перед вызовом восстановление старых байтов. Вместо этого я просто выделял 1 раз asm код, где вызывал свою функцию в своей программе, а дальше в этом же asm были восстановленные биты, которые я затер + jmp на затертые биты + их длина. В итоге, получалось так, что при хуке экран просто вставал на 1 картинке (стопался), пока не убирал хук... Но, в этом коде у вас ошибка: если посмотрите количество потребляемой памяти хукнутой игрой, то заметите, что память бесконечно выделяется до тех пор, пока она не забьется полностью (примерно за несколько минут). А дальше вылезет внутри игровая ошибка о невозможности выделить память. Ошибку эту я пока не заметил, т.к. знания С++ у меня на уровне универа - когда то использовал для лабораторных работ.
@СтасПеченских8 жыл бұрын
т.е. у меня было так jmp [мой asm адрес] -> call [функция в моей программе], восстановленные затертые байты, jmp [старый адрес + длина затертых байт] Внимание: не верная логика - зависает!
@СтасПеченских8 жыл бұрын
Утечка памяти оказалась в DrawIndicator при прорисовке текста, а именно в создании шрифтов и не освобождении памяти уже использованного шрифта m_font->Release() На данный момент я тестирую на игре WoW TBC 2.4.3. Как выяснилось, через некоторое время крашится игра с ошибкой "The memory could not be write" на очень низкий адрес, скажем 0х0000002A. Т.е. есть либо ошибки с соглашением вызовов, либо в моем случ. просто не JMP [address] - оригинальные мнемокоды, и поэтому нужно либо не 5 байт считывать, а больше, либо искать точку входа с небольшим смещением от present9.
@СтасПеченских8 жыл бұрын
Изучил ошибку. По адресу [dD3D + present9], там где мы предполагаем, что это начало функции Present идут такие 5 байт мнемокодов: mov edi,edi push ebp mov ebp,esp Которые мы заменяем на jmp [address] и восстанавливаем каждый кадр. Ошибка оказалась по адресу: d3d9.dll+12B65C dword ptr[esi], 00 где ESI=00000002 Поэтому игра выдает ошибку: The instruction at "70A7B65C" referenced memory at "0x00000002". The memory could not be written. ПС: наз разбираться почему ESI получается такой...
@СтасПеченских8 жыл бұрын
По поводу крашей - это моя вина. Каюсь. Я в DrawIndicator зачем то дописал dev->Release(). ^_^ Спасибо еще раз. Очень сильно помог.
@localehost26026 жыл бұрын
Стас, получилось тогда ? :)
@unknownunknown21277 жыл бұрын
How to stop memory from leaking with this source?
@mremizov12 жыл бұрын
А DIP - это? Я не силён в терминологии, а в гугле толкового определения не нашлось. :D
@KirillKabanov-vd8md9 жыл бұрын
Помогите, возникает ошибка при компиляции: error: invalid conversion from 'PRESENT9 {aka long int (__attribute__((__stdcall__)) *)(IDirect3DDevice9*, const tagRECT*, const tagRECT*, HWND__*, void*)}' to 'const void*' [-fpermissive]
@theslavscav8 жыл бұрын
Я пробовал тестировать эту DLL на своей программе и она крашится при иньекции с ошибкой из-за того что при вызове d3dDevice->Release(); d3dDevice это нуль-указатель. Не знаю как пофиксить.
@БрутальныйПоцик4 жыл бұрын
Наверное я немного запоздал , но если windows старше 7 версии то , нужно поставить совместимость с win xp например и всё будет работать , мне помогло на win 10
@MrAirrussia11 жыл бұрын
кстати, что! а то что смещение до каждого метода в DirectX определенной версии штука постоянная! И не нужна получается функция GetDevice9Methods(), она фактически должна просто возвращать адреса смещения до нужного нам метода в зависимости от версии DirectX! А создание окна и т.п. это лишнее!!! Возможно я чего то не раздуплил, но на моей машине смещение константа, экспериментирую с DirectX8 т.к. есть одна игра которая никак не умирает!
@Greg79810011 жыл бұрын
Привет. Для кого простенько исправить утечку в D3DXCreateFont, а для кого нет, раз десять жмакаю F1 и игра уходит в штопор, причем любая.
@Fedja2008112 жыл бұрын
Код проще потому что так намного легче, всего получение адреск и хук. Почеме меню в ЕС? Так надо, во избежание вылетов игр... да и само меню будет иметь быстрый отклик и грузить систему не будет
@Fedja2008112 жыл бұрын
В DIP надо рисовать ВХ!
@findr012 жыл бұрын
УРА!
@mremizov12 жыл бұрын
Почему же?
@muutalol12 жыл бұрын
у меня есть смещения всех функций =) у ендсцен это 42ая
@32bita12 жыл бұрын
спасибо
@alexeianonim410611 жыл бұрын
тоже самое
@mremizov12 жыл бұрын
Уиии! :)
@MrAirrussia11 жыл бұрын
Заставляет мозг напрячься про указатели!!! Вроде расдублил тему понял, что к чему, на самом деле vtablePtr:=TPointer(Pointer(Pointer(d3dDevice)); самое ключевое место к понимаю!!!
@mirokko10 жыл бұрын
Исходный код плз, иначе толку мало от видео, не хочется переписывать с экрана код... (это мое мнение)