Сейчас на форуме: asfa, bartolomeo (+7 невидимых) |
![]() |
eXeL@B —› Вопросы новичков —› Подменить системную CodePage с 1252 на 1251 в памяти без перезагрузки windows |
. 1 . 2 . >> |
Посл.ответ | Сообщение |
|
Создано: 05 июня 2012 12:47 · Личное сообщение · #1 Дорого времени суток. интересует то, что в заголовке. текст видимо не совсем правильно будет скомпанован, прошу извинить, сижу третьи сутки ![]() есть не русская винда. в ней стоит программа, с не русским интерфейсом, у которой кодировка ASCII (системная 1252) программа работает с РУССКИМИ текстовыми файлами. если файлы в Unicode , то например в notepade ++ русские видно , а если в ASCII ,то кракозябры если делать Non-Unicode или менять в реестре c_1250 - c_1255 значение на 1251 нужна перезагрузка. если менять в WinHex в файле WinLogon c_1250 - C_1255 на 1251, в памяти остаётся но в системе не меняется в файле Explorer тоже менял по аналогии, в системе изменений нет с помощью WinHex редактировать память (Edit Main Memory -> System #4 -> Primari Memory) там лежит таблица символов (1252) пробовал заменить русские - латиницей - получается, ![]() Получается где-то стоят пара байтов, которые отвечают за текущее подключение адреса кодовой страницы. (codepage, setlocal или как там его ещё можно назвать или обозначить) мои предположения, что после их подмены, при просмотре WinHex (Edit Main Memory -> System #4 -> Primari Memory) там будет таблица символов с русским Подскажите где прописывается адрес на системную кодовую страницу, чтобы его подменить прямо в памяти, чтобы сработало без перезагрузки windows. Или какие ещё соображения. Текст "немного" не связный, прошу извинить, мозг плохо соображает. Спасибо. ![]() ![]() |
|
Создано: 05 июня 2012 15:36 · Поправил: mysterio · Личное сообщение · #2 |
|
Создано: 05 июня 2012 16:19 · Личное сообщение · #3 |
|
Создано: 05 июня 2012 16:57 · Личное сообщение · #4 |
|
Создано: 05 июня 2012 17:44 · Личное сообщение · #5 |
|
Создано: 05 июня 2012 18:02 · Личное сообщение · #6 |
|
Создано: 05 июня 2012 18:22 · Поправил: 123456879 · Личное сообщение · #7 |
|
Создано: 05 июня 2012 18:44 · Личное сообщение · #8 ![]() 1. Поставил галочку GetACP 2. Начал набирать в Notepade++ при включенной русской раксладке (в систрее RU) - абвгде 3. В Notepade++ появляются вопросики 4. Смотрю на Api Monitor Дальше интересующее находится в : Summary : 2 Call (обведено красным вверху) или Output (обведено внизу) - если да, то просьба подсказать алгоритм поиска и что искать Спасибо. ![]() |
|
Создано: 05 июня 2012 18:45 · Поправил: MasterSoft · Личное сообщение · #9 |
|
Создано: 05 июня 2012 18:51 · Личное сообщение · #10 |
|
Создано: 05 июня 2012 18:54 · Поправил: Veliant · Личное сообщение · #11 |
|
Создано: 05 июня 2012 19:37 · Поправил: Модератор · Личное сообщение · #12 Veliant: Найти с помощью Api Monitor`a и сделать по аналогии как я описал про Notepade++ ? или Найти с помощью Olly Debugger ? Спасибо. или про это как раз написано в коде: Code:
Code:
т.е. нужно написать это на С++, откомпилировать и запустить? или всёже всё попроще? спасибо? ![]() |
|
Создано: 05 июня 2012 19:45 · Поправил: vden · Личное сообщение · #13 В OllyDbg например. Присоединиться к процессу (attach), найти функцию допустим GetACP, там будет что-то вроде mov eax, dword_765A0EFC (адрес может быть другой) перейти по адресу dword_765A0EFC и записать туда нужное значение отсоединиться от процесса (detach) Сообщения желательно править, а не создавать подряд ![]() PS. так например, чтобы избежать эффекта чата ![]() |
|
Создано: 05 июня 2012 20:52 · Поправил: 123456879 · Личное сообщение · #14 приаттачил программу в самой программе функций GetACP не обнаружил ![]() двойным щелчком открыл kernel32 в нём Search for Names (правой кнопкой мыши) ![]() в нём нашёл GetACP двойной щелчок по нему, открылось это ![]() нажал modify, поменял на 1251 отсоединился от процесса первый опыт в практике с Olly Debugger результат: раньше при включенном в систрее RU печатались кракозябры, сейчас вопросики. Что-то недоделал/недопереключилось? Добавил после... приаттачил снова, посмтрел kernel32 GetACP , а там снова 1252 Как нужно сделать, чтобы изменения сохранились и вступили в силу? Добавлено... Нашёл такое: "правая кнопчка мышки->copy to executable->all modifications->выскакивает окошко->правая кнопочка мышки В ЭТОМ ОКОШЕЧКЕ->save to file->выбираешь имя файла->OK " но меня такого нет Olly Debugger версии 2.01 Alpha 4 может в Alpha 4 что недопеределано... ![]() |
|
Создано: 05 июня 2012 21:43 · Поправил: Veliant · Личное сообщение · #15 123456879 пишет: Как нужно сделать, чтобы изменения сохранились и вступили в силу? Найти в том же kernel32 функцию SetCPGlobal Там должно быть пару команд Code:
Выделяешь обе команды мышкой, потом правый клик и там залить NOP'ами Только сдается мне локаль подгружается при загрузке процесса, и не меняется больше Попробуй добавить в системе русскую локаль, поправить ключи реестра, а потом поменять оформление темы окон, там обычно переинициализация происходит, может и шрифты с локалью подцепятся... ![]() |
|
Создано: 06 июня 2012 08:47 · Поправил: Модератор · Личное сообщение · #16 А можно ли сделать что-то типа снапшот запущенных программ в памяти, установить локаль Non-Unicode, перезагрузить виндовс и восстановить снапшот? и в памяти есть ещё файлик locale.nls может быть с ним можно попробовать что-нибудь сделать? Может кто подскажет, как сделано в Total Commander или где это как-нибудь посмотреть там русские буквы печатаются ![]() Думаю теперь вопрос должен звучать так: Как подменить "ссылки" (или как) на системные шрифты, хранящиеся (если так) в памяти windows? AddFontResource function AddFontResource(FileName: PChar): Integer; Добавляет к таблице системных шpифтов pесуpс шpифта из файла pесуpса шpифтов с именем FileName. Если можно, просьба разъяснить: 1. где находится таблица системных шpифтов и что это такое 2. где находится pесуpс шpифта и что это такое 3. где находится файл pесуpса шpифтов и что это такое Спасибо за ответы. (или как здесь принято...) От модератора: не в состоянии пользоваться правкой даже после того, как явно на неё указали? ну давай я это сделаю за тебя. в следующий раз к правке будет дополнительный бонус в виде бана ![]() |
|
Создано: 06 июня 2012 11:46 · Поправил: 123456879 · Личное сообщение · #17 |
|
Создано: 16 июня 2012 10:45 · Личное сообщение · #18 Доброго времени суток "Плакаться" смысла нет... Но в просмотрах данная тема на "пике популярности", жаль что вопрос не решён до конца... Просьба обратить внимание знающих людей и подсказать направление для развития и решения данного вопроса. Начало было активное. А после красной надписи и понижения ранга до "Нарушителя" - как бабка отшептала. Надеюсь это не связано с каким нибудь предвзятым отношением. Или продолжение решения вопроса уже выходит за рамки поставленного... и по смыслу вопрос заданный в теме решён, а для нового нужен новый топик? или чтобы привлечь внимание нужно потыкать на руку с пальцем вверх... Это оффтоп... и мне не понятно почему так... ![]() |
|
Создано: 16 июня 2012 12:41 · Личное сообщение · #19 Не знаю как там с хуками, но например емедитор напрямую читает нлс файлы. Твоя программа иностранная, работает на иностранной винде с русскими текстами, если я правильно понял. В тотал коммандере раньше всегда патчили в реестре. Есть такая утилита AppLocale от майкрософт специально для таких случаев (только вин2003 и хп) или SBAppLocale, она меняет кодировку на лету именно для твоего приложения, также на сайте codeproject.com есть статья Running the Microsoft AppLocale Utility in an Automated Batch Script. В любом случае можно посмотреть как она это делает. А вообще если твой софт работает с русским текстом это баг самого софта или недоделка .. в остальном просто специфические требования, отсюда и количество ответов. ----- RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube ![]() |
|
Создано: 16 июня 2012 13:56 · Личное сообщение · #20 |
|
Создано: 27 июня 2012 09:42 · Личное сообщение · #21 123456879 пишет: в ней стоит программа, с не русским интерфейсом, у которой кодировка ASCII (системная 1252) программа работает с РУССКИМИ текстовыми файлами. если файлы в Unicode , то например в notepade ++ русские видно , а если в ASCII ,то кракозябры Знаешь почему до сих пор не решил задачку. Потому что ты ее не поставил. В твоих словах нет постановки задачи. У тебя проблема с программой, но ты даже не описал какая. Почему-то думаешь что правильное решение это подмена кодировки и мучаешь всех и себя попыткой решить эту задачу. Ты нарисуй в чем проблема с программой. В русской Винде специально для старых программ в настройках локалей есть пункт про ДОС-программы. Возможно он есть и в нерусской Винде при установке русской локали. Это первое, что надо было попробовать. ![]() |
|
Создано: 30 июня 2012 20:12 · Личное сообщение · #22 Решений вроде может быть несколько: - сохранить дамп Всей памяти (или только участков с программой) и после перезагрузки (после установки non-unicode) восстановить его (с запущенными программами) (софт запущен на виртуальной машине) - не знаю как и чем это можно сделать - подменить кодировку в операционной системе - подменить используемую кодировку в запущенной программе (вроде не получается) кто-нибудь случайно не знает как и откуда (технически или как это сказать/ с какого места) winhex берёт информацию о текущей кодировки, чтобы до туда добраться ![]() ![]() |
|
Создано: 30 июня 2012 20:50 · Поправил: OKOB · Личное сообщение · #23 123456879 пишет: как и откуда например так, без знания откуда Code:
и изменить так же CHCP 1251 <=> CHCP 1252 ----- 127.0.0.1, sweet 127.0.0.1 ![]() |
|
Создано: 01 июля 2012 10:07 · Поправил: 123456879 · Личное сообщение · #24 |
|
Создано: 01 июля 2012 10:26 · Поправил: OKOB · Личное сообщение · #25 Код исполняет системную команду CHCP (CHange Code Page), парсит ответ и выводит в виде подобном приведенному на скрине. Если выполнить exec("chcp 1251");, то переключится на страницу 1251, а если exec("chcp 1252");, то на 1252. Это на тот случай если это нужно сделать программно. Если просто сменить страницу для исполнения одной программы, то достаточно батника Code:
На случай если нечем или некак компильнуть, консольное приложение по коду в предыдущем посте ![]() ----- 127.0.0.1, sweet 127.0.0.1 ![]() |
|
Создано: 01 июля 2012 10:40 · Личное сообщение · #26 |
|
Создано: 01 июля 2012 13:09 · Поправил: OKOB · Личное сообщение · #27 123456879 пишет: можно это или подобное действие (переключение используемой кодировки) как-то сделать с запущенной программой? Кто мешает попробовать? С тем же WinHex смотрим инфу, в соседнем окне запускаем команду смены страницы, передергиваем в WinHex-е отображение инфы. Убеждаемся работает-не работает. ----- 127.0.0.1, sweet 127.0.0.1 ![]() |
|
Создано: 01 июля 2012 17:57 · Поправил: 123456879 · Личное сообщение · #28 балин, я опять недопонял "- в WinHex смотрим инфу, - в соседнем окне запускаем команду смены страницы, - передергиваем в WinHex-е отображение инфы. - Убеждаемся работает-не работает". - это если откомпилировать вышепредложенный код, запустить его с какой-нибудь программой? просьба об`яснить. я так понимаю ценные зёрна информации таятся "между строк" и подразумеваются какие-то очевидные вещи, но я их ещё не очень вижу. ![]() я как пойму что и как пробовать - об`язательно попробую ![]() |
|
Создано: 01 июля 2012 18:26 · Поправил: OKOB · Личное сообщение · #29 |
|
Создано: 01 июля 2012 19:06 · Поправил: 123456879 · Личное сообщение · #30 может кто знает, как или чем можно сделать полный ( или не полный) Дамп памяти с запущенным в ней приложением, чтобы после перезагрузки операционной системы можно было восстановить запущенное приложение в памяти, Восстановив (запустив) этот Дамп? и как заставить использовать запущенное приложение только шрифт (системный видимо по умолчанию) Courier New - он вроде Unicode? ![]() |
. 1 . 2 . >> |
![]() |
eXeL@B —› Вопросы новичков —› Подменить системную CodePage с 1252 на 1251 в памяти без перезагрузки windows |
Эта тема закрыта. Ответы больше не принимаются. |