патчинг exe-файла для правильного Unicode-вывода в консоль
От: Vorland  
Дата: 15.06.13 11:00
Оценка:
Подскажите, как решить следующую задачу:
есть 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-вывода в консоль
От: okman Беларусь https://searchinform.ru/
Дата: 15.06.13 12:21
Оценка:
Здравствуйте, Vorland, Вы писали:

V>Это приложение содержит баг, который в консоль вместо русских Unicode-символов выводит знаки вопроса (точнее, это больше баг VC Runtime-библиотеки).


Уверены, что это баг ?
Не пробовали играться с настройкой региональных стандартов системы или менять шрифт консоли ?

V>В VC2005 Microsoft добавила корректную поддержку Unicode в консоли — для нормального вывода Unicode в консоль необходимо до первой команды вывода в консоль выполнить следующую команду:

V> _setmode(_fileno(stdout), _O_U16TEXT);

Поддержкой это можно назвать с очень большой натяжкой.
Вывод символов в консоль Windows зависит не только от кодировки текста/консоли, но и от шрифта консоли.
А шрифт, установленный в консоли Windows по умолчанию, позволяет отображать лишь очень ограниченное
количество символов.
Re: патчинг exe-файла для правильного Unicode-вывода в консоль
От: Kubyshev Andrey  
Дата: 16.06.13 15:09
Оценка:
Надо нанять кого нибудь ...
Если надо энтузиасты запатчат всё...
Re[2]: патчинг exe-файла для правильного Unicode-вывода в консоль
От: Vorland  
Дата: 16.06.13 18:33
Оценка:
Здравствуйте, okman, Вы писали:

O>Уверены, что это баг ?

O>Не пробовали играться с настройкой региональных стандартов системы или менять шрифт консоли ?
Ну работа с Unicode в консоли у MS — это одно большое недоразумение...
Строго говоря это не баг, а заложенная НЕДО-функциональность ОС.

V>> _setmode(_fileno(stdout), _O_U16TEXT);


O>Поддержкой это можно назвать с очень большой натяжкой.

O>Вывод символов в консоль Windows зависит не только от кодировки текста/консоли, но и от шрифта консоли.
O>А шрифт, установленный в консоли Windows по умолчанию, позволяет отображать лишь очень ограниченное
O>количество символов.

В моём случаи это работает нормально для вывода в консоли кириллицы при стандартном шрифте консольного окна. Поэтому и спрашиваю, как реализовать это для другого exe без его исходников. Нужно получить хотя бы идею насчёт метода внедрения функции в exe без сильно хакерских методов и до первого вывода в консоль...
Re: патчинг exe-файла для правильного Unicode-вывода в консоль
От: acDev Россия  
Дата: 17.06.13 14:55
Оценка:
Здравствуйте, 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 Россия  
Дата: 17.06.13 15:06
Оценка:
D>1) найти ту функцию, через которую происходит весь вывод Unicode-строк (та, в которой вызывается что то типа wprintfW или wsprintfW)

Хотя, наверное, лучше сразу искать все вызовы функции WideCharToMultiByte и патчить их (т.е. попробовать явно указать 1251 кодовую страницу).
Re[3]: патчинг exe-файла для правильного Unicode-вывода в консоль
От: Vorland  
Дата: 18.06.13 09:14
Оценка:
Здравствуйте, acDev, Вы писали:

D> Если у самого руки не могут такое вытворять, то лучшее место искать помощи в таком деле это www.exelab.ru

D> Постояльцы RSDN патчинг и модификацию бинарей не практикуют в своём большинстве. Хотя и странно, что тов. ononim не посоветовал ничего (а он то точно могёт).

Спасибо за наводку. Попробую перенести этот вопрос на exelab.ru. Не подскажите, в какую тему там лучше задать мой вопрос?

А насчёт гемора: хотелось бы сделать инжект динамическим, что-то типа лоадера. Версия программы, которую надо патчить, может меняться — не хотелось бы каждый раз её потрашить, хотелось бы в автомате всё сделать...
Re[4]: патчинг exe-файла для правильного Unicode-вывода в консоль
От: acDev Россия  
Дата: 18.06.13 18:53
Оценка:
Здравствуйте, Vorland, Вы писали:

V>А насчёт гемора: хотелось бы сделать инжект динамическим, что-то типа лоадера. Версия программы, которую надо патчить, может меняться — не хотелось бы каждый раз её потрашить, хотелось бы в автомате всё сделать...


Для этого есть автопатчеры (достаточно шаблон указать). Если версия компилятора не меняется, то и шаблон не изменится, т.к. патчится кодес из msvcrt.lib
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.