Сейчас на форуме: asfa (+6 невидимых)

 eXeL@B —› Вопросы новичков —› Как найти байт, отвечающий за кодировку
Посл.ответ Сообщение

Ранг: 1.2 (гость)
Активность: 0=0
Статус: Участник

Создано: 16 сентября 2013 17:01 · Поправил: strelokhalfer
· Личное сообщение · #1

Привет всем!
Собственно вопрос, есть один японский движок игр, предназначенный для визуальных новелл(KiriKiri).
Вскрывается он легко, все лежит на виду. Но есть одно но, а именно: Заменив в скриптах все шрифты на кириллические игра продолжает использовать японский моноширинный шрифт. Я выяснил, что нужно найти и изменить байт charset и ищется он как то через CreateFontIndirectA в Ollydbg. Но вот дальше я не могу разобраться. Вот ссылка на примерный файл.
Изначально меню на английском, проблем нет. Но как только добавить рядом файл патча patch.xp3 из папки xp3tools пункты меню становятся на русском, но из за кодировки шрифты моноширинны(несмотря на правку в скриптах)
Помогите пожалуйста разобраться с принципом работы!
Видел подобный принцип для CreateFontA, но там все гораздо проще, адрес лежит на виду.



Ранг: 1.2 (гость)
Активность: 0=0
Статус: Участник

Создано: 16 сентября 2013 21:10
· Личное сообщение · #2

Если не ошибаюсь, должен найтись байт 0x80, показывающий японскую кодировку



Ранг: 89.1 (постоянный), 134thx
Активность: 0.060.07
Статус: Участник

Создано: 16 сентября 2013 21:37 · Поправил: LinXP
· Личное сообщение · #3



что не так?
ps: WinXP sp3 Simplix

ps2: а тем у кого проблемы, достаточно один раз подлечить винду вручную или воспользоваться программкой --> Link <--



Ранг: 10.7 (новичок), 2thx
Активность: 0.010
Статус: Участник

Создано: 17 сентября 2013 00:51 · Поправил: ylproduction
· Личное сообщение · #4

старнно, у нас все норм, а у ОПа какие-то проблемы

Win xp sp2




Поиграйся с реестром так:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage]
по умолчанию
"1250"="c_1250.nls"
"1252"="c_1252.nls"

иногда для совместимости кодировки и вообще для уменьшения гемора
делают так

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage]
"1250"="c_1251.nls"
"1252"="c_1251.nls"

проверь эти ветки и если нужно поменяй
изменения вступят после перезагрузки

<-------------------upd--------------------->
Я понял, тебя не устраивает расстояние между буквами



тогда это дело не в кодировке 100%



Ранг: 1.2 (гость)
Активность: 0=0
Статус: Участник

Создано: 17 сентября 2013 09:58 · Поправил: strelokhalfer
· Личное сообщение · #5

Потому что сп2, а не сп3 или выше, плюс кодировки подменены (Я знаю о таком, лечил одну игру уже так, но согласитесь люди не охотно запускают рег файлы. Да и есть шанс что антивирус какой нибудь не даст. Плюс другие программы могут начать кодировку не так распознавать[было уже такое])
Не в них дело, в Zver они уже подменены
И абракилом тут никак не помочь.
ylproduction, а ты русификацию ставил? Проблема именно с кириллицей, английские буквы во всех японских шрифтах нормальной ширины, а русские если и есть, то в основном моноширинны (как иероглифы)
Хотя я не тестировал на русской локали(На семерке только), а на японской, можно попробовать. Но если и прокатит, то только для XP, а нужно и для висты и для семерки.




Ранг: 1.2 (гость)
Активность: 0=0
Статус: Участник

Создано: 17 сентября 2013 11:42 · Поправил: strelokhalfer
· Личное сообщение · #6

ylproduction пишет:
<-------------------upd--------------------->
Я понял, тебя не устраивает расстояние между буквами
тогда это дело не в кодировке 100%

Именно в кодировке. Кодировка по дефолту ВСЕГДА японская. Расстояние между буквами можно менять в движке, но оно как видно на нуле.(Можно убедиться разобрав под японской локалью(ибо кракозябли вылезут) data.xp3 с помощью craas[файл защищен, поэтому xp3-extract.exe не распакует, что то с заголовком файла]{у меня этот файл есть в патче и уже распакованный в папке patch} и найдя строку ;defaultPitch = 0; в файле.)
Собственно, сравнивая два exe файла от одной игры(патченый и нет) я нашел нужный байт.
В хекс редакторе ищем байты
Code:
  1. C6 43 17
