русифицировать программу

Тема в разделе "WASM.RESEARCH", создана пользователем aspirant, 28 ноя 2006.

  1. aspirant

    aspirant New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2006
    Сообщения:
    22
    Блестяще! Все работает! Забил 6 нопов и никаких ошибок. Большое спасибо, crypto.

    Сейчас возникла еще одна проблема. Русифицированные надписи, не все отображаются корректно: абсолютно весь текст, который написан обычным шрифтом (названия меню, внутренние вкладки и т.д.) можно русифицировать (см. ниже), а вот тот текст, что указан на оборудовании никак перевести не удается (как ни старался - отображается "птичий язык").
    Что касается русификации основного текста, вначале там также отображался "птичий язык", я поменял значения кодовых страниц в реестре:
    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage]
    "1250"="c_1251.nls"
    "1251"="c_1251.nls"
    "1252"="c_1251.nls"

    После этого все стало отображаться нормально, за исключением надписей на оборудовании (может быть они используют другую кодовую страницу?). Скачал программу NTRegmon, она показывает любые обращения к реестру любого процесса. WEWB32.EXE обращался к веткам, где находятся названия шрифтов, искал ключ Tahoma, но его там не оказалось (NTRegmon показал несколько неудачных обращений), тем не менее программа запускается и английский текст корректно отображается. Есть вероятность, что надписи на оборудовании используют отдельный шрифт, отличный от того, что используется для меню, этот шрифт - "MS Sans Serif". В папке с программой лежит файл EWBFNT.FON и он тоже где-то подругжается (это я видел в отладчике), я заменил его на Arial кириллицу, но ничего не произошло (даже очертание букв не изменилось).
    В приложении картинка с изображением оборудования (Function Generator), на ней видно, как вызвать это оборудование (пертащить второй слева квадратик из меню Instruments на рабочее поле и два раза щелкнуть на нем мышкой) и текстовые надписи на нем (Frequency, Duty Cycle, Offset и т.д.).
    Надпись Frequency для этого оборудования (Function Generator) находится в файле ресурсов WEWBMSG.RES по смещению 4C5C. Как определить и изменить кодовую страницу для надписей на оборудовании?
     
  2. afybc

    afybc New Member

    Публикаций:
    0
    Регистрация:
    30 июн 2006
    Сообщения:
    73
    Да, но видать где-то пропустил jnz =\
     
  3. aspirant

    aspirant New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2006
    Сообщения:
    22
    Странно, но когда я подправил сам файл WEWB32.EXE WinHex'ом, программа стала выдавать туже ошибку, что и вначале «No env file message located». До этого я запускал в отладчике и заменил нопами 6 байт по адресу 0051E5D5 и все запускалось без ошибок. Может быть проверка этого файла идет периодически на протяжении работы всей программы?
    А если этот алгоритм настолько прост (для Вас), может быть его можно исправить так, чтобы он просто выдавал для всех файлов одно и тоже значение и оно всегда считалось правильным. Тогда из какого бы участка программы мы не обращались (а не только из 0051E5D5), всегда программа будет запускаться без ошибок. Или это мои иллюзии? :)
     
  4. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    aspirant
    Файл wewb.res (как я понимаю, он и задает подобные шрифты) содержит 3 релевантных ресурса: ewbd.fnt, ewb.fnt, std.fnt. Как они выглядят - хз. Но у меня возникла хулиганская идея - ежели затереть имена этих ресурсов в wewb.res и создать эти ресурса в той же директории, то есть надежда, что это заработает (т.е., если нет ресурса в ресурсном файле, то система может искать его отдельно по имени). Плохо, что формат ресурса шрифтов пока неясен...
     
  5. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    aspirant
    Да легко наверное, но не сегодня...
     
  6. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    aspirant
    Вообще-то sub_51E2C7 только один раз вызывается, как раз там, где nop-ы появились...
     
  7. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    aspirant
    Все-таки видимо, где-то сам код программы проверяется...
     
  8. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Последняя идея на сегодня: может быть CRC проверяется не только для всего ресурсного файла в целом, но и для каждого отдельного составляющего ресурса?
     
  9. aspirant

    aspirant New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2006
    Сообщения:
    22
    Мне кажется, врядли проверяется сам код программы, т.к. выдавалась бы другая ошибка, а тут все та же, что и при обычном редактировании WEWBMSG.RES. Хотя, конечно же, это мое мнение, которое ничем не подкреплено.
    А по поводу шрифта, я попробую сегодня сделать так, как вы написали, если получится, конечно. :)
     
  10. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    aspirant
    1. Вроде-бы в описаниях ресурсов нет CRC.
    2. Неплохо было бы выяснить, почему исправление под дебуггером привело к успеху, а исправление кода - нет. Для начала пройди это место в исправленном коде под дебугом.
     
  11. aspirant

    aspirant New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2006
    Сообщения:
    22
    Странно, сегодня утром удалил старый EWB, над которым проводил эксперименты и поставил чистый, в нем исправил тот самый jnz на 6 нопов и все прекрасно запускается, причем проверил специально на нескольких машинах. Так что, видимо, вчера я еще помимо этих изменений что-то вносил, вот он и ругался.
    Вначале обсуждения, я писал, что формат файла для меня не сильно важен. Сейчас же, когда начал переводить, получается полная чушь, например, не могу вставить ничего другого вместо надписи "Edit" в основном меню, кроме как "Прав", вместо "Правка" :)
    Посмотрел, как вы и писали, ресурсы, как я понял, файл WEWBMSG.RES - это некий архив, внутри которого располагаются еще несколько файлов, информация о которых находится в самом конце. По той структуре, что вы приводили, нашел начала всех файлов (каждый файл внутри WEWBMSG.RES отделяется от другого знаком "$"), где заканчивается каждый файл в структуре я не нашел (хотя там есть еще одно не понятное небольшое число), поэтому посчитал, что знак "$" является как концом одного файла, так одновременно и началом следующего. Далее я увеличил длину файла на 2 байта (в WinHex'е), чтобы добавить к слову "Прав" еще две недостающих буквы, запустил - программа вылетает с ошибкой "access violation (22903), reading 3A292528", из под отладчика запустить не получилось - он виснет.
    Кстати, в самом начале WEWBMSG.RES находится файл ewb.com, на сколько я понял, этот файл бинарный (обычный *.com), может быть он и отвечает за загрузку остальных (текстовых) файлов в память. Я попробовал вырезать WinHex'ом только его из WEWBMSG.RES, поставил расширение *.com, но он не запустился. Из под отладчика тоже самое.
    Сейчас стоит задача свободного изменения строки внутри WEWBMSG.RES.
    Надпись, которую я редактировал, находится в файле WEWBMSG.RES по смещению 813E. Любая надпись имеет формат "Текст" 0D 0A, если затирается хотя бы одна ковычка или один из спец. символов в конце - программа отображает этот текст квадратиками.
    Направьте, пожалуйста, в нужное русло (или процедуру) :)

    Спасибо.
     
  12. aspirant

    aspirant New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2006
    Сообщения:
    22
    Нашел место, после которого программа зависает:
    Код (Text):
    1. 0054CD40  /$ 55             PUSH EBP
    2. 0054CD41  |. 8BEC           MOV EBP,ESP
    3. 0054CD43  |. 57             PUSH EDI
    4. 0054CD44  |. 8B7D 08        MOV EDI,DWORD PTR SS:[EBP+8]
    5. 0054CD47  |. B9 FFFFFFFF    MOV ECX,-1
    6. 0054CD4C  |. 32C0           XOR AL,AL
    7. 0054CD4E  |. FC             CLD
    8. [b]0054CD4F  |. F2:AE          REPNE SCAS BYTE PTR ES:[EDI][/b]
    9. 0054CD51  |. F7D1           NOT ECX
    10. 0054CD53  |. 8D41 FF        LEA EAX,DWORD PTR DS:[ECX-1]
    11. 0054CD56  |. 5F             POP EDI
    12. 0054CD57  |. 5D             POP EBP
    13. 0054CD58  \. C3             RETN
    После строки 0054CD4F уже не работает.
    В этот кусок попадаем, из:
    Код (Text):
    1. 004787B7  |. E8 84450D00    CALL WEWB32.0054CD40                     ; \WEWB32.0054CD40
    Вот только что делает эта процедура, что после нее идет обращение к несуществующему участку памяти.
     
  13. aspirant

    aspirant New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2006
    Сообщения:
    22
    Пришел к следующему результату: в конце файла WEWBMSG.RES есть авторская надпись "!!!!!KEEP THIS AT THE END OF EWBMSG.TBL -- THIS MEANS ME!!!!!" , которая явно никак к названиям меню не относится, я удалил из файла по смещению этой надписи 2 байта, а по адресу 813E, где расположена надпись «&Прав» добавил два байта и дописал «&Правка», запустил – программа запускается без ошибок и отображает полные названия, которые я указал («Правка»). Таким образом, ей не важно, что и где будет дописано или отредактировано, главное, чтобы в память грузился файл именно этого размера (поддерживался баланс добавления/удаления байтов). В конце WEWBMSG.RES есть еще несколько таких записей и, в принципе, можно все их поудалять и вставить в нужные места необходимые символы, но, что если их не хватит? Там около 100 байт такого мусора.
    Можно ли как-то сделать, чтобы программа грузила любой (нужный мне) размер файла? Может быть в самом WEWBMSG.RES должна быть запись – сколько байт он содержит? Но я этого найти не смог.
     
  14. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    aspirant
    Вот я об этом и писал в самом начале - надо понять структуру ресурсов (тут похоже скоро станет все ясно), написать разборщик, потому что основную часть ресурсов нужно будет оставить, написать сборщик, который по ресурсам скомпилит новый файл WEWBMSG.RES. Это проще и технологичнее, чем искать свободные места (а найти их будет непросто из-за избыточности русского по отношению к английскому).
     
  15. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    aspirant
    sub_0054CD40 = strlen
     
  16. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    aspirant
    Вот структуры, которые тебе помогут написать разборщик и сборщик:
    typedef struct
    {
    WORD ResNum;
    DWORD ResDirOffset;//Resource Directory Offset from start of file
    BYTE Version;//?? must be 2
    BYTE Crc;//XOR of all bytes from start of file to (<) ResDirOffset
    WORD Magic;//Must be 0xAAAA
    } ResFileTrailer;

    Длина структуры 10 байт, она располагается в самом конце файла.
    Начиная со смещения ResDirOffset располагается массив структур (числом ResNum):
    typedef struct
    {
    char ResName[13];//zero padded
    DWORD ResOffset;//Resource offset from start of file
    DWORD ResLength;//Resource Length
    } ResInfo;
    Как ты уже заметил, в конце каждого ресурса следует два байта 0x24,0xA, они НЕ УЧИТЫВАЮТСЯ В ДЛИНЕ РЕСУРСА!

    Строки в ресурсах env.msg и wewb.msg разделены байтами 0xD,0xA, наверное они ищутся в памяти по номеру с учетом данных разделителей.

    Написать разборщик и сборщик по этой информации очень легко. Сохрани только порядок следования ресурсов на всякий случай. Я думаю, тебе этого будет достаточно. Чтобы разобраться со шрифтами, слей мне соответствующий файлик после разборки...
     
  17. aspirant

    aspirant New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2006
    Сообщения:
    22
    Большое спасибо за помощь, crypto.

    Попробую разобраться со всем, что вы написали. 8-)

    В Интернете нашел дизассемблер "IDA Pro 4.5" и теперь использую его, т.к. в отладчике OllyDbg довольно сложно ориентироваться (нет названий процедур, да и слишком все динамично). Так вот, в IDA отобразилось множество функций, используемых в этой программе (их около 200), я посмотрел их названия и увидел несколько, в имени которых есть слово "Font". Я понимаю, что это Windows API и сейчас пытаюсь найти тот момент, когда подгружается шрифт для надписей на оборудовании (сейчас он отображается "птичьим языком"). Посмотрим, что из этого получится.
    Что касается ресурсов, еще раз спасибо, за структуры, попытаюсь все сделать на грамотном уровне :) В WEWBMSG.RES я нашел места, где задается размер кнопок (длина, ширина) и раположение их на оборудовании, так что проблема сейчас только в отлове шрифта.
    Как приду к каким-либо результатам обязательно напишу.
     
  18. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    aspirant
    Удачи!...
     
  19. aspirant

    aspirant New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2006
    Сообщения:
    22
    Уважаемый, crypto, полностью разобрался с этими ресурсами, по данному вами описанию структур. Сборщик/разборщик написать попытался – ничего не получилось, мне надо долго с этим разбираться – не программист я :), да и сделав все вручную, понял, что работы там не так уж и много. Добился самого главного – теперь могу растягивать этот файл (WEWBMSG.RES) как угодно и надписи могу вставлять также любого размера, программа обрабатывает без ошибок любой нужный мне файл.
    Осталась единственная проблема со шрифтом на оборудовании. Вытащил из файла WEWB.RES шрифты ewbd.fnt, ewb.fnt, std.fnt (в приложении), но стандартно открыть их не получилось. Сравнил их содержимое с EWBFNT.FON, который находится в папке с EWB и понял, что это не шрифты, а какие-то бинарные файлы (но начинка очень похожа на шрифт), т.к. EWBFNT.FON имеет начальную сигнатуру MZ, как обычный выполняемый файл. Поискал в Интернет информацию о *.fnt, пишут, что это шрифт, который подгружается в ходе выполнения программы и что можно как-то преобразовать его в *.fon, но ничего конкретного нет, одни только описания. Нашел программу “Raster Font Editor”, но она отказалась читать вытащенные мной файлы, хотя тот *.fnt, что шел с ней в комплекте читает и преобразует без проблем.
    Подскажите, как быть в этой ситуации с *.fnt и *.fon и как определить шрифт, используемый на оборудовании?
    Программа для создания и редактирования *.fnt Raster Font Editor: http://www.cylog.org/files/rfe009b.zip (450 Кб)
     
  20. aspirant

    aspirant New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2006
    Сообщения:
    22
    Шрифты...