Четверг, 25.04.2024, 14:08 Приветствую Вас Гость | Регистрация | Вход |
Information Information Information Information
| Новые сообщения | Участники | Поиск |







  • Страница 1 из 2
  • 1
  • 2
  • »
Форум » Игра | Game » Информация COD2 » Как чинить баг от которого слетает сервер (Attemted to override string in call to Va())
Как чинить баг от которого слетает сервер
NBAH79RUSДата: Понедельник, 05.07.2010, 00:53 | Сообщение # 1
Группа: Администраторы
Статус: Offline
Неофициальный патч, работающий на решение проблемы бага
- Attempted to overrun string in call to va()

Эта проблема случается когда игра пытается создать строку более 1024 символов используя функцию va(), это функция, которая использует функцию sprintf() и возвращает указатель на статический буффер.
Похоже проблема вызвана слишком длинными именами карт, которые переполняют строку информации, содержащую имена и контрольные суммы игровых карт. Но и может быть вызвана некоторыми атакующими (не подтверждено).
Смысл уменьшать строку с 32000 байт до 1024 байт никому не известен. Решением проблемы является отмена вызова Com_Error, который выключает сервер и установка длинны в ноль. Это наилучший выбор чтобы пресечь попытки "погасить сервер", и заодно решается проблема с ротациями карт.
Проблема обсуждается на http://www.iwnation.com/Forums/index.php?showtopic=24161

Windows:

BYTES_ORIGINAL
C6 ?? FF 03 00 00 00 ; mov byte[esi+000003FF], 00
7C 07 ; jl 0044A9EB
3D 00 04 00 00 ; cmp eax, 00000400
7C 0F ; jl 0044A9FA
68 ?? ?? ?? ?? ; push 005AAE70
6A 01 ; push 001
E8 ?? ?? FE FF ; call 004324C0
83 C4 08 ; add esp, 008

BYTES_PATCH
?? ?? ?? ?? ?? ?? ??
?? ??
?? ?? ?? ?? ??
?? ??
33 C0 ; xor eax, eax
90 90 90 90 90
90 90 90 90 90
90 90 90

Linux:

BYTES_ORIGINAL ; 1.0a
c7 44 24 04 20 87 14 08 ; mov DWORD PTR [esp+4],0x08148720
c7 04 24 01 00 00 00 ; mov DWORD PTR [esp],0x1
e8 ?? ?? ?? ?? ; call 8061124

BYTES_PATCH
c7 45 f4 00 00 00 00 ; mov DWORD PTR [ebp-12],0x0
31 c0 ; xor eax,eax
90 90 90 90 90 90 90
90 90 90 90

BYTES_ORIGINAL ; 1.0
c7 44 24 04 80 43 14 08 ; mov DWORD PTR [esp+4],0x08144380
c7 04 24 01 00 00 00 ; mov DWORD PTR [esp],0x1
e8 ?? ?? ?? ?? ; call 8061124

BYTES_PATCH
c7 45 f4 00 00 00 00 ; mov DWORD PTR [ebp-12],0x0
31 c0 ; xor eax,eax
90 90 90 90 90 90 90
90 90 90 90

BYTES_ORIGINAL
c7 44 24 04 80 f8 14 08 ; mov DWORD PTR [esp+4],0x814f880
c7 04 24 01 00 00 00 ; mov DWORD PTR [esp],0x1
e8 cb 90 fa ff ; call 8061124

BYTES_PATCH
c7 45 f4 00 00 00 00 ; mov DWORD PTR [ebp-12],0x0
31 c0 ; xor eax,eax
90 90 90 90 90 90 90
90 90 90 90


Будем честными*!

*誠實,在這種情況下,涉及到一個抽象的概念,在特殊情況而定
 
NBAH79RUSДата: Понедельник, 05.07.2010, 01:00 | Сообщение # 2
Группа: Администраторы
Статус: Offline
http://aluigi.org/patches.htm

Материал взял оттуда, перевел на русский. Там еще есть и к другим играм.


Будем честными*!

*誠實,在這種情況下,涉及到一個抽象的概念,在特殊情況而定
 
