patсher_x86 |
Здравствуйте, гость ( Вход | Регистрация )
patсher_x86 |
13 Nov 2017, 10:22
Сообщение
#41
|
|
Power Member Сообщений: 197 Спасибо сказали: 132 раза |
|
|
|
13 Nov 2017, 14:08
Сообщение
#42
|
|
laughed as one fey Сообщений: 12 166 Спасибо сказали: 20585 раз |
Цитата Сами плагины, видимо, могут загружаться либо загрузчиком же, либо библиотекой-патчером, на усмотрение разработчика. Библиотека-патчер ничего не может загружать по той простой причине, что она библиотека.Загружать чужой код в общем случае можно либо правкой исходного файла (LoadLibrary куда-то на старт), либо лаунчером с инъекцией кода (разными способами). (в частном - еще всяческие трюки с поиском уязвимости, типа переполнения буфера) |
|
|
13 Nov 2017, 16:08
Сообщение
#43
|
|
Immortal Сообщений: 1 468 Спасибо сказали: 1151 раз |
Ben, если речь идёт о системе плагинов, то используйте AngelRun (или любой другой загрузчик dll в чужой процесс), а в самой dll выполните FindFirstFile/FindNextFile/FindClose в определённой папке, загружая все файлы с нужным расширением через LoadLibrary.
-------------------- |
|
|
14 Nov 2017, 11:23
Сообщение
#44
|
|
Immortal Сообщений: 2 412 Спасибо сказали: 4617 раз |
Здесь последний патчер версии 4.2.9.1, хэдер для C++ версии 4.2 и pas-файл версии 2.1:
скачать патчер SDK -------------------- |
|
|
16 Nov 2017, 22:46
(Сообщение отредактировал Berserker - 19 Nov 2017, 00:40)
Сообщение
#45
|
|
Immortal Сообщений: 1 468 Спасибо сказали: 1151 раз |
Бара, есть возможность скомпилировать ту же 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-перехватчики? У меня модуль виртуальной файловой системы полностью работает на них. Файловые функции с разных потоков дёргаются. Единственное, что спасает — всё защищено критическими секциями. -------------------- |
|
|
18 Nov 2017, 18:42
Сообщение
#46
|
|
Power Member Сообщений: 197 Спасибо сказали: 132 раза |
Бара, есть возможность скомпилировать ту же 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 |
|
|
19 Nov 2017, 13:51
(Сообщение отредактировал Berserker - 19 Nov 2017, 14:03)
Сообщение
#47
|
|
Immortal Сообщений: 1 468 Спасибо сказали: 1151 раз |
В дополнение к предыдущему посту. Бара, ты используешь 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 -------------------- |
|
|
19 Nov 2017, 21:25
(Сообщение отредактировал baratorch - 19 Nov 2017, 21:25)
Сообщение
#48
|
|
Immortal Сообщений: 2 412 Спасибо сказали: 4617 раз |
Berserker, в патчере целиком и полностью забито на многопоточность.
Точнее в патчере: 1. нельзя создавать/ставить/отменять патчи/хуки в несколько потоков. 2. нельзя выполнять код с LoHook и HiHook (кроме DIRECT_) хуками в несколько потоков. можно в несколько потоков выполнять Asm и DIRECT_ HiHook хуки. 3. нельзя пользоваться методами VarInit и VarFind в несколько потоков. Цитата В дополнение к предыдущему посту. Бара, ты используешь VirtualProtect для того, чтобы дать странице памяти права READ_WRITE_EXECUTE, но не возвращаешь оригинальные права обратно после применения патча. Вообще-то обратно возвращаю. -------------------- |
|
|
19 Nov 2017, 22:26
Сообщение
#49
|
|
Immortal Сообщений: 1 468 Спасибо сказали: 1151 раз |
Понял, спасибо за разъяснения. Думаю, стоит это указать в первом посте или документации, что при необходимости поддержки многопоточности нужно использовать Asm и DIRECT_ HiHook-хуки.
Цитата Вообще-то обратно возвращаю. Отлично, значит переведя свои WriteCodeAt на Write я получу свои патчи в журналах патчера, не потеряв функциональности хуков Эры. С SetUnhandledExceptionFilter уже разобрался (теперь работает и твой, и мой обработчик). Скорее всего, бинарные патчи тоже пропущу через патчер. А как насчёт map-файла? Можешь скомпилировать библиотеку с генерацией оного? -------------------- |
|
|
20 Nov 2017, 03:12
Сообщение
#50
|
|
Immortal Сообщений: 2 412 Спасибо сказали: 4617 раз |
Цитата А как насчёт map-файла? Можешь скомпилировать библиотеку с генерацией оного? map сделаю к следующей версии патчера, которая выйдет на днях. -------------------- |
|
|
20 Nov 2017, 13:10
Сообщение
#51
|
|
Immortal Сообщений: 1 468 Спасибо сказали: 1151 раз |
Если что, как работает DIRECT_ не ясно из доков:
DIRECT_ - применение в паскале/делфи не предполагается, в hpp тоже не нашёл ) -------------------- |
|
|
20 Nov 2017, 15:09
Сообщение
#52
|
|
Immortal Сообщений: 2 412 Спасибо сказали: 4617 раз |
В 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 не передает указатель на хук в замещающую функцию и не создает никаких мостов, он передает управление сразу прямо на нашу замещающую функцию. -------------------- |
|
|
22 Nov 2017, 16:07
Сообщение
#53
|
|
Immortal Сообщений: 2 412 Спасибо сказали: 4617 раз |
Патчер версии 4.3 + map-файл: скачать
-------------------- |
|
|
24 Nov 2017, 23:36
Сообщение
#54
|
|
Immortal Сообщений: 1 468 Спасибо сказали: 1151 раз |
Бара, зацени: 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 попадает и список патчей. -------------------- |
|
|
25 Nov 2017, 00:08
Сообщение
#55
|
|
пират с чёрной меткой Сообщений: 23 630 Спасибо сказали: 12911 раз |
Не вполне понимаю, что это значит, но ты, Берс, видимо смог победить некую недружелюбную систему. Заставил HD кушать bin-файлы? Она раньше это делала, а потом перестала, да.
В общем, поздравляю! -------------------- Давший быка на убой не выпросил и печень на жаркое.
|
|
|
25 Nov 2017, 03:13
Сообщение
#56
|
|
Immortal Сообщений: 1 468 Спасибо сказали: 1151 раз |
Зачем же, если Эра их и так кушает? )) Скорее теперь Эра использует patcher в 95% случаев, причём с хорошей детализацией.
А поддержку bin-файлов, думаю, Бара выпилил сознательно. Это живой чит для игры, для которой он разрабатывает мультиплеерные средства и античит. -------------------- |
|
|
26 Sep 2018, 09:13
(Сообщение отредактировал igrik - 26 Sep 2018, 09:14)
Сообщение
#57
|
|
Immortal Сообщений: 589 Спасибо сказали: 890 раз |
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); -------------------- |
|
|
Текстовая версия | Сейчас: 18 April 2024 - 13:54 |
Copyright by Алексей Крючков
Programming by Degtyarev Dmitry |