и меняем идущий за ним 80(SHIFTJIS_CHARSET байт) на CC(RUSSIAN_CHARSET) или 00 (ANSI_CHARSET) или 01(DEFAULT_CHARSET)
Тогда в русской локали будет все нормально отображаться. Из слов авторов русификации игры, в которой я и нашел методом сравнения искомый байт, благо exe у разных игр идентичны, что байт нашелся с помощью отладчика через createfontindirecta. Вот и решил попросить умельцев, как в будущем найти этот байт в любой другой программе. Погуглив нашел только для createfonta.




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 17 сентября 2013 11:49
· Личное сообщение · #7

strelokhalfer как-как? головой.

http://vsokovikov.narod.ru/New_MSDN_API/Fonts_text/fn_createfontindirect.htm

Указатель на структуру LOGFONT:

http://vsokovikov.narod.ru/New_MSDN_API/Fonts_text/str_logfont.htm

Code:
  1. typedef struct tagLOGFONT { 
  2. ...
  3.   BYTE lfCharSet;
  4. ...
  5. } LOGFONT, *PLOGFONT;


lfCharSet
Устанавливает набор символов. Нижеследующие значения предопределены.

Просто найти где это значение заносится в структуру перед вызовом данной функции.

-----
[nice coder and reverser]




Ранг: 1.2 (гость)
Активность: 0=0
Статус: Участник

Создано: 17 сентября 2013 12:01 · Поправил: strelokhalfer
· Личное сообщение · #8

Hellspawn, собственно я и не могу понять как.
В отладчиках не силен совсем.




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 17 сентября 2013 12:04
· Личное сообщение · #9

strelokhalfer тогда никак читать и пробовать, только так.

-----
[nice coder and reverser]




Ранг: 1.2 (гость)
Активность: 0=0
Статус: Участник

Создано: 17 сентября 2013 12:30
· Личное сообщение · #10

Попробую)



Ранг: 1.2 (гость)
Активность: 0=0
Статус: Участник

Создано: 07 декабря 2013 23:05 · Поправил: wower
· Личное сообщение · #11

Дабы не создавать новую тему пишу здесь.
Как я понял, байт храниться по адресу EAX+17
То есть перед вызовом функции createfontindirect
нужно где то прописать
Code:
  1. MOV BYTE PTR DS:[EAX+17],0CC

но Олька умеет только заменять, подскажите как можно ее вставить?
Каждый раз менять в Ольке вручную не вариант)



Ранг: 0.2 (гость)
Активность: 0=0
Статус: Участник

Создано: 08 декабря 2013 00:59
· Личное сообщение · #12

wower, просто поправь любым хекс редактором.



Ранг: 6.0 (гость), 2thx
Активность: 0.010
Статус: Участник

Создано: 08 декабря 2013 01:27
· Личное сообщение · #13

Вот пропатчил на досуге




Ранг: 6.0 (гость), 2thx
Активность: 0.010
Статус: Участник

Создано: 08 декабря 2013 01:28
· Личное сообщение · #14

Бле аттач не прицепился, вот http://rghost.ru/50776614



Ранг: 1.2 (гость)
Активность: 0=0
Статус: Участник

Создано: 08 декабря 2013 09:34 · Поправил: wower
· Личное сообщение · #15

Так, не, с кирикири я разобрался, но есть еще один движок, которому требуется лечение)
dtx12, раз уж знаю про ольку, знаю и про хекс)



Ранг: 6.0 (гость), 2thx
Активность: 0.010
Статус: Участник

Создано: 08 декабря 2013 13:25
· Личное сообщение · #16

Делаешь JMP на свободную область (в конце секции к примеру) и там дописываешь патч, опотом из патча JMP обратно



Ранг: 1.2 (гость)
Активность: 0=0
Статус: Участник

Создано: 08 декабря 2013 18:38 · Поправил: wower
· Личное сообщение · #17

JKornev пишет:
Делаешь JMP на свободную область

Так я делал, я не могу найти место, с которого она джампает на call gdi32.createблаблабла
Может заскриншотишь?


UPD
Попробую заменит call на джамп и в патче его вызвать, затем вернуться


UPD 2
На ольке 2 не получается сохранить добавленный код, только замененный, попробую через первую сделать.



Ранг: 0.2 (гость)
Активность: 0=0
Статус: Участник

Создано: 18 декабря 2013 04:07
· Личное сообщение · #18

У меня пропатчить вроде бы получилось, но после этого программа не запускается:



В интернете по этому поводу ничего нет.


 eXeL@B —› Вопросы новичков —› Как найти байт, отвечающий за кодировку
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати