Добрый день. Есть утилита pbucon.exe, входящая в комплект многих программ для удаленного администрирования игровых серверов (в частности, COD4). Она позволяет получать/отсылать сообщения внутриигрового чата, не заходя в игру. Есть проблема с кириллицей. Отсылает корректно, получает - кракозябры. Есть подозрение, что это можно пофиксить правкой небольшого куска кода. Но лично мне это не под силу. Интересно мнение специалистов (и любителей) исследования программ.
Сервера и клиента игры/pbucon или ? И как это можно сделать? PS Нужно для автоматического пресечения оскорблений, матов и т.п.
pbucon - консольное приложение. Не совсем понятно, почему отсылает корректно, если поддержки кириллицы не предусмотрено...
Вот что выдает хелп по pbucon: PBUCON Help ini=[ini filename] (@ command line only) server=[server address:port] myaddr=[my address:port] login=[username] password=[password] pbuconwrite [filename] (writes ini file) pbuconlog [log filename] pbucondebug (to toggle debug mode) pbuconexit (to exit console) PBUCON - PunkBuster UDP Console Applet v0.983 (C) Copyright 2006 by Even Balance, Inc. All Rights Reserved.
И еще, если отсылать кириллицу через pbucon напрямую, то получаются тоже кракозябры. Если через CoD RconTool - корректно...
Вот для теста pbucon.ini: Код (Text): server=95.31.8.165:28960 myaddr=178.123.***.***:28880 login=codrt-178.123.***.***-28880 password=codrt-178.123.***.***-28880 95.31.8.165:28960 - адрес:порт сервера COD4 (=ForceMajor=) 28880 - порт для pbucon (может быть другим, но должен отличаться от 28960) Вместо 178.123.***.*** подставляете свой IP
По совету отсюда написал программу, считывающую с помощью pipe output pbucon'a. Результат - символ с кодом 250 ("ъ") для любого символа кириллицы, с латиницей все в порядке. Т.е. настройки кодовых страниц в ОС роли не влияют на результат, искажение происходит раньше. Куда дальше копать? Дизассемблировать pbucon и смотреть, что он со строками делает, или перехватывать то, что ему от импортированных из wsock32.dll функций приходит? И то, и другое для меня пока из области фантастики...
Сделал еще шаг. Написал dll для перехвата функции recvfrom из wsock32.dll, через которую pbucon получает данные. В результате убедился, что pbucon не портит кириллицу. Он получает ее уже "мертвой" - FAh (250) для любого символа кириллицы. Т.е. на данном этапе кириллица восстановлению уже не подлежит. Однако анализ пакетов UDP при помощи iptools.exe v1.98.0.8 показывает, что из сети приходят одинаковые пакеты для одинаковых сообщений и разные - для разных, в т.ч и для разных сообщений одинаковой длины. Т.е. если я напишу непосредственно в игре "абвг" и "абвд", то придут разные пакеты, если же напишу еще раз "абвг", то придет точно такой же пакет, как и первый. Т.е. где-то между моей сетевой картой и wsock32.dll происходит "порча" кириллицы. Как выяснить, где именно? P.S. По результатам дизассемблирования recvfrom из wsock32.dll по сути является переходником к WSARecvFrom из ws2_32.dll. Но ее анализ для меня пока слишком сложен. Напомню, я не программист...
Сужаю вопрос. Сейчас ситуация такая: <Исследуемая программа> --- recvfrom ---> wsock32.dll --- WSARecvFrom ---> ws2_32.dll --- ? Кто-нибудь может объяснить, откуда WSARecvFrom берет данные?
Двойка вам по логике. Если бы все перекодировалось в один код, то была бы одна "кракозябра", а не разные? Ваша ссылка на CoD RconTool 11.3.1 тоже неправомерна, т.к. я видел в Интернете сообщения, что не всегда работает там кириллица. Возможно дело в серевере, через который это все проходит. Вы даже не нарисовали схему движения пакетов, а ждете ответа... Пока проблемы нет, есть только желание. Раз CoD RconTool работает - спросите разработчиков, они вам быстрее помогут.
Просто в проге pbucon фильтр стоит: Код (Text): .text:00402270 loc_402270: .text:00402270 mov al, [ecx] .text:00402272 cmp al, 0Dh .text:00402274 jz short loc_402285 .text:00402276 cmp al, 0Ah .text:00402278 jz short loc_402285 .text:0040227A cmp al, 20h .text:0040227C jb short loc_402282 .text:0040227E cmp al, 7Fh .text:00402280 jbe short loc_402285 .text:00402282 .text:00402282 loc_402282: .text:00402282 mov byte ptr [ecx], 0FAh .text:00402285 .text:00402285 loc_402285: .text:00402285 mov al, [ecx+1] .text:00402288 inc ecx .text:00402289 test al, al .text:0040228B jnz short loc_402270 Нужно байтик FAh заменить на FFh (буква "я" скушается) или занопить.
T800, спасибо, но тут ответили/намекнули таки раньше. Правда, пришлось нопить еще. И еще решить проблему - 1 байт FA нужен был (что-то вроде метки, указывающей начало сообщения), пришлось писать dll, через которую ловлю WriteFile и исправляю ее буфер.
Нифига там нопить не надо. Надо вот это .text:00402280 jbe short loc_402285 заменить на это .text:00402280 jmp short loc_402285 Кирилица портиться не будет, управляющие коды (<20h) останутся.