DevachkaДата: Вторник, 06.07.2010, 22:00 | Сообщение # 3
Группа: Проверенные
Статус: Offline
Ничего себе имя карты, что строка формируется более 1000 символов...Мне кажется это ближе к контрольным суммам...
Если длина строки сбрасывается на ноль, то сервер мгновенно отключается, так ведь? А сообщения при этом выскакивают?
И вообще может это привязано к АПИфункциям Винды(в линуксе даже понятия не имею), игра ведь написана и скомпилированна на СИ???? wink
 
NBAH79RUSДата: Вторник, 06.07.2010, 23:59 | Сообщение # 4
Группа: Администраторы
Статус: Offline
Ну наврядли функции работы с текстом будут использовать из dll системы. Скорее всего они скомпонованы внутри exe'шника. Другое дело когда строки передаются в виде параметров извне, или наоборот во вне. Разное ограничение длин может так работать.

На скока я понял, длинна не одного названия карты, а либо весь список ротации длинноват, либо гдето накапливается длинна, т.е. раз за ротацию к строке прибавляется буковка и остается. через 1000 раз строка уже будет иметь 1000букв, а потом случится переполнение.

При работе с сокетами (winsock) вообще длинна пакетов толком не ясна, ну и прежде чем чтото по сети посылать 10 раз всё проверяется, и результат отсылки тоже. Дело в том что многие программы общаются внутри компа какбудто по сети через адрес 127.0.0.1 и используют для этого сокеты виндовса. Ну и все связанные с ними ошибки могут проскакивать. Почему это так сложно делается - потомучто каждая программа имеет свой диапазон памяти, (следствия борьбы с вирусами) и обратиться напрямую к соседней программе методом вызова функции не может, т.к. в процессоре сработает прерывание недопустимого адреса ячейки памяти. А обращение через виндовс функции (winsock) это вполне нормально, потомучто виндовс находится в более высоком ранге, чем рядовая программа.
Так устроен виндовс и процессоры сделаны под него, чтобы получить многозадачность, в каждой программе есть некая заранее регистрируемая функция, которая принимает сообщения от виндовса, и получается, что не функуия обращается к виндовсу, а виндовс к функции. Таким образом главным является виндовс. Я к чему всё это пишу, что когда был квейк виндовс был другой. Т.е. подобные ошибки скорее результат эволюции чем просчет. Таким образом стареют и исчезают из пользования многие пограммы...

Загрузил? Всегда рад biggrin


Будем честными*!

*誠實,在這種情況下,涉及到一個抽象的概念,在特殊情況而定
 
DevachkaДата: Среда, 07.07.2010, 00:42 | Сообщение # 5
Группа: Проверенные
Статус: Offline
дА ЭТО СКОРЕЕ ЭВОЛЮЦИЯ, А ЗА СОКЕТЫ ТОЛЬКО ОТ ТЕБЯ ПЕРВЫЙ РАЗ УСЛЫШАЛА biggrin За ячейки памяти и приоритет процессов я и не думала, кстати у меня не получается создавать сервер на компе с меню из-за того,что что-то намудрила с службами системы, дурачилась, кое что отключила, вот теперь расплачиваюсь, систему перестанавливать лень. судя из кода патча получается это по сути заплатка, при этом ничто не страдает? Я имею ввиду процедура проверки совпадения контрольных сумм... Может этот участок кода в экзешнике оставлен самими разработчиками для внесения изменений на будующее...хотя навряд ли, когда ее делали еще наверняка не знали о предстоящем успехе шутера и необычайном его долгожительстве smile О том что ротации на серверах будут столь длинными и карт будет написано не одна тысяча под нее...Кстати подобных обвалов сервака не было из-за твоего австрийского замка, насколько мне помниться там название вполне претендует на переполнение строки? biggrin biggrin wink
 
NBAH79RUSДата: Среда, 07.07.2010, 11:20 | Сообщение # 6
Группа: Администраторы
Статус: Offline
Quote (Devachka)
при этом ничто не страдает?

Я тоже подумал об этом, ну это просто надо пробовать - если после патча обнаружатся другие глюки то страдает ,а если заработает "как по маслу" значит помогло. Я так понимаю при переполнении строки информация записывается поверх чегото кудато не туда. И система безопасности создает прерывание Com_Error. В каких случаях оно еще будет вызвано - неизвестно... Может при попытке взлома хоста, при проникновении вируса ,или при DoS атаке через winsock... По-любому чинится не ошибка, а отключается реакция системы на ошибку. Всеже лучше чем ничего.


