MMO RPG 2D игра. Старая и потасканная проверенная временем.
Не вижу смысла особо про нее рассказывать. Кто знает, тот молодец, а кто нет, тому оно не надо. Тем не менее, раз уж вы здесь, предлагаю ознакомиться с инфой ниже, возможно пригодится в чем то другом.
Если поискать способы в интернете, напорешься на туеву хучу разных вариантов, кто на что горазд. От самых простых, до еще более простых, и тд... Некоторые из них работают и по сей день.
Я опишу свой подход.
Приступим
Чаще всего в подобных межпроцессовых делах используют мьютекс.
Надо найти эту дрянь... Для такого случая подойдет hiew32. Великолепная программка с отличным функционалом. Если вы у мамы кодер, обязательно сохраните ее себе.
После того как скачали, для удобства добавьте ее в переменные среды.
Это гораздо лучше, чем каждый раз жонглировать приложениями.
Перед модификацией сделайте резервную копию исполняемого файла!
Для начала откройте исполняемый файл warspear.exe в hiew32.
Нужно перейти в HEX или Decode. Для этого нажмите Enter, или F4 затем F3.
Теперь необходимо открыть список импорта. Нажмите F8 затем F7.
Должно появиться такое окно:
Нужно найти в списке CreateMutexW.
Начните набирать ее имя на клавиатуре и она покажется.
После чего нажмите Enter и ждите.
В итоге появится участок кода где она используется:
Избавится от него можно перепрыгнув.
С первого push-а этой функции до push-а сразу после вызова call esi.
Устанавите курсор в начало кода первого push-а функции CreateMutexW.
Нажмите F3
Запишите туда: EB3F
Чтоб сохранить изменения, нажмите F9.
Участок кода который был пропущен содержит создание мютекса и стандартную проверку кода ошибки. Если одноименный объект мютекса уже создан, процесс, в итоге, перейдет к завершению.
Проверяем дальше, есть ли еще обращение к адресу этой функции в коде программы.
Нажимаем SHIFT + F7.
Наблюдаем следующую картину:
Тем кто через Process Explorer гасил объекты мютекса, я передаю привет.
Разрабы запихнули аналогичный блок кода в цикл обработки сообщений.
Теперь необходимо упразднить и этот блок когда, а точнее проверку дескриптора мютекса функцией WaitForSingleObject.
Один ньюанс:
При получении GetMessage WM_QUIT, устанавливается байт в сигнальную ячейку. Управление передается началу цикла обработки сообщений только после проверки статуса последней. На эту финальную проверку ссылается условный переход функции WaitForSingleObject. Чтобы сократить кол-во поправок, скип должен указывать именно сюда.
Проще всего изменить условный переход функции WaitForSingleObject на безусловный. Но я не хочу чтобы лишний раз она выполнялась.
Действуем по старой схеме:
Устанавите курсор в начало кода первого push-а функции WaitForSingleObject.
Нажмите F3
Запишите туда : EB57
Сохраните все клавишей F9.
Выполняем поиск далее. Необходимо дойти до конца, пока hiew32 не скажет что больше ничего не найдено.
Оставшиеся два результата почти одинаковы, выглядят так:
Я проверил ссылки на эти процедуры, и не одной не обнаружил. Проведя полную отладку, я так же не обнаружил исполнение кода этих процедур. Подобное означает что это скорее всего рудименты.
Смело забиваем на них и наслаждаемся бесконечным кол-вом окон.
После обновления игры, чтобы долго не возиться, используйте
сигнатуры поиска и опкоды для HEX редакторов:
Первая сигнатура: EC 8D 85 84 FC FF FF Опкод: EB3F
Вторая сигнатура: 50 FF 15 98 A3 AD 00 Опкод: EB57
Вписывайте опкод сразу после сигнатуры!