Этот сайт создан как клуб русификаторщиков. Для нас существуют три основных правила.
1. Мы никому и ничего не должны!
2.Один пришедший на сайт толковый русификаторщик дороже всех пользователей.
3. Мы делаем русификаторы для своего сайта, но в оригинале ими могут пользоваться все в интернете.
помоги разобраться как и чем можно расшифровать файл локализации .dat программы EasePaint Watermark Remover https://www.easepaint.com/download/EasePaintSetupG.exe lang dat https://www16.zippyshare.com/v/bmXb3nZd/file.html
помоги разобраться как и чем можно расшифровать файл локализации .dat программы EasePaint Watermark Remover
ruslangxp, ответ очевиден. Если программа читает этот файл, значит она же его может и расшифровать. Не так ли?
Файл en.dat - это Compound File Binary формат данных (архив Microsoft Office), который можно распаковать архиватором 7z. Распакуй его и получишь два бинарных файла без расширения:Message и UI. Содержимое файлов зашифровано обычным алгоритмом XOR с константой 2424 (нех), причем шифрованию подвергнуты нечетные символы массива строк (1, 3, 5, 7... и т.д.).
Скрин 1
Строки в кодировке UTF-16, поэтому для операции исключающего "ИЛИ" берутся 2 байта.
Получить дешифрованные данные (как и зашифровать обратно) можно в самой программе, запустив её под отладчиком и поставив ВР на конец цикла обработки.
Скрин 2
Также это можно сделать при помощи шестнадцатеричного редактора (операция и константа известны).
На скрине 2 ВР установлена на операцию дешифровки с командой XOR. После выхода из цикла в памяти будет дешифрованный массив нуль-терминированных строк (сначала один файл, потом другой). Копируешь данные в шестнадцатеричный редактор, на месте нуль-терминаторов вставляешь символ новой строки в формате Unix или MAC и сохраняешь в текстовый документ (txt или ini).
Скрин 3
Переводишь. Потом выполняешь описанную последовательность действий в обратном порядке:заменяешь символы новой строки нуль-терминатором, шифруешь исключающим "ИЛИ" с константой 2424 (нех) и добавляешь с архив с заменой при помощи утилиты Structured Storage Viewer.
Можно файл обратно не шифровать, тогда в программе нужно сделать обход блока дешифровки. По адресу 0137DE72 (смотри скрин 2) изменить условный переход JBE на JMP (76 > EB). Но потом обязательно проверь работоспособность, вдруг блок дешифровки используется где-то ещё.{insert-8474}
Файл en.dat - это Compound File Binary формат данных (архив Microsoft Office), который можно распаковать архиватором 7z.
А можно я задам чисто из любопытства вопрос? В файле en.dat не все ресурсы, вероятно остальные в skin_en.skin. Можно ли, каким-то образом, распаковать его? На извлечение требует некий пароль.
В файле en.dat не все ресурсы, вероятно остальные в skin_en.skin. Можно ли, каким-то образом, распаковать его?
Совершенно верно, строки интерфейса находятся в файле обложки. Файлы в папке "skin" - это запароленные архивы ZIP. Пароль прописан в библиотеке ycomuiu.dll и вызывается при обращении к файлам *.skin. Его легко можно увидеть при запуске программы под отладчиком и установкой ВР на обращение к файлам с расширением ".skin".
Скин 4
Файлы в архиве имеют формат XML, которым описывается интерфейс программы и его элементы. Строковые элементы указаны атрибутом "text=", кодировка - UTF-8. Там же можно подкорректировать позицию и размеры элементов управления под размеры переведенных строк.
Скин 5
Есть графический редактор для создания и модификации данного формата скинов - DuiDesigner (смотрите в папке bin). Проект давно не развивается и редактор глючит, но посмотреть скин и сориентироваться что-к-чему, вполне можно. А вот сама библиотека скинизации Duilib очень популярна и широко используется китайскими девелоперами.
Скин 6
А если имеете богатое воображение и фантазию, то можете забабахать свой скин. Графическая часть скинов находится в архиве default.skin.
После редактирования файлов пакуете все в архив ZIP, используя тот же пароль.{insert-8485}
А можно подробнее, где поставить ВР (как выйти на этот пароль)?
Имя папки, в которой находятся скины - skin. Имя файла скина, который загружает программа при установленном английском языке - skin_en.skin. Я в таких случаях начинаю поиск с жестких строк (при запуске программа должна как-то обратится или к папке или к файлу, или к тому и другому). Открываю программу в отладчике, провожу поиск жестких строк и отфильтровываю вызовы по ключевому слову, начиная вводить "skin". Получается вот такой интересный списочек.
Скрин 7
Устанавливаю ВР на все эти строки (команда контекстного меню в списке) и запускаю программу под отладчиком. Отладчик тормознет выполнение программы на обращении к строке "skinskin_en.skin".
Скрин 8
Просматриваю листинг до конца функции (RET). Замечаю функции PathFileExist - проверка файла, потом PathFindFileN - проверка пути к файлу файла. То есть это стандартные функции проверки и ничего интересного, поэтому продолжаю выполнение программы - F9. Следующая остановка обращение к строке ".skin" - это расширение файла с обложкой. Тут же видны функции менеджера управления обложками из библиотеки DuiLib (файл ycomuiu.dll): SetInstance@CPaintManagerUI@DuiLib - установка программы, для которой нужно применить обложку; SetSkinExt@CPaintManagerUI@DuiLib - установка расширения у файла с обложкой.
Скрин 9
Иду дальше. Пока это все подготовка к чтению непосредственно файла с обложкой. Жму F9. Отладчик тормозит выполнение на обращении к строке "skin" - это каталог, где лежат скины. И далее видна функция из библиотеки DuiLib - SetSkinPath@CPaintManagerUI@DuiLib - установки пути к файлам обложек. А еще чуть ниже по коду вызов функции SetResourceZip@CPaintManagerUI@DuiLib - установка архива с ресурсами. Отладчик как раз выводит комментарий, какой архив с ресурсами будет установлен (см. предыдущую инструкцию выше "skin_en.skin").
Скрин 10
Устанавливаю ВР на вызов функции SetResourceZip@CPaintManagerUI@DuiLib и по F9 перехожу к ней, а все ранее установленные ВР (в списке жестких строк) удаляю.
(лимит вложений, продолжу в следующем сообщении){insert-8491}
По F7 захожу в эту функцию. Теперь я коде библиотеки ycomuiu.dll (DuiLib). Рассуждаю так: библиотека работает с архивами ZIP, если с ним какая-то беда, то должны быть соответствующие сообщения. Исходя из этого задаю поиск жестких строк и ввожу ключ "zip". Ранее я также искал по ключу "pass" как здесь, так и в файле программы.
Скрин 11
Перехожу в код к первой строке "Could not find...". Просматриваю листинг функции от начала до конца, в котором видно, что все сообщения об ошибке находятся в ней, а сама функция называется LoadFromFile@CMarkup@DuiLib.
Скрин 12
Подымаюсь в начало функции и ставлю ВР. Затем продолжаю выполнение программы по F9. Стопоримся на нашей ВР в начале функции.
Скрин 13
В комментариях отладчика видим, что будет читаться файл skin.xml. При это я знаю, что этот файл находится в архиве обложки skin_en.skin. Это я выяснил, когда просматривал каталог установки и файлы приложения после установки. Файловый менеджер Тотал Сommander позволяет просматривать содержимое архивов без их распаковки. Раз файл читается из архива, значит где-то здесь он должен быть сначала распакован. Далее в пошаговом режиме F8 начинаю прохождение функции LoadFromFile@CMarkup@DuiLib и обращаю внимание на имена вызываемых подфункций - они говорят о конкретных операциях. Например, GetResourcePath@CPaintManagerUI@DuiLib - получение пути к ресурсу, GetResourceZip@CPaintManagerUI@DuiLib - получение ресурса архива и т.д. Также по комментариям отладчика смотрим пути и файлы, которые обрабатываются. Так добираемся до первого условного перехода.
Скрин 14
Смотрю куда он идет. Попутно отмечаю, что все сообщения об ошибках чтения архива zip остаются позади, как и должно быть, если с архивом все в порядке. По месту перехода ниже идет вызов подфункции GetData@CStdString@DuiLib - получение данных.
Скрин 15
Ставлю на ней ВР и продолжаю выполнение. После выполняю функцию - F8. В регистре EAX вижу полный путь к файлу skin_en.skin:
Скрин 16
Далее продолжаю выполнение в пошаговом режиме, но уже с заходом в продпрограммы! Как раз следующая инструкция выполняет вызов подпрограммы. Захожу в неё. Она небольшая с вызовом следующей подпрограммы. Захожу и в неё. И вот здесь явно видно используемый пароль (начни выполнение подпрограммы по F8, чтобы комментарии отладчика изменились).
Скрин 17
Так как исходники библиотеки DuiLib открыты, то я в них заглянул и увидел, что функция SetResourceZip, которую мы видели в исполняемом файле (смотри скрин 10), в качестве параметра принимает также и строку с паролем:
Скрин 18
Но разработчик приложения использовал один общий пароль и вшил его в саму библиотеку, поэтому в параметрах этой функции строки с паролем мы не наблюдали. Из листинга видно, что архив открывается непосредственно процедурой OpenZip, которой передается пароль. Произведя её поиск по исходному коду библиотеки я выяснил, что она также используется в функции LoadFromFile - которая отвечает за загрузку ресурса из внешнего файла. Вот часть кода этой функции:
Скрин 19
Здесь хорошо видны сообщения об ошибках, которые мы и наблюдали под отладчиком в библиотеке DuiLib файла ycomuiu.dll. Но, допустим, если удалить архив (переименовать, заменить на другой и т.п.), то вы эти сообщения не увидите. Библиотека внешняя, поэтому все сообщения поступающие из внешних библиотек программисты обрабатывают по своему усмотрению, знанию и опыту. Могут вообще не обрабатывать, если программист начинающий, тогда получится исключение (сбой). Или вводят свои сообщения. В данном случае программа просто сообщит "Missing Skins, the software cannot be launched, please reinstall the program." А вот, что конкретно произошло, автор решил пользователю не сообщать. Да и не нужно это обычному пользователю. Переустанови программу и проблема исчезнет.
В будущем, если попадутся программы с использованием этой библиотеки оформления приложений, можно сразу ориентироваться на обращение к функциям SetResourceZip и LoadFromFile. Хотя не исключено, что разработчик может чего-то намудрить.{insert-8492}
// ================================================================ //
// Дешифровка языковых файлов программы EasePaint Watermark Expert
// Автор: Krig (специально для форума https://wylek.ru/)
// Дата создания: 23 марта 2020
// ================================================================ //
// Выбираем и открываем файл (Message или UI)
Open "?"
// Выводим на экран предупреждение.
MessageBox "В файле будут сделаны необратимые изменения. Вы хотите продолжить?"
// Инициализация переменных
Assign BytePos 0
Assign FileSize GetSize
Assign FileSize (FileSize-9) // коррекция размера для счетчика
// --- Основной блок обработки (цикл) ---
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Label ContinueHere
//
Goto BytePos // переход в позицию
Read ByteData 1 // чтение первого байта
Assign ByteData (ByteData*256)
Read ByteData1 1 // чтение второго байта
Assign ByteData (ByteData+ByteData1)
// Обработка первого файла
Assign ByteXOR ((ByteData^0x2424)/256)
// Обработка второго байта
Assign ByteData1 ((ByteData%0x100)^0x24)
// Смещение позиции курсора на 2 байта назад
Move -2
Write2 ByteXOR // запись первого байта
Write2 ByteData1 // запись второго байта
Assign NullFile (FileSize-BytePos)
IfGreater 0 NullFile
JumpTo ContinueHere2 // выход из цикла
Else
Assign BytePos (BytePos+0x4) // следующая позиция
JumpTo ContinueHere // переход в начало цикла
EndIf
// --- Конец цикла ---
Label ContinueHere2
// --- Добавление символов новой строки (формат МАС) ---
Goto 0
ReplaceAll 0x000000 0x000D00
Goto 0
ReplaceAll 0xFF0000 0xFF0D00
Goto 0
ReplaceAll 0x023000 0x2E000D
// --- Освобождение переменных ---
Release BytePos
Release FileSize
Release ByteXOR
Release NullFile
Release ByteData
Release ByteData1
// Выводим сообщение
MessageBox "Дешифровка файла завершена успешно! Теперь сохраните данные в новый файл с расширением TXT или INI."
// Диалог сохранения данных в новый файл (укажите расширение файла TXT или INI)
SaveAs "?"
// Завершение сценария и выход из редактора
Exit
Архив с файлом скрипта:
В архиве находится файл Decode.whs. Распакуйте его и скопируйте в папку WinHEX (или в папку скриптов, согласно настроек редактора). Запустите WinHEX, откройте стартовое окно (через меню "Инструменты" или клавишей Enter), в разделе скриптов выберите Decode и нажмите ОК. Начнется выполнение скрипта: выберите файл Message или UI, дождитесь завершения работы скрипта, затем сохраните обработанные данные в новый файл с расширением TXT или INI. Вы можете легко изменить логику скрипта, добавить или удалить команды, а также усовершенствовать (например, добавить шифрование, сделать возможным обработку другого файла и т.д. и т.п.). Описание команд скрипта вы найдете в справке WinHEX. Создавать и редактировать скрипты WinHEX можно обычным текстовым редактором (кодировка ANSI).