1. Друзья, в это тяжёлое и непонятное для всех нас время мы просим вас воздержаться от любых упоминаний политики на форуме, - этим ситуации не поможешь, а только возникнут ненужные ссоры и обиды. Это касается также шуток и юмора на тему конфликта. Пусть войны будут только виртуальными, а политики решают разногласия дипломатическим путём. С уважением, администрация Old-Games.RU.

    Скрыть объявление
  2. Пожалуйста, внимательно прочитайте правила раздела.
  3. Если Вы видите это сообщение, значит, вы ещё не зарегистрировались на нашем форуме.

    Зарегистрируйтесь, если вы хотите принять участие в обсуждениях. Перед регистрацией примите к сведению:
    1. Не регистрируйтесь с никами типа asdfdadhgd, 354621 и тому подобными, не несущими смысловой нагрузки (ник должен быть читаемым!): такие пользователи будут сразу заблокированы!
    2. Не регистрируйте больше одной учётной записи. Если у вас возникли проблемы при регистрации, то вы можете воспользоваться формой обратной связи внизу страницы.
    3. Регистрируйтесь с реально существующими E-mail адресами, иначе вы не сможете завершить регистрацию.
    4. Обязательно ознакомьтесь с правилами поведения на нашем форуме, чтобы избежать дальнейших конфликтов и непонимания.
    С уважением, администрация форума Old-Games.RU
    Скрыть объявление
    1. Если вы сделали перевод или русификацию игры, то вы можете поделиться своим творением здесь.
    2. О правилах вступления в группу переводчиков можно прочитать здесь.
    3. Русификации следует искать там.

Wing Commander IV: Цена свободы

