"Обучение" кириллице

Тема в разделе "WASM.RESEARCH", создана пользователем Yuri4850, 8 фев 2010.

  1. Yuri4850

    Yuri4850 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2010
    Сообщения:
    19
    Добрый день.

    Есть утилита pbucon.exe, входящая в комплект многих программ для удаленного администрирования игровых серверов (в частности, COD4).
    Она позволяет получать/отсылать сообщения внутриигрового чата, не заходя в игру.

    Есть проблема с кириллицей. Отсылает корректно, получает - кракозябры. Есть подозрение, что это можно пофиксить правкой небольшого куска кода. Но лично мне это не под силу.

    Интересно мнение специалистов (и любителей) исследования программ.
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    нужно определить кодировки сервера и клиента.
     
  3. Yuri4850

    Yuri4850 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2010
    Сообщения:
    19
  4. Yuri4850

    Yuri4850 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2010
    Сообщения:
    19
    Сервера и клиента игры/pbucon или ?
    И как это можно сделать?

    PS Нужно для автоматического пресечения оскорблений, матов и т.п.
     
  5. Yuri4850

    Yuri4850 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2010
    Сообщения:
    19
    pbucon - консольное приложение. Не совсем понятно, почему отсылает корректно, если поддержки кириллицы не предусмотрено...
     
  6. Yuri4850

    Yuri4850 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2010
    Сообщения:
    19
    Вот что выдает хелп по 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.
     
  7. Yuri4850

    Yuri4850 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2010
    Сообщения:
    19
  8. Yuri4850

    Yuri4850 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2010
    Сообщения:
    19
    n0name, расскажи все-таки о кодировках.
     
  9. Yuri4850

    Yuri4850 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2010
    Сообщения:
    19
    Сервер работает под *nix'ом на виртуальной машине.
     
  10. Yuri4850

    Yuri4850 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2010
    Сообщения:
    19
    И еще, если отсылать кириллицу через pbucon напрямую, то получаются тоже кракозябры. Если через CoD RconTool - корректно...
     
  11. Yuri4850

    Yuri4850 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2010
    Сообщения:
    19
    Вот для теста pbucon.ini:

    Код (Text):
    1. server=95.31.8.165:28960
    2. myaddr=178.123.***.***:28880
    3. login=codrt-178.123.***.***-28880
    4. password=codrt-178.123.***.***-28880
    95.31.8.165:28960 - адрес:порт сервера COD4 (=ForceMajor=)
    28880 - порт для pbucon (может быть другим, но должен отличаться от 28960)
    Вместо 178.123.***.*** подставляете свой IP
     
  12. Yuri4850

    Yuri4850 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2010
    Сообщения:
    19
    Никто не знает?
     
  13. Yuri4850

    Yuri4850 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2010
    Сообщения:
    19
    По совету отсюда написал программу, считывающую с помощью pipe output pbucon'a. Результат - символ с кодом 250 ("ъ") для любого символа кириллицы, с латиницей все в порядке. Т.е. настройки кодовых страниц в ОС роли не влияют на результат, искажение происходит раньше. Куда дальше копать? Дизассемблировать pbucon и смотреть, что он со строками делает, или перехватывать то, что ему от импортированных из wsock32.dll функций приходит? И то, и другое для меня пока из области фантастики...
     
  14. Yuri4850

    Yuri4850 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2010
    Сообщения:
    19
    Сделал еще шаг. Написал 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. Но ее анализ для меня пока слишком сложен. Напомню, я не программист...
     
  15. Yuri4850

    Yuri4850 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2010
    Сообщения:
    19
    Сужаю вопрос.

    Сейчас ситуация такая:
    <Исследуемая программа> --- recvfrom ---> wsock32.dll --- WSARecvFrom ---> ws2_32.dll --- ?
    Кто-нибудь может объяснить, откуда WSARecvFrom берет данные?
     
  16. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Двойка вам по логике. Если бы все перекодировалось в один код, то была бы одна "кракозябра", а не разные? Ваша ссылка на CoD RconTool 11.3.1 тоже неправомерна, т.к. я видел в Интернете сообщения, что не всегда работает там кириллица. Возможно дело в серевере, через который это все проходит. Вы даже не нарисовали схему движения пакетов, а ждете ответа... Пока проблемы нет, есть только желание.
    Раз CoD RconTool работает - спросите разработчиков, они вам быстрее помогут.
     
  17. T800

    T800 Member

    Публикаций:
    0
    Регистрация:
    7 дек 2006
    Сообщения:
    293
    Адрес:
    Moscow
    Просто в проге pbucon фильтр стоит:
    Код (Text):
    1. .text:00402270 loc_402270:      
    2. .text:00402270                 mov     al, [ecx]
    3. .text:00402272                 cmp     al, 0Dh
    4. .text:00402274                 jz      short loc_402285
    5. .text:00402276                 cmp     al, 0Ah
    6. .text:00402278                 jz      short loc_402285
    7. .text:0040227A                 cmp     al, 20h
    8. .text:0040227C                 jb      short loc_402282
    9. .text:0040227E                 cmp     al, 7Fh
    10. .text:00402280                 jbe     short loc_402285
    11. .text:00402282
    12. .text:00402282 loc_402282:              
    13. .text:00402282                 mov     byte ptr [ecx], 0FAh
    14. .text:00402285
    15. .text:00402285 loc_402285:              
    16. .text:00402285                 mov     al, [ecx+1]
    17. .text:00402288                 inc     ecx
    18. .text:00402289                 test    al, al
    19. .text:0040228B                 jnz     short loc_402270
    Нужно байтик FAh заменить на FFh (буква "я" скушается) или занопить.
     
  18. Yuri4850

    Yuri4850 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2010
    Сообщения:
    19
    T800, спасибо, но тут ответили/намекнули таки раньше. Правда, пришлось нопить еще. И еще решить проблему - 1 байт FA нужен был (что-то вроде метки, указывающей начало сообщения), пришлось писать dll, через которую ловлю WriteFile и исправляю ее буфер.
     
  19. Yuri4850

    Yuri4850 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2010
    Сообщения:
    19
    Всем откликнувшимя спасибо.
    Проблема решена, тему можно закрывать/удалять.
     
  20. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Нифига там нопить не надо.
    Надо вот это
    .text:00402280 jbe short loc_402285
    заменить на это
    .text:00402280 jmp short loc_402285

    Кирилица портиться не будет, управляющие коды (<20h) останутся.