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

 eXeL@B —› Вопросы новичков —› Подменить системную CodePage с 1252 на 1251 в памяти без перезагрузки windows
. 1 . 2 . >>
Посл.ответ Сообщение

Ранг: -4.6 (нарушитель)
Активность: 0.010
Статус: Участник

Создано: 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.
Или какие ещё соображения.

Текст "немного" не связный, прошу извинить, мозг плохо соображает.

Спасибо.

44ff_05.06.2012_EXELAB.rU.tgz - tablica-ASCII-1252.jpg




Ранг: 307.9 (мудрец), 196thx
Активность: 0.180
Статус: Участник

Создано: 05 июня 2012 15:36 · Поправил: mysterio
· Личное сообщение · #2

Не проще ли добавить русский в винду (не язык а кодовые страницы !), внести изменения в реестр (если потребуется) и перезагрузиться 1 раз ?
Маловероятный вариант сменить редактором ресурсов кодировку с 1252 на 1251.

-----
Don_t hate the cracker - hate the code.




Ранг: -4.6 (нарушитель)
Активность: 0.010
Статус: Участник

Создано: 05 июня 2012 16:19
· Личное сообщение · #3

не проще, т.к. винда - это образ vmware
в образе нужный софт находится в запущенном состоянии

по поводу "маловероятного варианта" не согласен
сложности с нахождением информации по этому поводу
а так - это же всего лишь код, набор цифр, из которых и состоит и винда и всё остальное



Ранг: 112.9 (ветеран), 186thx
Активность: 0.090.01
Статус: Участник

Создано: 05 июня 2012 16:57
· Личное сообщение · #4

Я не уверен, но может попробовать захучить GetACP ?



Ранг: -4.6 (нарушитель)
Активность: 0.010
Статус: Участник

Создано: 05 июня 2012 17:44
· Личное сообщение · #5

GetACP - Возвращенное значение содержит код страницы, она 1252
просьба пояснить значение слова "захучить" (чтобы понять смысл действий)- как правильно пишется - найти значение попробую




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 05 июня 2012 18:02
· Личное сообщение · #6

hook это-установить перехват.



Ранг: -4.6 (нарушитель)
Активность: 0.010
Статус: Участник

Создано: 05 июня 2012 18:22 · Поправил: 123456879
· Личное сообщение · #7

будьте любезны, подскажите автоматический "захучиватель"
API Monitor (Alpha-r7) 32 bit - из этой серии?
или лучше использовать для решения этой задачи другой?
Если можно в трёх-четырёх словах план действий.
Спасибо.

Например, при каком моменте можно попробывать осуществить перехват



Ранг: -4.6 (нарушитель)
Активность: 0.010
Статус: Участник

Создано: 05 июня 2012 18:44
· Личное сообщение · #8



1. Поставил галочку GetACP
2. Начал набирать в Notepade++ при включенной русской раксладке (в систрее RU) - абвгде
3. В Notepade++ появляются вопросики
4. Смотрю на Api Monitor

Дальше интересующее находится в : Summary : 2 Call (обведено красным вверху)
или Output (обведено внизу) - если да, то просьба подсказать алгоритм поиска и что искать
Спасибо.



Ранг: 281.8 (наставник), 272thx
Активность: 0.250.01
Статус: Участник
Destroyer of protectors

Создано: 05 июня 2012 18:45 · Поправил: MasterSoft
· Личное сообщение · #9

дел

add:
123456879 пишет:
MasterSoft: "дел" - что имеется ввиду?

это значит, что я ошибся и принося свои извинения слёзно прошу модеров удалить мой пост.



Ранг: -4.6 (нарушитель)
Активность: 0.010
Статус: Участник

Создано: 05 июня 2012 18:51
· Личное сообщение · #10

MasterSoft: "дел" - что имеется ввиду?



Ранг: 301.4 (мудрец), 194thx
Активность: 0.170.01
Статус: Участник

Создано: 05 июня 2012 18:54 · Поправил: Veliant
· Личное сообщение · #11

Code:
  1. UINT __stdcall GetACP()
  2. {
  3.   return gAnsiCodePage;
  4. }


Code:
  1. void __stdcall SetCPGlobal(int a1)
  2. {
  3.   gAnsiCodePage = a1;
  4. }


ничего хукать не надо. Найди в памяти нужного процесса модуль kernel32 в нем функцию GetACP перейди по указателю и исправь там dword на 1251



Ранг: -4.6 (нарушитель)
Активность: 0.010
Статус: Участник

Создано: 05 июня 2012 19:37 · Поправил: Модератор
· Личное сообщение · #12

Veliant: Найти с помощью Api Monitor`a и сделать по аналогии как я описал про Notepade++ ?
или Найти с помощью Olly Debugger ?
Спасибо.

или про это как раз написано в коде:

Code:
  1.     UINT __stdcall GetACP()
  2.     {
  3.       return gAnsiCodePage;
  4.     }
  5.  


Code:
  1.     void __stdcall SetCPGlobal(int a1)
  2.     {
  3.       gAnsiCodePage = a1;
  4.     }
  5.  


т.е. нужно написать это на С++, откомпилировать и запустить?
или всёже всё попроще?
спасибо?



Ранг: 112.9 (ветеран), 186thx
Активность: 0.090.01
Статус: Участник

Создано: 05 июня 2012 19:45 · Поправил: vden
· Личное сообщение · #13

В OllyDbg например. Присоединиться к процессу (attach), найти функцию допустим GetACP,
там будет что-то вроде
mov eax, dword_765A0EFC (адрес может быть другой)
перейти по адресу dword_765A0EFC
и записать туда нужное значение
отсоединиться от процесса (detach)

Сообщения желательно править, а не создавать подряд



PS. так например, чтобы избежать эффекта чата



Ранг: -4.6 (нарушитель)
Активность: 0.010
Статус: Участник

Создано: 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 что недопеределано...



Ранг: 301.4 (мудрец), 194thx
Активность: 0.170.01
Статус: Участник

Создано: 05 июня 2012 21:43 · Поправил: Veliant
· Личное сообщение · #15

123456879 пишет:
Как нужно сделать, чтобы изменения сохранились и вступили в силу?

Найти в том же kernel32 функцию SetCPGlobal
Там должно быть пару команд
Code:
  1. mov eax, [ebp+??]
  2. mov [77ecb358], eax

Выделяешь обе команды мышкой, потом правый клик и там залить NOP'ами

Только сдается мне локаль подгружается при загрузке процесса, и не меняется больше

Попробуй добавить в системе русскую локаль, поправить ключи реестра, а потом поменять оформление темы окон, там обычно переинициализация происходит, может и шрифты с локалью подцепятся...



Ранг: -4.6 (нарушитель)
Активность: 0.010
Статус: Участник

Создано: 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ифтов и что это такое

Спасибо за ответы. (или как здесь принято...)

От модератора: не в состоянии пользоваться правкой даже после того, как явно на неё указали? ну давай я это сделаю за тебя. в следующий раз к правке будет дополнительный бонус в виде бана



Ранг: -4.6 (нарушитель)
Активность: 0.010
Статус: Участник

Создано: 06 июня 2012 11:46 · Поправил: 123456879
· Личное сообщение · #17

мне кажется, что после правки (все сообщения подряд) потерялся смысл каждого
но Вам виднее
а такой тон видимо из-за одолевших нарушителей, хотя ветка для новичков...
спасибо, будем исправляться



Ранг: -4.6 (нарушитель)
Активность: 0.010
Статус: Участник

Создано: 16 июня 2012 10:45
· Личное сообщение · #18

Доброго времени суток
"Плакаться" смысла нет...
Но в просмотрах данная тема на "пике популярности", жаль что вопрос не решён до конца...
Просьба обратить внимание знающих людей и подсказать направление для развития и решения данного вопроса.
Начало было активное. А после красной надписи и понижения ранга до "Нарушителя" - как бабка отшептала.
Надеюсь это не связано с каким нибудь предвзятым отношением.
Или продолжение решения вопроса уже выходит за рамки поставленного...
и по смыслу вопрос заданный в теме решён, а для нового нужен новый топик?
или чтобы привлечь внимание нужно потыкать на руку с пальцем вверх...

Это оффтоп... и мне не понятно почему так...




Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 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




Ранг: -4.6 (нарушитель)
Активность: 0.010
Статус: Участник

Создано: 16 июня 2012 13:56
· Личное сообщение · #20

понял, спасибо за раз`яснения, буду пробовать эти варианты