Будем честными*!

*誠實,在這種情況下,涉及到一個抽象的概念,在特殊情況而定
 
DevachkaДата: Среда, 07.07.2010, 12:53 | Сообщение # 7
Группа: Проверенные
Статус: Offline
По сути если все это разложить по полкам, в формировании строки виновата процедура Си(шная), потому как все сейчас под Винду на Си, именно она резервирует в оперативке область для его временного хранения, соответственно перед подачей кода на конвейеры процессора...Так идем далее ...если этот участок кода в экзешнике, то оперировать из инета им практически невозможно, почему? Да потому что здесь нет запросов в изменеии кода и всякой белиберды тип да, нет или, то есть возможности управления дальнейшим исполнением программы(например просьба ввести пароль), она попросту линейная, трояны и вирусы даже самые изощренные (написанные на ассемблере)отпадают тоже... получается просто ошибки при написании первоначального кода biggrin
И нужно иметь ввиду, что первоначально игра писалась под одни протоколы тырнета, тисипи вроде бы не поменялся, однако сети за последние годы пичкаются огромным количеством утилит компрессии, всяческого улучшения передачи данных, модемы наши имеют подсистемы, за роутеры и сервера ващще молчу...Короче все весьма замудрено и думаю реакции систем(операционных) на
контакт с кучей всех этих прибамбасов могут быть какими угодно...Радует одно, что есть люди которые способны это поправить smile

А ДОСатака вполне реальна...я правда в этом ни бум...бум, но слыхала о подобном, что валят сервера на нет, испытывала на своей шкуре...В том году ДОСили хохлятские сервера по кардшарингу(раздача ключей пиратских на спутниковое тв)...Инициатором была компания НТВ, неделю толком не могли НТВ+ смотреть. Админ только сервер восстановит, пару часов и вновь обвал, кошмар одним словом

Сообщение отредактировал Devachka - Среда, 07.07.2010, 13:00
 
NBAH79RUSДата: Среда, 07.07.2010, 13:12 | Сообщение # 8
Группа: Администраторы
Статус: Offline
Quote (Devachka)
потому как все сейчас под Винду на Си

Не факт, писал и на паскале, и прямо на ассемблере (куски оптимизировал). После компиляции нет разницы на чем функция была когдато написана. Есть декларация обьявления переменных, например stdcall и всё... С этим ключом компилятора и в паскале получится всё "правильно" и на ассемблере тоже. И работать они могут все совместно, одна функция была на паскале, другая на си, пиши не чем удобно.

Quote (Devachka)
Да потому что здесь нет запросов в изменеии кода и всякой белиберды тип да, нет или, то есть возможности управления дальнейшим исполнением программы

Да, вот расскажу что такое DoS атака: есть у тебя строка букв 1000 символов, например "asdfghjkl...qwerty" и заканчиывается она нулем. А пришел пакет winsock 1200 символов. И попытался записаться поверх. Начало записалось, а хвост не влез. Сработал Com_Error. А теперь, если Com_Error выключен, куда запишется хвост? Кудато дальше поверх чегото. Может и поверх исполняемой программы? Таким образом туда можно вписать вирус. Это и есть DoS атака фактически.

Quote (Devachka)
Радует одно, что есть люди которые способны это поправить

А вот это какраз и выяснится позднее - патчь это или дыра для атаки, замаскированая под патч...


Будем честными*!

*誠實,在這種情況下,涉及到一個抽象的概念,在特殊情況而定
 
DevachkaДата: Среда, 07.07.2010, 19:13 | Сообщение # 9
Группа: Проверенные
Статус: Offline
Си я взяла для примера, конечно одну и ту же программу можно написать на любом языке, да и функции в более сложных языках по сути идут от ассемблерра, все зависит от компилятора, в 2002 году мне очень нравился компилятор от фирмы "Борленд", если не ошибаюсь эти продукты работали и с Си+, Паскалем, Делфи (естественно под каждый язык-свой)...нравился тем, что компилированые файлы получались маленькими, в вижуал Си от майкрософт файлы были больше, хотя система (Винда 98)их лучше принимала...то же самое на Вижуал Бейсик получалось до неприличия огромным biggrin

