Расшифровка языковых файлов Download Master
Расшифровка языковых файлов Download Master
Уже много лет я пользуюсь удобным менеджером закачек Download Master от компании WestByte Software, и за это время покрутил его со всех сторон, в том числе и изнутри. По сути Download Master является бесплатной (если не считать баннеры) версией другого коммерческого продукта этой же компании - Internet Download Accelerator, который ориентирован на зарубежных покупателей. А чтобы было нельзя использовать Download Master с зарубежными локализациями интерфейса, все языковые файлы в нем хранятся в шифрованном виде. То есть нельзя взять, например, французский языковой файл от платного Internet Download Accelerator, подложить его в бесплатный Download Master и получить полноценную бесплатную французскую версию программы.
Раз есть что-то зашифрованное, то почему бы не попробовать это расшифровать? Лично мне вполне хватает русского интерфейса Download Master, поэтому исследование проводилось "just for fun", без каких-либо конкретных целей. Забегая вперед скажу, что алгоритмы шифрования не меняются, программа часто обновляется, поэтому привязки к какой-то версии не будет, главное понять сам принцип.
Скачаем дистрибутив портативной версии, распакуем его куда-нибудь на диск. Ну а для примера возьмем украинский файл локализации.
Меню выбора языка
Сперва отправим исполняемый файл dmaster.exe в дизассемблер и поищем что-нибудь, связанное со строкой "Ukrainian". Первым же попаданием найдется вот такой блок кода:
Code (Assembler) : Убрать нумерацию
- CODE:00639E62 mov eax, [ebp+var_8]
- ; Сравнить что-то со строкой "Ukrainian"
- CODE:00639E65 mov edx, offset _str_Ukrainian.Text
- CODE:00639E6A call @System@@LStrCmp$qqrv
- ; System::__linkproc__ LStrCmp(void)
- CODE:00639E6F jnz short loc_639ED4
- CODE:00639E71 mov eax, ds:off_734550
- CODE:00639E76 mov eax, [eax]
- CODE:00639E78 mov edx, [eax+0D34h]
- CODE:00639E7E lea eax, [ebp+var_24]
- ; Задействовать файл "dmaster1.dat"
- CODE:00639E81 mov ecx, offset _str_dmaster1_dat.Text
- CODE:00639E86 call @System@@LStrCat3$qqrv
- ; System::__linkproc__ LStrCat3(void)
- CODE:00639E8B mov eax, [ebp+var_24]
- ; Проверить наличие этого файла
- CODE:00639E8E call @Sysutils@FileExists$qqrx17System
- ; Sysutils::FileExists(System::AnsiString)
- CODE:00639E93 test al, al
- CODE:00639E95 jz short loc_639ED4
- CODE:00639E97 lea eax, [ebp+var_28]
- CODE:00639E9A push eax
- CODE:00639E9B mov eax, ds:off_734550
- CODE:00639EA0 mov eax, [eax]
- CODE:00639EA2 mov edx, [eax+0D34h]
- CODE:00639EA8 lea eax, [ebp+var_2C]
- CODE:00639EAB mov ecx, offset _str_dmaster1_dat.Text
- CODE:00639EB0 call @System@@LStrCat3$qqrv
- ; System::__linkproc__ LStrCat3(void)
- CODE:00639EB5 mov eax, [ebp+var_2C]
- CODE:00639EB8 xor ecx, ecx
- CODE:00639EBA mov edx, 73110h
- CODE:00639EBF call sub_4AA750
- CODE:00639EC4 mov edx, [ebp+var_28]
- CODE:00639EC7 mov eax, [ebp+var_10]
- CODE:00639ECA mov ecx, [eax]
- CODE:00639ECC call dword ptr [ecx+2Ch]
Code (Assembler) : Убрать нумерацию
- CODE:00639EB5 mov eax, [ebp+var_2C]
- CODE:00639EB8 xor ecx, ecx
- CODE:00639EBA mov edx, 73110h
- CODE:00639EBF call sub_4AA750
Code (Assembler) : Убрать нумерацию
- CODE:004AA750 push ebp
- CODE:004AA751 mov ebp, esp
- CODE:004AA753 add esp, 0FFFFFFE8h
- CODE:004AA756 push ebx
- CODE:004AA757 push esi
- CODE:004AA758 push edi
- CODE:004AA759 xor ebx, ebx
- CODE:004AA75B mov [ebp+var_18], ebx
- CODE:004AA75E mov [ebp+var_14], ebx
- CODE:004AA761 mov [ebp+var_9], cl
- CODE:004AA764 mov [ebp+var_8], edx
- CODE:004AA767 mov [ebp+var_4], eax
- CODE:004AA76A mov eax, [ebp+var_4]
- CODE:004AA76D call @System@@LStrAddRef$qqrpv
- ; System::__linkproc__ LStrAddRef(void *)
- CODE:004AA772 xor eax, eax
- CODE:004AA774 push ebp
- CODE:004AA775 push offset loc_4AA8C7
- CODE:004AA77A push dword ptr fs:[eax]
- CODE:004AA77D mov fs:[eax], esp
- CODE:004AA780 mov eax, [ebp+arg_0]
- CODE:004AA783 call @System@@LStrClr$qqrpv
- ; System::__linkproc__ LStrClr(void *)
- CODE:004AA788 mov eax, [ebp+var_4]
- CODE:004AA78B call @Sysutils@FileExists$qqrx17System
- ; Sysutils::FileExists(System::AnsiString)
- CODE:004AA790 test al, al
- CODE:004AA792 jz loc_4AA8A4
- CODE:004AA798 xor eax, eax
- CODE:004AA79A push ebp
- CODE:004AA79B push offset loc_4AA89A
- CODE:004AA7A0 push dword ptr fs:[eax]
- CODE:004AA7A3 mov fs:[eax], esp
- CODE:004AA7A6 xor edx, edx
- CODE:004AA7A8 mov eax, [ebp+var_4]
- CODE:004AA7AB call @Sysutils@FileOpen$qqrx17System
- ; Sysutils::FileOpen(System::AnsiString,uint)
- CODE:004AA7B0 mov ebx, eax
- CODE:004AA7B2 mov ecx, 2 ; dwMoveMethod
- CODE:004AA7B7 xor edx, edx ; lDistanceToMove
- CODE:004AA7B9 mov eax, ebx ; hFile
- CODE:004AA7BB call sub_40DA70
- CODE:004AA7C0 mov esi, eax
- CODE:004AA7C2 xor ecx, ecx ; dwMoveMethod
- CODE:004AA7C4 xor edx, edx ; lDistanceToMove
- CODE:004AA7C6 mov eax, ebx ; hFile
- CODE:004AA7C8 call sub_40DA70
- CODE:004AA7CD lea eax, [esi+1]
- CODE:004AA7D0 call @Sysutils@AllocMem$qqrui
- ; Sysutils::AllocMem(uint)
- CODE:004AA7D5 mov [ebp+lpBuffer], eax
- CODE:004AA7D8 xor eax, eax
- CODE:004AA7DA push ebp
- CODE:004AA7DB push offset loc_4AA889
- CODE:004AA7E0 push dword ptr fs:[eax]
- CODE:004AA7E3 mov fs:[eax], esp
- CODE:004AA7E6 mov edx, [ebp+lpBuffer] ; lpBuffer
- CODE:004AA7E9 mov ecx, esi
- ; nNumberOfBytesToRead
- CODE:004AA7EB mov eax, ebx ; hFile
- CODE:004AA7ED call sub_40DA18
- CODE:004AA7F2 mov esi, eax
- CODE:004AA7F4 mov eax, ebx ; hObject
- CODE:004AA7F6 call sub_40DAB4
- CODE:004AA7FB lea eax, [ebp+var_14]
- CODE:004AA7FE call @System@@LStrClr$qqrpv
- ; System::__linkproc__ LStrClr(void *)
- CODE:004AA803 cmp [ebp+var_9], 0
- CODE:004AA807 jz short loc_4AA813
- ...
Code (Assembler) : Убрать нумерацию
- ; Ключ расшифровки - та самая загадочная константа, которая была
- ; передана в функцию расшифровки
- CODE:004AA818 mov edx, [ebp+var_8]
- ...
- ; Указатель на начало прочитанного файла
- CODE:004AA823 xor edi, edi
- CODE:004AA825 loc_4AA825:
- CODE:004AA825 mov eax, [ebp+lpBuffer]
- ; Взять следующий зашифрованный байт
- CODE:004AA828 mov bl, [eax+edi]
- ...
- CODE:004AA841 loc_4AA841:
- ; Вычислить байт для расшифровки
- CODE:004AA841 mov eax, 0FFh
- CODE:004AA846 call unknown_libname_41
- ; Расшифровать байт
- CODE:004AA84B xor al, bl
- CODE:004AA84D mov ebx, eax
- CODE:004AA84F loc_4AA84F:
- CODE:004AA84F lea eax, [ebp+var_18]
- CODE:004AA852 mov edx, ebx
- ; Преобразовать байт в символ
- CODE:004AA854 call unknown_libname_76
- ; BDS 2005-2007 and Delphi6-7 Visual Component Library
- CODE:004AA859 mov edx, [ebp+var_18]
- CODE:004AA85C lea eax, [ebp+var_14]
- ; Сохранить расшифрованный символ
- CODE:004AA85F call @System@@LStrCat$qqrv
- ; System::__linkproc__ LStrCat(void)
- CODE:004AA864 inc edi
- CODE:004AA865 dec esi
- CODE:004AA866 jnz short loc_4AA825
Code (Assembler) : Убрать нумерацию
- CODE:00403C44 unknown_libname_41 proc near
- CODE:00403C44 push ebx
- CODE:00403C45 xor ebx, ebx
- ; Умножить текущее значение ключа на 8088405h
- CODE:00403C47 imul edx, ds:dword_720008[ebx], 8088405h
- ; Увеличить текущее значение ключа на 1
- CODE:00403C51 inc edx
- CODE:00403C52 mov ds:dword_720008[ebx], edx
- CODE:00403C58 mul edx
- CODE:00403C5A mov eax, edx
- CODE:00403C5C pop ebx
- CODE:00403C5D retn
- CODE:00403C5D unknown_libname_41 endp
Code (Assembler) : Убрать нумерацию
- ; Начальный ключ расшифровки
- mov [key],73110h
- xor esi,esi
- loc_decrypt:
- ; Модифицировать ключ расшифровки
- mov eax,0FFh
- imul edx,[key],8088405h
- inc edx
- mov [key],edx
- mul edx
- ; Расшифровать байт
- xor byte [buff+esi],dl
- ; Следующий байт
- inc esi
- cmp esi,[file_size]
- jb loc_decrypt
Code (Assembler) : Убрать нумерацию
- ; Транслит
- CODE:00639F27 mov eax, [ebp+var_38]
- CODE:00639F2A xor ecx, ecx
- CODE:00639F2C mov edx, 8D87AFh
- CODE:00639F31 call sub_4AA750
Code (Assembler) : Убрать нумерацию
- ; Белорусский язык
- CODE:00639F99 mov eax, [ebp+var_44]
- CODE:00639F9C xor ecx, ecx
- CODE:00639F9E mov edx, 31FA2Fh
- CODE:00639FA3 call sub_4AA750
Download Master с испанским интерфейсом
Вот, к примеру, по этому алгоритму был зашифрован испанский языковой файл от Internet Download Accelerator, после чего им был заменен оригинальный файл dmaster1.dat в папке Download Master. В языковых настройках Download Master выбираем "Ukrainian", а именно он соответствует этому файлу, и через несколько секунд получаем бесплатный Download Master, но уже на испанском языке.
Просмотров: 7254 | Комментариев: 11
Метки: реверсинг
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(25.02.2018 в 13:01):
\Application Data\DMBackUp\
Просто скопировать нужный файл оттуда. Только какое отношение это имеет к теме статьи?
Просто скопировать нужный файл оттуда. Только какое отношение это имеет к теме статьи?
Иван
(25.02.2018 в 12:13):
Доброго времени суток!
Также давно пользуюсь Dowload master. Хорошая программа.
Но вот на днях случилась катавасия. Накопил в списке закачек около 400 ссылок и не сохранял. Надеялся на программу, которая даже после аварийного завершения Windows автоматически загружала список обратно. Но в последний раз сам DM аварийно завершил работу из-за нехватки памяти (работал в VMWare) и после перезапуска выдал окно в вопросом "Список закачек пуст, восстановить его из резервной копии?". Надо было конечно ответить положительно, но, замкнуло и ответил "нет". И, конечно, список не восстановился. И вот такой вопрос: где находится этот резервный список закачек? Или он очистился после отрицательного ответа на вопрос? И каким можно снова заставить DM задать вопрос о восстановлении списка закачек, например, через какой-либо параметр в файле настроеr dmaster.ini. У меня DM v6.01 portable.
Также давно пользуюсь Dowload master. Хорошая программа.
Но вот на днях случилась катавасия. Накопил в списке закачек около 400 ссылок и не сохранял. Надеялся на программу, которая даже после аварийного завершения Windows автоматически загружала список обратно. Но в последний раз сам DM аварийно завершил работу из-за нехватки памяти (работал в VMWare) и после перезапуска выдал окно в вопросом "Список закачек пуст, восстановить его из резервной копии?". Надо было конечно ответить положительно, но, замкнуло и ответил "нет". И, конечно, список не восстановился. И вот такой вопрос: где находится этот резервный список закачек? Или он очистился после отрицательного ответа на вопрос? И каким можно снова заставить DM задать вопрос о восстановлении списка закачек, например, через какой-либо параметр в файле настроеr dmaster.ini. У меня DM v6.01 portable.
ManHunter
(17.07.2014 в 11:17):
Удаляем папку temp и получаем один, но постоянный баннер Download Master. Это не считая всяких кнопок "разместить рекламу", "мнение о закачке" и прочий хлам. Патчи пишутся и применяются не от нефиг делать.
Жека
(17.07.2014 в 01:07):
Soso, удаляем папку temp со всем содержимым, в директории установленной программа и вот и весь патч для удаления рекламы.
Soso
(17.12.2013 в 04:55):
>"На руборде мой патч" - хочется увидить обновленную версию с добавлением новых и эТой опций !)
Спасибо и Удачи .
Спасибо и Удачи .
DimitarSerg
(24.11.2013 в 15:42):
>Еще требует уточнения загадочная функция unknown_libname_41:
Это Random (еще точнее procedure _RandInt) же стандарный дельфовский, где dword_720008 - RandSeed.
Использьование данной функции в качестве функции шифровки/дешифровки видел в регистрационной схеме TurboLaunch, а также в кастомном шифре Total Commander'a (сразу после rsa-расшифровки данных ключа).
Это Random (еще точнее procedure _RandInt) же стандарный дельфовский, где dword_720008 - RandSeed.
Использьование данной функции в качестве функции шифровки/дешифровки видел в регистрационной схеме TurboLaunch, а также в кастомном шифре Total Commander'a (сразу после rsa-расшифровки данных ключа).
ManHunter
(02.11.2013 в 13:20):
На руборде мой патч против рекламы выложен аж с 2006 года.
hoper
(02.11.2013 в 13:19):
Еще-бы и рекламу убрать.
ManHunter
(31.10.2013 в 17:27):
Если я не ошибаюсь, то для этого достаточно будет зaNOPить две команды в исходном файле:
CODE:004AA84B xor al, bl
CODE:004AA84D mov ebx, eax
И все, файл будет читаться как есть и не расшифровываться, можно будет подкладывать нешифрованные файлы. Только это придется делать после каждого обновления DM.
CODE:004AA84B xor al, bl
CODE:004AA84D mov ebx, eax
И все, файл будет читаться как есть и не расшифровываться, можно будет подкладывать нешифрованные файлы. Только это придется делать после каждого обновления DM.
Compiller
(31.10.2013 в 17:23):
А можно просто убрать шифрование и заставить DownloadMaster работать с незашифрованным языковым файлом?
И полученные таким образом файлы локализации работают с неломанной версией?
И полученные таким образом файлы локализации работают с неломанной версией?
Добавить комментарий
Заполните форму для добавления комментария
Комментарии отключены администратором сайта
К теме статьи мой вопрос не имеет абсолютно никакого отношения.
Просто в поиске информации набрел на эту страницу, и поскольку мой вопрос на форуме, посвященном DM проигнорировали, решил задать его здесь. И получил исчерпывающий ответ. Спасибо.