Подскажите, как решить следующую задачу:
есть EXE-приложение (консольное, архитектура x86, unicode), скомпилированное в Visual C (какая-то из версий до 2005-ой). Это приложение использует VC Runtime-библиотеку, которую линкует динамически. Исходников этого приложения нет.
Это приложение содержит баг, который в консоль вместо русских Unicode-символов выводит знаки вопроса (точнее, это больше баг VC Runtime-библиотеки).
В VC2005 Microsoft добавила корректную поддержку Unicode в консоли — для нормального вывода Unicode в консоль необходимо до первой команды вывода в консоль выполнить следующую команду:
_setmode(_fileno(stdout), _O_U16TEXT);
Собственно вопрос следующий: хотелось бы как-то заставить это exe-приложение:
— линковать VC Runtime-библиотеку версии от 2005 и выше;
— инжектировать в адресное пространство exe-приложения (или может быть как-то без инжекта патчить таблицы импорта или ещё что-то) кусок кода, выполняющего до первого вывода в консоль команду _setmode(_fileno(stdout), _O_U16TEXT);
При этом желательно избегать сильно хакерских методов, которые могут не работать из-за ASLR и т.п. технологий.
Очень приветствуются куски кода-прототипа для решения (я не сильно силён в хакерстве)...
Re: патчинг exe-файла для правильного Unicode-вывода в консоль
Здравствуйте, Vorland, Вы писали:
V>Это приложение содержит баг, который в консоль вместо русских Unicode-символов выводит знаки вопроса (точнее, это больше баг VC Runtime-библиотеки).
Уверены, что это баг ?
Не пробовали играться с настройкой региональных стандартов системы или менять шрифт консоли ?
V>В VC2005 Microsoft добавила корректную поддержку Unicode в консоли — для нормального вывода Unicode в консоль необходимо до первой команды вывода в консоль выполнить следующую команду: V> _setmode(_fileno(stdout), _O_U16TEXT);
Поддержкой это можно назвать с очень большой натяжкой.
Вывод символов в консоль Windows зависит не только от кодировки текста/консоли, но и от шрифта консоли.
А шрифт, установленный в консоли Windows по умолчанию, позволяет отображать лишь очень ограниченное
количество символов.
Re: патчинг exe-файла для правильного Unicode-вывода в консоль
Здравствуйте, okman, Вы писали:
O>Уверены, что это баг ? O>Не пробовали играться с настройкой региональных стандартов системы или менять шрифт консоли ?
Ну работа с Unicode в консоли у MS — это одно большое недоразумение...
Строго говоря это не баг, а заложенная НЕДО-функциональность ОС.
V>> _setmode(_fileno(stdout), _O_U16TEXT);
O>Поддержкой это можно назвать с очень большой натяжкой. O>Вывод символов в консоль Windows зависит не только от кодировки текста/консоли, но и от шрифта консоли. O>А шрифт, установленный в консоли Windows по умолчанию, позволяет отображать лишь очень ограниченное O>количество символов.
В моём случаи это работает нормально для вывода в консоли кириллицы при стандартном шрифте консольного окна. Поэтому и спрашиваю, как реализовать это для другого exe без его исходников. Нужно получить хотя бы идею насчёт метода внедрения функции в exe без сильно хакерских методов и до первого вывода в консоль...
Re: патчинг exe-файла для правильного Unicode-вывода в консоль
Здравствуйте, Vorland, Вы писали:
V>Собственно вопрос следующий: хотелось бы как-то заставить это exe-приложение: V>- линковать VC Runtime-библиотеку версии от 2005 и выше;
Это гемерно. Эту задачу можно решить проще (см. ниже).
V>- инжектировать в адресное пространство exe-приложения (или может быть как-то без инжекта патчить таблицы импорта или ещё что-то) кусок кода, выполняющего до первого вывода в консоль команду _setmode(_fileno(stdout), _O_U16TEXT); V>При этом желательно избегать сильно хакерских методов, которые могут не работать из-за ASLR и т.п. технологий.
Лучше сделать так:
1) найти ту функцию, через которую происходит весь вывод Unicode-строк (та, в которой вызывается что то типа wprintfW или wsprintfW)
2) пропатчить или вовсе заменить эту функцию на свою (для своей функции нужно выделить в бинаре доп. местечко).
На этапе 2 предполагается конвертация Unicode строки в ANSI при помощи функции WideCharToMultiByte с указанием кодовой страницы 1251.
Если у самого руки не могут такое вытворять, то лучшее место искать помощи в таком деле это www.exelab.ru
Постояльцы RSDN патчинг и модификацию бинарей не практикуют в своём большинстве. Хотя и странно, что тов. ononim не посоветовал ничего (а он то точно могёт).
Re[2]: патчинг exe-файла для правильного Unicode-вывода в консоль
Здравствуйте, acDev, Вы писали:
D> Если у самого руки не могут такое вытворять, то лучшее место искать помощи в таком деле это www.exelab.ru D> Постояльцы RSDN патчинг и модификацию бинарей не практикуют в своём большинстве. Хотя и странно, что тов. ononim не посоветовал ничего (а он то точно могёт).
Спасибо за наводку. Попробую перенести этот вопрос на exelab.ru. Не подскажите, в какую тему там лучше задать мой вопрос?
А насчёт гемора: хотелось бы сделать инжект динамическим, что-то типа лоадера. Версия программы, которую надо патчить, может меняться — не хотелось бы каждый раз её потрашить, хотелось бы в автомате всё сделать...
Re[4]: патчинг exe-файла для правильного Unicode-вывода в консоль
Здравствуйте, Vorland, Вы писали:
V>А насчёт гемора: хотелось бы сделать инжект динамическим, что-то типа лоадера. Версия программы, которую надо патчить, может меняться — не хотелось бы каждый раз её потрашить, хотелось бы в автомате всё сделать...
Для этого есть автопатчеры (достаточно шаблон указать). Если версия компилятора не меняется, то и шаблон не изменится, т.к. патчится кодес из msvcrt.lib