All streams
Search
Write a publication
Pull to refresh
84
0
Эреб @Ereb

Пользователь

Send message
Совершенно верно: для RTS это чуть ли не единственный метод, если вы не хотите, чтобы реплеи весили десятки (а то и сотни) мегабайт.
Не проверял, но в данном контексте это не имеет значения.

Функция манифеста появилась лишь в Visual Studio 2005 / MSVC 8, а описанная эвристика — ещё позже. На момент написания Казаков нельзя было предвидеть и избежать такого поворота. Это я и хотел выразить в данном предложении.
Всегда пожалуйста :)

1. Да, именно так. rec-файл в основном состоит из буфера команд (ExBuf), которые передавались по сети. Действия ИИ рассчитываются заново при просмотре, так что игра как будто играется заново.

В процессе игры постоянно задействуются псевдослучайные числа из файла random.lst, и в определённом такте текущее случайное число сохраняется в записи. Это один из способов, которым игра проверяет синхронизацию. Про механизм синхронизации Казаков вообще можно отдельную статью написать :)

2. Наверняка сказать не могу, но скорее всего вычисляется во время воспроизведения, т.к. в механизме экрана статистики я не заметил разделения на игру и запись. При этом вполне возможно, что значения ресурсов периодически сохраняются в файле записи для проверки синхронизации.
Описанная в конце статьи функция определена в Mplayer.cpp:3106.

Тело функции
int PingSumm::CheckPlayer(DWORD DPID){
	for(int i=0;i<NPL;i++){
		if(PSET[i].DPID==DPID)return PSET[i].NPings;
	};
	return 0;
};

При этом, например, grep PSET | grep free показывает, что кроме деструктора этот регион памяти освобождается и в функции ClearPingInfo() в Mplayer.cpp:3124. Также есть и несколько вызовов realloc(). А какой-либо синхронизации я нигде не увидел…
Да, по всему проекту около 250 ассемблерных вставок. Суровая оптимизация из 2000-ых. А ещё некоторые статические библиотеки ссылаются на канувшие в лету функции стандартных библиотек. Так, например, пришлось переписать отрывок в IChat/Chat/chatSocket.c и заменить в Peer.lib объект chatSocket.obj, чтобы убрать из линковки ссылку на устаревшую vsprintf() и хотя бы собрать этого динозавра в VS2015 :)
Всё указывает на это. Сложно сказать, где собака зарыта, т.к. DirectPlay сам по себе многопоточен, а помимо него используется и свой протокол на основе UDP. Может, мне просто «повезло» наткнуться на эту ошибку, т.к. в сети описание именно такого поведения я не нашёл.
Конечно! Хоть конкретно эту проблему я и решил, в будущем исходники могут очень пригодиться. Буду очень признателен, если скинете в личку ссылку.
Это не проблема, а особенность игрового процесса :)
не 01h
В самом начале присваивается 0x01 на случай «обычного» заказа одной единицы, затем в сависимости от результатов GetKeyState другие значения (в примере выше 0x05, 0x14, 0x32, 0x0F или 0x24).

раз уж у нас stdcall
Честно говоря, достоверно мне это известно не было. Как можно проверить, что exe'шник придерживается calling convention и что регистр esi можно безопасно использовать?

И в случае stdcall я ведь всё равно обязан положить esi на стек, прежде чем использовать его в патче, а затем восстановить, не так ли?
Да, там тоже смотрел… Недостаточно тщательно. Зато сейчас вижу: том 2А, страница 3-496.

То есть, я мог бы сделать и так?
mov     ecx, 01h    B9 01 00 00 00
[...]

: Цикл
push    ecx         51
[...]
pop     ecx         59
loop                E2 ..

Точно, спасибо. Видимо, информация на том сайте относилась к архитектуре 8086.
Да, без ошибок не обошлось. По поводу регистра cx: к нему я пришёл, когда искал информацию про циклы в асм. В конце концов я от него отказался, как и от использования loop. Ну а на счёт dec и jnz вы, конечно, правы. Как-то даже стыдно, что сам не додумался. С другой стороны, как я уже писал, опыта с ассемблером до реверса «Казаков» у меня не было от слова совсем. Так что спасибо за совет, в следующий раз учту)
Была, но в некоторых случаях она не так удобна, как кажется. Например, цена наёмных драгунов в дипломатическом центре растёт с каждым драгуном, которого вы уже наняли. Т.е. намного дешевле сразу заказать 500 единиц, чем ставить на бесконечность. Или если вы хотите не отвлекаясь заказать подряд ровно по взводу пикинёров и мушкетёров в одной казарме или чередовать производство каждые 50 единиц.
Патчер, о котором говорится в конце статьи, доступен по ссылке:
https://yadi.sk/d/z6rTlJfRpvRn8
Честно говоря, я сам удивился, когда услышал это. Даже подумал, что админ таким образом выгораживает пользователя, который всё-таки открыл приложение. Во всяком случае, мне это показалось более вероятным, чем подобная настройка почтового клиента в корпоративной среде. С другой стороны, медицинские учреждения часто не придают должного значения ИБ.
Только с утра прочитал статью, как в этот же день пришлось столкнуться с описанным троянцем. Правда, админ потерпевшей стороны уверял, что заражение произошло без открытия приложения: У пользователя в Outlook исполнение JavaScript в теле письма было разрешено по умолчанию...
Пожалуйста, Владимир. Приятно видеть, что результат работы интересен и полезен сообществу.
Женившийся гинеколог? Он, соответственно, мужчина.
(Не думал, что это настолько обсуждаемая тема — 492 тыс. ответов).
«Зачем врач-гинеколог женится?»

Information

Rating
Does not participate
Location
Германия
Date of birth
Registered
Activity