IPB

Здравствуйте, гость ( Вход | Регистрация )

3 страниц V  < 1 2 3  
Reply to this topicStart new topic
> patсher_x86
Ben
сообщение 13 Nov 2017, 10:22
Сообщение #41

Member
Сообщений: 86
Спасибо сказали: 48 раз




Цитата(Berserker @ 12 Nov 2017, 14:40) *
Вот и всё. Загрузчик — своя библиотека — установка перехватчиков — обработка событий.


Ну в общем, понятен принцип. Сами плагины, видимо, могут загружаться либо загрузчиком же, либо библиотекой-патчером, на усмотрение разработчика.
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 13 Nov 2017, 14:08
Сообщение #42

laughed as one fey
Сообщений: 11 813
Спасибо сказали: 19686 раз




Цитата
Сами плагины, видимо, могут загружаться либо загрузчиком же, либо библиотекой-патчером, на усмотрение разработчика.
Библиотека-патчер ничего не может загружать по той простой причине, что она библиотека.

Загружать чужой код в общем случае можно либо правкой исходного файла (LoadLibrary куда-то на старт), либо лаунчером с инъекцией кода (разными способами).
(в частном - еще всяческие трюки с поиском уязвимости, типа переполнения буфера)


--------------------


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
Berserker
сообщение 13 Nov 2017, 16:08
Сообщение #43

Immortal
Сообщений: 1 427
Спасибо сказали: 898 раз




Ben, если речь идёт о системе плагинов, то используйте AngelRun (или любой другой загрузчик dll в чужой процесс), а в самой dll выполните FindFirstFile/FindNextFile/FindClose в определённой папке, загружая все файлы с нужным расширением через LoadLibrary.


--------------------


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
baratorch
сообщение 14 Nov 2017, 11:23
Сообщение #44

Immortal
Сообщений: 2 366
Спасибо сказали: 4524 раза




Здесь последний патчер версии 4.2.9.1, хэдер для C++ версии 4.2 и pas-файл версии 2.1:
скачать патчер SDK


--------------------
HoMM 3 HD:
http://sites.google.com/site/heroes3hd
последняя версия - 3.61f


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
Berserker
сообщение 16 Nov 2017, 22:46 (Сообщение отредактировал Berserker - 19 Nov 2017, 00:40)
Сообщение #45

Immortal
Сообщений: 1 427
Спасибо сказали: 898 раз




Бара, есть возможность скомпилировать ту же 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-перехватчики? У меня модуль виртуальной файловой системы полностью работает на них. Файловые функции с разных потоков дёргаются. Единственное, что спасает — всё защищено критическими секциями.


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
Ben
сообщение 18 Nov 2017, 18:42
Сообщение #46

Member
Сообщений: 86
Спасибо сказали: 48 раз




Цитата(Berserker @ 16 Nov 2017, 22:46) *
Бара, есть возможность скомпилировать ту же 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


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
Berserker
сообщение 19 Nov 2017, 13:51 (Сообщение отредактировал Berserker - 19 Nov 2017, 14:03)
Сообщение #47

Immortal
Сообщений: 1 427
Спасибо сказали: 898 раз




В дополнение к предыдущему посту. Бара, ты используешь 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


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
baratorch
сообщение 19 Nov 2017, 21:25 (Сообщение отредактировал baratorch - 19 Nov 2017, 21:25)
Сообщение #48

Immortal
Сообщений: 2 366
Спасибо сказали: 4524 раза




Berserker, в патчере целиком и полностью забито на многопоточность.
Точнее в патчере:
1. нельзя создавать/ставить/отменять патчи/хуки в несколько потоков.
2. нельзя выполнять код с LoHook и HiHook (кроме DIRECT_) хуками в несколько потоков.
можно в несколько потоков выполнять Asm и DIRECT_ HiHook хуки.
3. нельзя пользоваться методами VarInit и VarFind в несколько потоков.

Цитата
В дополнение к предыдущему посту. Бара, ты используешь VirtualProtect для того, чтобы дать странице памяти права READ_WRITE_EXECUTE, но не возвращаешь оригинальные права обратно после применения патча.