Ранг: 310.8 (мудрец), 29thx
Активность: 0.430
Статус: Участник

Создано: 27 июня 2012 09:42
· Личное сообщение · #21

123456879 пишет:
в ней стоит программа, с не русским интерфейсом, у которой кодировка ASCII (системная 1252)
программа работает с РУССКИМИ текстовыми файлами.
если файлы в Unicode , то например в notepade ++ русские видно , а если в ASCII ,то кракозябры

Знаешь почему до сих пор не решил задачку. Потому что ты ее не поставил. В твоих словах нет постановки задачи. У тебя проблема с программой, но ты даже не описал какая. Почему-то думаешь что правильное решение это подмена кодировки и мучаешь всех и себя попыткой решить эту задачу.
Ты нарисуй в чем проблема с программой.
В русской Винде специально для старых программ в настройках локалей есть пункт про ДОС-программы. Возможно он есть и в нерусской Винде при установке русской локали. Это первое, что надо было попробовать.



Ранг: -4.6 (нарушитель)
Активность: 0.010
Статус: Участник

Создано: 30 июня 2012 20:12
· Личное сообщение · #22

Решений вроде может быть несколько:
- сохранить дамп Всей памяти (или только участков с программой) и после перезагрузки (после установки non-unicode) восстановить его (с запущенными программами) (софт запущен на виртуальной машине) - не знаю как и чем это можно сделать
- подменить кодировку в операционной системе
- подменить используемую кодировку в запущенной программе (вроде не получается)

кто-нибудь случайно не знает как и откуда (технически или как это сказать/ с какого места) winhex берёт информацию о текущей кодировки, чтобы до туда добраться





Ранг: 527.7 (!), 381thx
Активность: 0.160.09
Статус: Участник
Победитель турнира 2010

Создано: 30 июня 2012 20:50 · Поправил: OKOB
· Личное сообщение · #23

123456879 пишет:
как и откуда


например так, без знания откуда

Code:
  1. #include <string>
  2. #include <iostream>
  3. #include <stdio.h>
  4.  
  5. std::string exec(char* cmd) 
  6. {
  7.     FILE* pipe = _popen(cmd, "r");
  8.     if (!pipe) return "ERROR";
  9.     char buffer[128];
  10.     std::string result = "";
  11.     while(!feof(pipe)) {
  12.         if(fgets(buffer, 128, pipe) != NULL)
  13.                 result += buffer;
  14.     }
  15.     _pclose(pipe);
  16.     return result;
  17. }
  18.  
  19. int main(int argc, char* argv[])
  20. {
  21.          std::string result = exec("chcp");
  22.          char *= strchr((char *)result.c_str(), ':');
  23.          printf("Character set CP%s\n", p+1);
  24.          return 0;
  25. }


и изменить так же CHCP 1251 <=> CHCP 1252

-----
127.0.0.1, sweet 127.0.0.1




Ранг: -4.6 (нарушитель)
Активность: 0.010
Статус: Участник

Создано: 01 июля 2012 10:07 · Поправил: 123456879
· Личное сообщение · #24

просмотрел меньше половины курса "Специалист`а" про Си
можно в трёх словах что этот код где и зачем берёт и что с этим взятым делает
я уже по логике постараюсь додумать

и что здесь имеется ввиду "и изменить так же CHCP 1251 <=> CHCP 1252 "

спасибо