Тема в разделе "Переводы своими руками", создана пользователем Рыжий Тигра, 8 янв 2007.

  1. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    Процесс перевода игры "Wing Commander IV: Цена свободы"- в разгаре. Желающие опробовать то, что получилось, могут добраться сразу до описания перевода и ссылок на его скачивание, щёлкнув по этой ссылке.

    Желающим посоучаствовать в переводе - рекомендую: полезные для переводчика ссылки - словари, книги, статьи и прочие материалы. Пополнение копилки приветствуется!

    См. также:
    Самая свежая тестовая сборка и инструкции по её установке
    Бета-тестеры, wэлкам!
    31 дек 2016

    Upd 1:
    В связи с участившимися постами здесь "чисто для поржать" - вынужден объясниться.
    6 янв 2014

    Upd 2:
    Приглашаю желающих поучаствовать в переводе. Отозвавшиеся будут увековечены в финальных титрах. (Никаких более материальных благ, к сожалению, обещать не могу. :( )
    27 мая 2014

    Upd 3:
    Наконец удалось пробить барьер несовместимости моего перевода с версией игры от GOG!!! Желающим опробовать - wэлкам!
    2 окт 2014
     
    Последнее редактирование: 21 апр 2017
    kirik-82 нравится это.
  2.  
  3. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    Видео - сомневаюсь, видеосжатие в "Корсаре" явно потерьное. :-( Да и на кой он мне? Предоставленные HCl'ом объектники текстораспаковщика работают, а IFF'ы с переводом я паковать по отдельности не собираюсь - мне проще сжать их все скопом силами того же zlib'а.

    http://samlib.ru/r/ryzhij_tigra/about.shtml (и густо покраснел).
    Нууу... Летмишоую (L). :-) Игра (исходников от неё у меня нет) вызывает функции доступа к файлам. Я их перехватываю:
    • в подключаемой к игре библиотеке dxmci.dll (исходники от неё есть) из DllMain()'а вызываю, к примеру, функцию CreateFile( с безобидными параметрами, чтобы что-ньдь ценное не изгадить), компилирую, ставлю breakpoint (F9), запускаю под отладчиком, делаю шаг внутрь в саму функцию (F11) и там тоже ставлю breakpoint;
    • отпускаю свободно выполняться (F5) и жду, пока игра не напорется на вход в функцию;
    • всплываю по стеку и выясняю, где игра хранит адрес функции.
    Дальше делаю вот такую штуку:
    Код:
    typedef HANDLE ( WINAPI *create_file_t )(
        LPCTSTR lpFileName,                         // file name
        DWORD dwDesiredAccess,                      // access mode
        DWORD dwShareMode,                          // share mode
        LPSECURITY_ATTRIBUTES lpSecurityAttributes, // SD
        DWORD dwCreationDisposition,                // how to create
        DWORD dwFlagsAndAttributes,                 // file attributes
        HANDLE hTemplateFile                        // handle to template file
    );
    
    #define WC4DVD_CREATEFILE_CALL  ( *( (create_file_t  *) 0x004D43FC ) )
    
    HANDLE WINAPI wc4_create_file( LPCTSTR lpFileName,
        DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes,
        DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile ) {
      ...............
    }
    Это typedef типа "указатель на ф-цию с такими-то параметрами сяких-то типов", приведенный к этому типу адрес, в котором лежит собственно адрес функции, и заменяющая её моя функция-перехватчик.
    Дальше просто - в DllMain()'е при DLL_PROCESS_ATTACH проделываю вот такое:
    Код:
      if ( WC4DVD_CREATEFILE_CALL == CreateFileA ) {
        WC4DVD_CREATEFILE_CALL = wc4_create_file;
      }
    - проверяю (чтобы не нахомутать) и подменяю адрес системной функции адресом перехватчика. Вуаля! Могу с перехваченным вызовом делать что хочу: открывать или не открывать файл, возвращать наверх подменённый хэндл, а перехватив ещё и функции SetFilePointer() и ReadFile() - могу подсовывать игре не те данные, которые в .tre-файле лежат, а свои собственные, заранее загруженные из моего собственного файла и терпеливо дожидающиеся в отдельном буфере. И нет игрульке от меня спасенья. :-)))))
    (грустно) Но с выхватыванием функции из-под носа у .exe'шника - просто. А вот из-под носа у .dll'ы - сложно: во-первых, нужно на breakpoint'е дохренища раз всплыть по стеку только для того, чтобы убедиться - не, это опять вызов из .exe'шника, а не из .dll'ы; во-вторых... ещё не знаю что - у меня и на "во-первых" ещё ни разу не хватило терпения. :-(((((((
     
    gudleifr нравится это.
  4. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
    Рыжий Тигра, ты всё же почитай, что я дал. И проблема исчезнет чудесным образом. :)
     
  5. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    Ну да, я этот адрес сюда дублирую почитай каждый месяц. А что?

    (грустно) Не исчезла:
    Код:
    e:\develop\dxmci\mhook-lib\mhook.cpp(54) : error C2065: '_vscprintf' : undeclared identifier
    e:\develop\dxmci\mhook-lib\mhook.cpp(59) : error C2065: 'vsprintf_s' : undeclared identifier
    e:\develop\dxmci\mhook-lib\mhook.cpp(76) : error C2065: '_vscwprintf' : undeclared identifier
    e:\develop\dxmci\mhook-lib\mhook.cpp(81) : error C2065: 'vswprintf_s' : undeclared identifier
    Ну это-то ладно, это какая-то отладочность, "шкурка". А вот в "мясе" -
    Код:
    e:\develop\dxmci\mhook-lib\mhook.cpp(162) : error C2664: 'GetModuleHandleA' : cannot convert parameter 1 from 'unsigned short [9]' to 'const char *'
            Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
    e:\develop\dxmci\mhook-lib\mhook.cpp(163) : error C2664: 'GetModuleHandleA' : cannot convert parameter 1 from 'unsigned short [9]' to 'const char *'
            Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
    e:\develop\dxmci\mhook-lib\mhook.cpp(164) : error C2664: 'GetModuleHandleA' : cannot convert parameter 1 from 'unsigned short [9]' to 'const char *'
            Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
    e:\develop\dxmci\mhook-lib\mhook.cpp(363) : error C2065: 'OpenThread' : undeclared identifier
    e:\develop\dxmci\mhook-lib\mhook.cpp(363) : error C2440: 'initializing' : cannot convert from 'int' to 'void *'
            Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
    :-((((((((((((
    Ща опробую предыдущие версии - вдруг сработает... :-

    ---------- Сообщение добавлено в 21:18 ---------- Предыдущее сообщение размещено в 21:11 ----------

    Bato-San, опробовал mhook 1.0. Те же 9 ошибок и почти на тех же строках - правда, не сразу, а только когда заменил #include "stdafx.h" (его у меня нет) на <windows.h>.
    Похоже, либа заточена на использование в каких-то особо... э... особенных проектах. :-(((((((((
     
  6. Steel Rat Stainless

    Steel Rat

    Регистрация:
    28 дек 2006
    Сообщения:
    3.260
    Я вот не столь уверен в этом. Ну, нет так нет. Я же ничего конкретного не предлагаю, так, вспомнил кой чего.
     
  7. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    Вернулся к mhook 2.2. ODPRINTF() убрал нахрен, L"kernel32" заменил на "kernel32", присобачил DDK 2600 - скомпилировалось. Пошёл думать, как перелабать либу с C++ на Си.
     
  8. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
    Рыжий Тигра, ты чем компилируешь то ? И чего там думать ?
     
  9. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    Всё тем же MSVC6, как и прошлые выкладки.
     
    Bato-San нравится это.
  10. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    Поглазел на mhook. Не, не пойдёт. :-( Вешать на постоянку - шансы или залететь с антивирусом, или не собрать концов на трамплине; а для поиска ещё не перехваченных вызовов (из уже установленного перехватчика отключать и потом включать снова) нашёл штучку универсальнее - hwbrk, hardware breakpoint. Впрочем, завтра покатаю обе.
     
  11. gudleifr

    gudleifr

    Регистрация:
    16 сен 2006
    Сообщения:
    2.484
    Я так понял. Может, опять не до конца.
    Проблема состоит из...:
    1. ... поиска в программе мест вызова интересующих нас функций.
    А надо ли их искать? Может, взять их там, где лежат сами функции? Например, подменить в таблицах импорта имя dll-ки kernel на свою. В своей 150 раз тупо вызывать kernel с теми же параметрами, а для 4-х нужных делать что-то полезное. Есть ли на этом пути подводные камни?
    2. ... идентификации вызова.
    А обязательно ли нам знать исходную точку вызова? Может, достаточно знать параметры? Сначала - имя файла. Затем - тот указатель, который мы сами вернули при открытии файла?
     
  12. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
    есть. как минимум 3:
    1. Надо будет поменять не только название dll, но и название самих функций.
    2. Рыжий Тигра высказал свою неспособность и нежелание к подобным развлечениям.
    3. Ему нужен перехват обращений к функциям кернела из всех dll игры, благо какая именно куда то лезет - ему посмотреть под Олькой или Идой влом просто.

    ну, человек пишет свой дебагер. Вон уже до хардверных бряков добрался....
    Скоро про SEH узнает...
     
    Последнее редактирование: 21 окт 2013
  13. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    Ну дык я ж ищу не для того, чтобы подменить код вызова функции, а именно чтобы найти (уже заполненный загрузчиком) и подменить адрес в таблице импорта. Тот самый, который по адресу 0x004D43FC из примера. Соответственно, достаточно найти одно такое место один раз - при написании перехватчика.
    Увы, таки есть. Во-первых, трудоёмкость: написать 150 функций-затычек (и все разные) - это не баран чихнул, а я ленивый. :-( Во-вторых, придётся править файл wc4dvd.exe, а тут и "зарыта... э... проблематика" [SIZE="-3"]((L) Жика Павлович из "Пришло время любить" :-)))) )[/SIZE]: этого файла только официально несколько версий (я знаю три: 3.01, 3.02 и GOG'овскую), а есть ещё и многочисленные патчи - как официальные, так и не. Вот чтобы этим патчам не подосрать - приходится подменять на лету. :-(
    Где-то так. Точку [SIZE="-3"](правильно она называется "entry point", "точка входа")[/SIZE] - нет, но имя функции - надо. И параметры: при открытии - имя, при позиционировании - желаемую позицию, при чтении - смещение, длину и адрес буфера. Из перехватчика по мере необходимости вызывать сами перехваченные функции (из перехватчика открытия - открыть файл и прочитать его заголовок, из перехватчика чтения - сначала спозиционироваться и т.д.) - но тут как раз проще: .dll'ка, в которой лежат перехватчики, свою собственную таблицу импорта не меняет, так что вызывать можно как обычно, по имени.

    ---------- Сообщение добавлено в 11:05 ---------- Предыдущее сообщение размещено в 10:58 ----------

    Нууу... кроме своей .dll'ы, ясен перец. :-) Но это временно - только для посмотреть, какая куда лазит; потом, видимо, останутся перехваты только из одной.
    Работе с IDA надо учиться, я её пока не понимаю - что-то она там шуршит и мне не отчитывается. А кто такая Олька - я вообще не в курсе, а гугля мычит что-то невнятное. :-(
    Принцип на уровне проца знаю, а на реализацию опять же гугля наткнула. Но hwbrk - не то, брейки ставит или в пределах потока, или глобальные, а мне надо в пределах процесса - видимо, mhook тут таки ближе.
     
  14. A.P.$lasH

    A.P.$lasH

    Legacy

    Регистрация:
    27 фев 2010
    Сообщения:
    4.667
    А можно узнать, откуда взялась первопричина? Сейчас ради интереса глянул и не вижу подобного ни в Xanlib.dll, ни в mpeg2.dll. А других оно и не юзает.
     
  15. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    Строки киношных менюшек лежат в language.tre, а через мой перехватчик не проходят. Читаются святым духом. :-((((( Возникло предположение, что читает какая-то из .dll'ок.
    Навскидку - xanlib.dll, dciman32.dll и advapi32.dll вызывают все 4 функции для чтения из файла и, следовательно, могут прочитать IFF с киноменюшками и отдать его (или выдернутую из него строку) .exe'шнику (который и выводит её DrawText()'ом).
     
  16. Sherhan007

    Sherhan007

    Регистрация:
    9 июл 2013
    Сообщения:
    214
    Рыжий Тигра, может всё таки ты запаковщик соорудишь?
     
    A.P.$lasH нравится это.
  17. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    Не уловил: тебе зажималку IFF'ов или собиралку их в .tre-файл? Зажималку не буду - негде стырить код (в WC1 было где: инсталятор можно было попросить перекурочить VGA-графику в EGA и зажать обратно).
    А собиралку уже слепил. Правда, выходной файл всегда больше входного: я заменённые IFF'ы не выбрасываю, чтобы не сбились таблички в заголовках, а замены добавляю в конец. Нужна она мне чисто в отладочных целях, переделывать влом. Устроит?

    PS. Кстати, что за байда с форумом Сухого? Я там тонко намекнул, что имею перевод, и вторую неделю тишина. Им что, никому не надо или просто неинтересно? :-?
     
    Последнее редактирование: 21 окт 2013
  18. Sherhan007

    Sherhan007

    Регистрация:
    9 июл 2013
    Сообщения:
    214
    Умер давно сухой, там теперь нужна только графика. Я там ещё летом написал что сделал перевод WC SO:

    =============
    Harh / 09.07.2013, 09:35 #2
    Re: Wing Commander Secret Ops [RUS]
    Жуть какая Хорошо хоть на картинке с менюшкой написано "Выйти в Windows", а не "Выйти в DOS".

    =============
    ir spider / 28.07.2013, 04:53 #4
    Re: Wing Commander Secret Ops [RUS]

    Цитата Сообщение от Harh Посмотреть сообщение
    > Жуть какая Хорошо хоть на картинке с менюшкой написано "Выйти в Windows", а не "Выйти в DOS".
    Полностью согласен. Это какой то позор. В жанре только на Криса Тейлора есть надежда, он веников не вяжет.
    =============

    Harh / 29.07.2013, 14:29 #9

    Re: Wing Commander Secret Ops [RUS]

    Цитата Сообщение от Dornil Посмотреть сообщение
    > Автор, очевидно, хотел показать, что существует или готовится русский перевод WC: Secret Ops, которая суть есть официальный (если не ошибаюсь) адд-он к Prophecy.
    А, это перевод что ль? Я подумал грешным делом, что это какая-то фанатская разработка... Но кому этот перевод сейчас нужен? Для кого оно вообще? Вещь в себе какая-то
    =============
     
  19. A.P.$lasH

    A.P.$lasH

    Legacy

    Регистрация:
    27 фев 2010
    Сообщения:
    4.667
    Ну что вы, это же системные библиотеки. Какие 4 функции? Вы их в импорте посмотрели вместо экспорта? Или advapi32 будет через реестр файлики читать?

    Я же про собственные библиотеки, которые идут в комплекте с игрой.
     
  20. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    CreateFile(A|W)(), SetFilePointer(), ReadFile(), CloseHandle(). Можно, в принципе, ещё и GetFileSize() заюзать, но и без него тоже можно.
    И что? Это как-то запрещает им по просьбе трудящихся приложений прочитать кусочек файла и поделиться прочитанным? :-
    22a6127e0d8eae42c2c5a7fbf51fe37d.jpg 1378ae6f3281087835e97b6300e60939.jpg

    ---------- Сообщение добавлено в 14:54 ---------- Предыдущее сообщение размещено в 14:53 ----------

    :-(((((
     
  21. A.P.$lasH

    A.P.$lasH

    Legacy

    Регистрация:
    27 фев 2010
    Сообщения:
    4.667
    Рыжий Тигра, было же:
    И тут найдёте?

    advapi32 | dxmci

    Не знаю, что там и кому мешает, но это же в IDA видно.

    Ваш language.tre читается через ReadFile из кернела вот здесь:

    Код:
    .text:00470465                 push    offset aLanguage_tre ; "language.tre"
    .text:0047046A                 mov     ecx, edi        ; Str1
    .text:0047046C                 call    sub_48B740
     
    Bato-San нравится это.
  22. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
    хардкор.
     
    A.P.$lasH нравится это.
  1. На этом сайте используются файлы cookie, чтобы персонализировать содержимое, хранить Ваши предпочтения и держать Вас авторизованным в системе, если Вы зарегистрировались.
    Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.
    Скрыть объявление