![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Сообщение
#41
|
|
Power Member Сообщений: 198 Спасибо сказали: 134 раза ![]() |
|
|
|
![]()
Сообщение
#42
|
|
![]() laughed as one fey Сообщений: 12 167 Спасибо сказали: 20603 раза ![]() |
Цитата Сами плагины, видимо, могут загружаться либо загрузчиком же, либо библиотекой-патчером, на усмотрение разработчика. Библиотека-патчер ничего не может загружать по той простой причине, что она библиотека.Загружать чужой код в общем случае можно либо правкой исходного файла (LoadLibrary куда-то на старт), либо лаунчером с инъекцией кода (разными способами). (в частном - еще всяческие трюки с поиском уязвимости, типа переполнения буфера) |
|
|
![]()
Сообщение
#43
|
|
![]() Immortal Сообщений: 1 468 Спасибо сказали: 1153 раза ![]() |
Ben, если речь идёт о системе плагинов, то используйте AngelRun (или любой другой загрузчик dll в чужой процесс), а в самой dll выполните FindFirstFile/FindNextFile/FindClose в определённой папке, загружая все файлы с нужным расширением через LoadLibrary.
-------------------- |
|
|
![]()
Сообщение
#44
|
|
Immortal Сообщений: 2 413 Спасибо сказали: 4619 раз ![]() |
Здесь последний патчер версии 4.2.9.1, хэдер для C++ версии 4.2 и pas-файл версии 2.1:
скачать патчер SDK -------------------- |
|
|
![]()
Сообщение
#45
|
|
![]() Immortal Сообщений: 1 468 Спасибо сказали: 1153 раза ![]() |
Бара, есть возможность скомпилировать ту же DLL с настройкой генерации detailed *.map-файла в linker?
Open the project's Property Pages dialog box. For details, see Setting Visual C++ Project Properties. Click the Linker folder. Click the Debug property page. Modify the Generate Map File property. P.S. https://yadi.sk/i/CY2S8Ku63PpTzc Если я верно понимаю, то LoHook не подходит для многопоточных приложений — гонка данных на запись одного и того же значения в оперативной памяти по абсолютному адресу. Такие баги сложно отловить. P.S.S. В связи с этим у меня вопрос, являются ли потокобезопасными HiHook-перехватчики? У меня модуль виртуальной файловой системы полностью работает на них. Файловые функции с разных потоков дёргаются. Единственное, что спасает — всё защищено критическими секциями. -------------------- |
|
|
![]()
Сообщение
#46
|
|
Power Member Сообщений: 198 Спасибо сказали: 134 раза ![]() |
Бара, есть возможность скомпилировать ту же DLL с настройкой генерации detailed *.map-файла в linker? Open the project's Property Pages dialog box. For details, see Setting Visual C++ Project Properties. Click the Linker folder. Click the Debug property page. Modify the Generate Map File property. Map файл для версии 2.8: https://yadi.sk/i/J-ZvmeWu3Pp79m |
|
|
![]()
Сообщение
#47
|
|
![]() Immortal Сообщений: 1 468 Спасибо сказали: 1153 раза ![]() |
В дополнение к предыдущему посту. Бара, ты используешь VirtualProtect для того, чтобы дать странице памяти права READ_WRITE_EXECUTE, но не возвращаешь оригинальные права обратно после применения патча. А это значит, что любая прямая запись позже в ту же страницу будет успешной, а не приводить к Access Violation. Может быть стоит возвращать странице оригинальные права после внесения правок?
Код {!} Assert(Utils.IsValidBuf(Dst, Count));
{!} Assert((Src <> nil) or (Count = 0)); result := Count = 0; if not result then begin result := Windows.VirtualProtect(Dst, Count, Windows.PAGE_EXECUTE_READWRITE, @OldPageProtect); if result then begin Utils.CopyMem(Count, Src, Dst); result := Windows.VirtualProtect(Dst, Count, OldPageProtect, @OldPageProtect); end; // .if end; // .if -------------------- |
|
|
![]()
Сообщение
#48
|
|
Immortal Сообщений: 2 413 Спасибо сказали: 4619 раз ![]() |
Berserker, в патчере целиком и полностью забито на многопоточность.
Точнее в патчере: 1. нельзя создавать/ставить/отменять патчи/хуки в несколько потоков. 2. нельзя выполнять код с LoHook и HiHook (кроме DIRECT_) хуками в несколько потоков. можно в несколько потоков выполнять Asm и DIRECT_ HiHook хуки. 3. нельзя пользоваться методами VarInit и VarFind в несколько потоков. Цитата В дополнение к предыдущему посту. Бара, ты используешь VirtualProtect для того, чтобы дать странице памяти права READ_WRITE_EXECUTE, но не возвращаешь оригинальные права обратно после применения патча. Вообще-то обратно возвращаю. -------------------- |
|
|
![]()
Сообщение
#49
|
|
![]() Immortal Сообщений: 1 468 Спасибо сказали: 1153 раза ![]() |
Понял, спасибо за разъяснения. Думаю, стоит это указать в первом посте или документации, что при необходимости поддержки многопоточности нужно использовать Asm и DIRECT_ HiHook-хуки.
Цитата Вообще-то обратно возвращаю. Отлично, значит переведя свои WriteCodeAt на Write я получу свои патчи в журналах патчера, не потеряв функциональности хуков Эры. С SetUnhandledExceptionFilter уже разобрался (теперь работает и твой, и мой обработчик). Скорее всего, бинарные патчи тоже пропущу через патчер. А как насчёт map-файла? Можешь скомпилировать библиотеку с генерацией оного? -------------------- |
|
|
![]()
Сообщение
#50
|
|
Immortal Сообщений: 2 413 Спасибо сказали: 4619 раз ![]() |
Цитата А как насчёт map-файла? Можешь скомпилировать библиотеку с генерацией оного? map сделаю к следующей версии патчера, которая выйдет на днях. -------------------- |
|
|
![]()
Сообщение
#51
|
|
![]() Immortal Сообщений: 1 468 Спасибо сказали: 1153 раза ![]() |
Если что, как работает DIRECT_ не ясно из доков:
DIRECT_ - применение в паскале/делфи не предполагается, в hpp тоже не нашёл ) -------------------- |
|
|
![]()
Сообщение
#52
|
|
Immortal Сообщений: 2 413 Спасибо сказали: 4619 раз ![]() |
В DIRECT_ HiHook наша замещающая функция должна 100% соответствовать соглашению о вызовах замещаемой.
т.е. если мы ставим хук на __thiscall функцию, то наша должна быть тоже __thiscall, а точнее принимать первый аргумент в ecx, остальные в стеке. если мы ставим хук на __fastcall, то наша должна принимать аргументы в ecx, edx и стеке. если на __cdecl, то наша функция должна возвращать управление по retn, а не по retn (4 * колво аргументов в стеке) как это делают __stdcall, __fastcall, __thiscall В VC++ нет проблем с объявлением __stdcall, __cdecl, __fastcall функций __thiscall объявить нельзя, но вместо нее можно использовать __fastcall (a1, no_used, a2, ...) Не знаю как с этим обстоят дела в Делфи/Паскале. С __stdcall проблем не должно быть, __cdecl вроде тоже поддерживается, а вот насчет __fastcall и __thiscall я не уверен. DIRECT_ HiHook не передает указатель на хук в замещающую функцию и не создает никаких мостов, он передает управление сразу прямо на нашу замещающую функцию. -------------------- |
|
|
![]()
Сообщение
#53
|
|
Immortal Сообщений: 2 413 Спасибо сказали: 4619 раз ![]() |
Патчер версии 4.3 + map-файл: скачать
-------------------- |
|
|
![]()
Сообщение
#54
|
|
![]() Immortal Сообщений: 1 468 Спасибо сказали: 1153 раза ![]() |
Бара, зацени: http://rgho.st/7pBPttP9k
Код instances(44): 'D:\Heroes 3\era.dll', 'MonDescription', 'HD.Plugin.QuicksandMines', 'D:\Heroes 3\Mods\WoG\EraPlugins\erm_hooker.era', 'WoG Patcherizer', 'WoG', 'remove exe protection.bin', 'New_NPC_Dlg', 'adventure menu button.bin', 'always summon ship.bin', 'disable dracolich block.bin', 'dismiss last stack.bin', 'display primary skills over 99.bin', 'dl buttons fix.bin', 'hero screen button.bin', 'inferno gates teleports to any town.bin', 'magic button fix.bin', 'no gifts from allies.bin', 'no load game confirmation.bin', 'no real time trigger.bin', 'no retreat request.bin', 'no secondary skills limit.bin', 'phoenix buttons.bin', 'skin.bin', 'transfer last stack.bin', 'spellbook.bin', 'acredit.bin', 'ai sod radius.bin', 'enable next hero button.bin', 'enable town info.bin', 'fix erm ca b2 command.bin', 'fix erm check syntax.bin', 'fix erm ss a command.bin', 'fix erm tr r roads.bin', 'fix towers damage.bin', 'mp3 44khz patch.bin', 'no erm he f redraw.bin', 'no erm ow r redraw.bin', 'no erm scripts turning off.bin', 'no memory and hdd checks.bin', 'no multiplayer notes.bin', 'remove black screens.bin', 'skeleton transformer fix.bin', 'zvslib.bin', places count: 1433 patches count: 1460 Все патчи создаются через патчер. Бинарные патчи применяются с созданием уникального экземпляра патчера для каждого файла. По F11 или вылету в папку Debug\Era попадает и список патчей. -------------------- |
|
|
![]()
Сообщение
#55
|
|
![]() допустим, мяў Сообщений: 24 109 Спасибо сказали: 13416 раз ![]() |
Не вполне понимаю, что это значит, но ты, Берс, видимо смог победить некую недружелюбную систему. Заставил HD кушать bin-файлы? Она раньше это делала, а потом перестала, да.
В общем, поздравляю! -------------------- Вокруг столько фильмов, книг, музыки - а природа какая невероятная!
Если тебе скучно жить - ты совсем дурак. (Татьяна Черниговская) |
|
|
![]()
Сообщение
#56
|
|
![]() Immortal Сообщений: 1 468 Спасибо сказали: 1153 раза ![]() |
Зачем же, если Эра их и так кушает? )) Скорее теперь Эра использует patcher в 95% случаев, причём с хорошей детализацией.
А поддержку bin-файлов, думаю, Бара выпилил сознательно. Это живой чит для игры, для которой он разрабатывает мультиплеерные средства и античит. -------------------- |
|
|
![]()
Сообщение
#57
|
|
![]() Immortal Сообщений: 589 Спасибо сказали: 891 раз ![]() |
baratorch, а как вообще отменять патчи/хуки, созданные другой dll по определенному адресу? Например:
Мне необходимо отменить LoHook по адресу 0x5F4C99, созданный в Some.dll (которая загружена ранее, чем моя и у которой я знаю параметр "CreateInstance"), и установить по этому адресу свой патч в My.dll: Код _P = GetPatcher();
_MY = _P->CreateInstance("my"); _SOME = _P->GetInstance("some"); if (_SOME) { _SOME->GetLastPatchAt(0x5F4C99)->Destroy(); } // и применяю свой патч _MY->WriteDword(0x5F4C99 +3, (_dword_)&myArray +4); -------------------- |
|
|
![]() ![]() |
Текстовая версия | Сейчас: 13 October 2025 - 11:36 |
Copyright by Алексей Крючков
![]() Programming by Degtyarev Dmitry |
|