По поводу хвоста который окажется в стеках оперативки-это довольно серьезно, хотя мне кажется там он и потеряется попросту ненужным кодом, отследить дальнейшую судьбу невозможно ввиду того,что эти крохи информации обработаются в чрезвычайно маленький промежуток времени biggrin Да и для вируса серьезного маловато места будет, хотя все может быть, потому посмотрим чем это кончиться, думаю проблему разгребешь Иван, мы все мысленно с тобой wink

 
NBAH79RUSДата: Среда, 07.07.2010, 20:24 | Сообщение # 10
Группа: Администраторы
Статус: Offline
Quote (Devachka)
думаю проблему разгребешь Иван

да не smile
мне то зачем - это если сервак дома стоит и постоянно падает - тогда смысл был бы. А щас екзешник на хосте - у нас нет к нему доступа даже. Я просто как инфу вписал - может ктонить задолбался с этой проблемой...


Будем честными*!

*誠實,在這種情況下,涉及到一個抽象的概念,在特殊情況而定
 
DevachkaДата: Среда, 07.07.2010, 20:48 | Сообщение # 11
Группа: Проверенные
Статус: Offline
В принципе дома сервак держать незачем, лучше заплатить и пусть на хосте будет smile
Но инфа очень интересная...
 
DRAKДата: Четверг, 08.07.2010, 02:00 | Сообщение # 12
Группа: Администраторы
Статус: Offline
встретились два одиночества!!! Шуткую!! Но прикольно почитать хотя и не понятно ни чаво

 
Koljan(45rus)Дата: Четверг, 08.07.2010, 04:25 | Сообщение # 13
Группа: Администраторы
Статус: Offline
я тоже все прочел и офигел wacko

 
NBAH79RUSДата: Четверг, 08.07.2010, 11:51 | Сообщение # 14
Группа: Администраторы
Статус: Offline
Ну нет смысла развернуто всё писать - букв не хватит... Да и получится непонятно, в кашу, и кто как понял.
Если интересно почитайте ченить по программированию на С++, например:
1. "БИБЛИОТЕКА ПРОГРАММИСТА" Джефф Элджер там про с++ и работу с памятью
2. "АЗБУКА ПРОГРАММИРОВАНИЯ В WIN32 API" Румянцев П.В. там очень коротко как под виндовс адаптировать программы
3. про COM, Winsock и обработку ошибок можно найти потсковиком - это мелкие темы...


Будем честными*!

*誠實,在這種情況下,涉及到一個抽象的概念,在特殊情況而定
 
DevachkaДата: Четверг, 08.07.2010, 12:42 | Сообщение # 15
Группа: Проверенные
Статус: Offline
А еще могу добавить:

прикольная книга Питерского издания "Ассемблер" 2002 года выпуска(там очень понятно про операции с плавающей точкой),
кстати книга Элджера про Си идет с программным обеспечением и в ней от главы к главе своими руками создаешь программы, начиная от элементарных операндов, потом функции, из функций библиотеки и т.д. и т.п. ночами можно сидеть до того интерестно...
И есть неплохая книга по "Вижуал Си" она так и называется, богатая иллюстрациями на 400 страниц(типа пособия по сборке конструктора) больше ничего за нее не могу сказать, а еще обложка красная, утонула она у меня sad

Пока вспомнила, Иван однажды написала програмульку для расчетов по чеку(там вводишь разные расценки, часы, расценки под часы), небольшая на С+ написана, ради прикола одну функцию на ассемблере...С этой функцией продолбалась больше чем со всей программой, еле скомпилировала, но получилось очень даже ничего biggrin

Сообщение отредактировал Devachka - Четверг, 08.07.2010, 12:54
 
Форум » Игра | Game » Информация COD2 » Как чинить баг от которого слетает сервер (Attemted to override string in call to Va())
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Правила форума:
Темы раздела "Игра" создаются только администрацией форума.
Темы и сообщения раздела "Предложения и пожелания" удаляются по исчерпании актуальности.
Темы и сообщения раздела "Курилка" старше полугода удаляются как флуд.


Сегодня форум посетили:
БАННЕРНОЕ ПОЛЕ:
Сервер РОССИЯ, все для COD2 Cod2 Serv CCCP [LEGION] FX|StarperS Мониторинг серверов
Наш баннер
Создать бесплатный сайт с uCoz