Вообще-то обратно возвращаю.


--------------------
HoMM 3 HD:
http://sites.google.com/site/heroes3hd
последняя версия - 3.61f


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
Berserker
сообщение 19 Nov 2017, 22:26
Сообщение #49

Immortal
Сообщений: 1 427
Спасибо сказали: 898 раз




Понял, спасибо за разъяснения. Думаю, стоит это указать в первом посте или документации, что при необходимости поддержки многопоточности нужно использовать Asm и DIRECT_ HiHook-хуки.

Цитата
Вообще-то обратно возвращаю.

Отлично, значит переведя свои WriteCodeAt на Write я получу свои патчи в журналах патчера, не потеряв функциональности хуков Эры. С SetUnhandledExceptionFilter уже разобрался (теперь работает и твой, и мой обработчик). Скорее всего, бинарные патчи тоже пропущу через патчер.

А как насчёт map-файла? Можешь скомпилировать библиотеку с генерацией оного?


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
baratorch
сообщение 20 Nov 2017, 03:12
Сообщение #50

Immortal
Сообщений: 2 366
Спасибо сказали: 4524 раза




Цитата
А как насчёт map-файла? Можешь скомпилировать библиотеку с генерацией оного?

map сделаю к следующей версии патчера, которая выйдет на днях.


--------------------
HoMM 3 HD:
http://sites.google.com/site/heroes3hd
последняя версия - 3.61f


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
Berserker
сообщение 20 Nov 2017, 13:10
Сообщение #51

Immortal
Сообщений: 1 427
Спасибо сказали: 898 раз




Если что, как работает DIRECT_ не ясно из доков:
DIRECT_ - применение в паскале/делфи не предполагается, в hpp тоже не нашёл )


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
baratorch
сообщение 20 Nov 2017, 15:09
Сообщение #52

Immortal
Сообщений: 2 366
Спасибо сказали: 4524 раза




В 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 не передает указатель на хук в замещающую функцию и не создает никаких мостов, он передает управление сразу прямо на нашу замещающую функцию.


--------------------
HoMM 3 HD:
http://sites.google.com/site/heroes3hd
последняя версия - 3.61f


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
baratorch
сообщение 22 Nov 2017, 16:07
Сообщение #53

Immortal
Сообщений: 2 366
Спасибо сказали: 4524 раза




Патчер версии 4.3 + map-файл: скачать


--------------------
HoMM 3 HD:
http://sites.google.com/site/heroes3hd
последняя версия - 3.61f


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
Berserker
сообщение 24 Nov 2017, 23:36
Сообщение #54

Immortal
Сообщений: 1 427
Спасибо сказали: 898 раз




Бара, зацени: 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 попадает и список патчей.


--------------------


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
hippocamus
сообщение 25 Nov 2017, 00:08
Сообщение #55

Мяў, наверное...
Сообщений: 21 715
Спасибо сказали: 10244 раза




Не вполне понимаю, что это значит, но ты, Берс, видимо смог победить некую недружелюбную систему. Заставил HD кушать bin-файлы? Она раньше это делала, а потом перестала, да.
В общем, поздравляю!


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
Berserker
сообщение 25 Nov 2017, 03:13
Сообщение #56

Immortal
Сообщений: 1 427
Спасибо сказали: 898 раз




Зачем же, если Эра их и так кушает? )) Скорее теперь Эра использует patcher в 95% случаев, причём с хорошей детализацией.
А поддержку bin-файлов, думаю, Бара выпилил сознательно. Это живой чит для игры, для которой он разрабатывает мультиплеерные средства и античит.


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
igrik
сообщение 26 Sep 2018, 09:13 (Сообщение отредактировал igrik - 26 Sep 2018, 09:14)
Сообщение #57

Immortal
Сообщений: 570
Спасибо сказали: 811 раз




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);


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post

3 страниц V  < 1 2 3
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 17 October 2019 - 08:07
Copyright by Алексей Крючков
Strategy Gamez by GrayMage
Programming by Degtyarev Dmitry
  Яндекс.Метрика