Ранг: 527.7 (!), 381thx
Активность: 0.160.09
Статус: Участник
Победитель турнира 2010

Создано: 01 июля 2012 10:26 · Поправил: OKOB
· Личное сообщение · #25

Код исполняет системную команду CHCP (CHange Code Page), парсит ответ и выводит в виде подобном приведенному на скрине.
Если выполнить exec("chcp 1251");, то переключится на страницу 1251, а если exec("chcp 1252");, то на 1252. Это на тот случай если это нужно сделать программно.

Если просто сменить страницу для исполнения одной программы, то достаточно батника

Code:
  1. @ECHO OFF
  2. REM Set active page 1251
  3. CHCP 1251
  4. REM Run user programm
  5. programm.exe
  6. REM Return on active page 1252
  7. CHCP 1252


На случай если нечем или некак компильнуть, консольное приложение по коду в предыдущем посте


4133_01.07.2012_EXELAB.rU.tgz - view_cp.exe

-----
127.0.0.1, sweet 127.0.0.1




Ранг: -4.6 (нарушитель)
Активность: 0.010
Статус: Участник

Создано: 01 июля 2012 10:40
· Личное сообщение · #26

да, только программа уже запущена и вырубать её нельзя
этот вариант, как я понимаю, подойдёт если запускать программу
можно это или подобное действие (переключение используемой кодировки) как-то
сделать с запущенной программой?




Ранг: 527.7 (!), 381thx
Активность: 0.160.09
Статус: Участник
Победитель турнира 2010

Создано: 01 июля 2012 13:09 · Поправил: OKOB
· Личное сообщение · #27

123456879 пишет:
можно это или подобное действие (переключение используемой кодировки) как-то сделать с запущенной программой?


Кто мешает попробовать? С тем же WinHex смотрим инфу, в соседнем окне запускаем команду смены страницы, передергиваем в WinHex-е отображение инфы. Убеждаемся работает-не работает.

-----
127.0.0.1, sweet 127.0.0.1




Ранг: -4.6 (нарушитель)
Активность: 0.010
Статус: Участник

Создано: 01 июля 2012 17:57 · Поправил: 123456879
· Личное сообщение · #28

балин, я опять недопонял
"- в WinHex смотрим инфу,
- в соседнем окне запускаем команду смены страницы,
- передергиваем в WinHex-е отображение инфы.
- Убеждаемся работает-не работает".

- это если откомпилировать вышепредложенный код, запустить его с какой-нибудь программой?
просьба об`яснить.
я так понимаю ценные зёрна информации таятся "между строк" и подразумеваются какие-то очевидные вещи, но я их ещё не очень вижу.
я как пойму что и как пробовать - об`язательно попробую




Ранг: 527.7 (!), 381thx
Активность: 0.160.09
Статус: Участник
Победитель турнира 2010

Создано: 01 июля 2012 18:26 · Поправил: OKOB
· Личное сообщение · #29

Уже сам проверил. Глобально не влияет. Запустил две сессии FAR. В одной запустил команду CHCP 1251. В другой сессии командой CHCP проверил текущую страницу (Не изменилась ). В той сессии в которой менял, команда CHCP отображает - Текущая кодовая страница: 1251.

-----
127.0.0.1, sweet 127.0.0.1




Ранг: -4.6 (нарушитель)
Активность: 0.010
Статус: Участник

Создано: 01 июля 2012 19:06 · Поправил: 123456879
· Личное сообщение · #30

может кто знает, как или чем можно сделать полный ( или не полный) Дамп памяти с запущенным в ней приложением, чтобы после перезагрузки операционной системы можно было восстановить запущенное приложение в памяти, Восстановив (запустив) этот Дамп?


и как заставить использовать запущенное приложение только шрифт (системный видимо по умолчанию) Courier New - он вроде Unicode?


. 1 . 2 . >>
 eXeL@B —› Вопросы новичков —› Подменить системную CodePage с 1252 на 1251 в памяти без перезагрузки windows
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати