Обратная разработка одного проприетарного алгоритма шифрования

в 13:16, , рубрики: ollydbg, безопасность через неясность
Алиса AI, "Хакер взломал шифрование", КДПВ

Алиса AI, "Хакер взломал шифрование", КДПВ

Одно время я занимался разработкой порта «Малой экспертной системы 2.0», который бы поддерживал базы знаний для этой программы и при этом был кросс‑платформенным. Программа поддерживала два формата: обычные базы знаний и шифрованные. Если с обычными базами знаний всё было более‑менее в порядке, то шифрованные базы знаний не поддавались ровно до тех пор, пока я не заглянул в машинные коды. В этой статье мы рассмотрим, как была реализована одна из схем сокрытия данных, основанная на принципе «безопасность через неясность».

Предыстория

В 2023 году я проходил дополнительное обучение по направлению «Искусственный интеллект в сфере энергетики». Честно говоря, я особо не имел достаточного времени, поскольку в первую очередь я тогда занимался основной учёбой, и в конечном итоге особо занятий не посещал. Тем не менее, в самом начале я ходил на занятия и даже кое‑что изучал.

На первых занятиях нам рассказывали об экспертных системах байесовского вывода и в качестве примера приводилась «Малая экспертная система 2.0», которая представляла из себя очень старую программу для Windows и на Windows 11 (по крайней мере, у меня) запускалась с неправильной кодировкой. Естественно, мне захотелось эту программу адаптировать к современным версиям Windows, что означало, по сути, обратную разработку, так как исходных кодов не было.

Если с форматом баз знаний всё было в порядке, и я даже смог путём некоторого исследования и вопросов к автору реконструировать алгоритм работы, то с так называемыми зашифрованными файлами возникли кое-какие проблемы.

Краткий обзор программы

Малая экспертная система 2.0 — это систему байесовского вывода на основе баз знаний, разработанная в 2000 году Алексеем Бухниным, на тот момент — студентом 3-го курса НГТУ, для Windows 95/98. Программа изначально была размещена на его личном сайте, и на сегодняшний день доступна только в веб‑архиве, если не учитывать некоторые сторонние ресурсы.

По информации с официального сайта, «Малая экспертная система 2.0» поставляется также вместе с «Редактором баз знаний 1.0», который позволяет создавать и проверять базы знаний на корректность. Программа работает с базами знаний, которые являются, по сути, текстовыми файлами, состоящими из трёх секций: комментария, списка вопросов (свидетельств) и списка гипотез в формате CSV. Однако помимо простых текстовых файлов, предусмотренные также и так называемые шифрованные файлы, которые требовали пароля для редактирования или для чтения. Все они имеют расширение MKB.

Программа распространяется в виде нормального полноценного установщика, сгенерированного при помощи Ghost Installer. Если открыть установочный дистрибутив в WinRAR, можно в папке Data обнаружить все файлы, которые будут установлены на компьютер:

Состав архива MiniES2Install.exe
Состав архива MiniES2Install.exe

Как видно на рисунке выше, и сама «Малая ЭС», и «Редактор баз знаний» — это EXE‑файлы, которые, по всей видимости, слинкованы статически. Если посмотреть строки, которые содержатся внутри этих файлов, то можно заметить, что Малая экспертная система была написана на Borland C++ Builder с использованием Borland VCL:

Вывод команды strings MiniES.exe | grep Borland

Вывод команды strings MiniES.exe | grep Borland

Вместе с программой поставляется справка в формате WinHelp, которая на современных версиях Windows не открывается, однако её можно просмотреть в Windows XP и более ранних версиях.

Чтобы, однако, судить о том, что делает эта программа, нужно будет заглянуть в исходные коды. Для этого я использовал 86Box с установленной Windows 98 SE и отладчиком OllyDbg.

Ищем процедуру загрузки базы знаний

Чтобы раскрыть алгоритм шифрования базы знаний, необходимо понять, откуда начинать отладку машинных кодов. Отправной точкой для расшифровки базы знаний является её загрузка из файла. Чтобы наткнуться на процедуру загрузки, я решил перехватывать функцию WinAPI MessageBox, так как она обычно вызывается при ошибке.

Ищем строку в памяти, которая соответствует одному из сообщений об ошибке (она доступна по адресу 0x47С510) и место, где мы к ней обращаемся.

Место нахождения искомой строки

Место нахождения искомой строки
Обратная разработка одного проприетарного алгоритма шифрования - 5

Мы наткнулись на процедуру загрузки базы знаний, которая находится по адресу 0x401E94.

Обратная разработка одного проприетарного алгоритма шифрования - 6

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

Ищем процедуры считывания файла

Внутри функции 0x401E94 вызывается функция 0x40891C, которая отвечает за считывание строк из файла. Внутри функции, по всей видимости, происходит некий непрямой вызов:

Обратная разработка одного проприетарного алгоритма шифрования - 7

Ставим точку останова и переходим на адрес 0x40731C, который вызывает функцию 0x40A318. В этой функции тоже есть непрямой вызов функции 0x40B604, которая вызывает функцию 0x40B4C4, которая, по всей видимости, представляет собой некое сжатие:

Дизассемблированная функция сжатия
0040B4C4  /$ 55             PUSH EBP
0040B4C5  |. 8BEC           MOV EBP,ESP
0040B4C7  |. 51             PUSH ECX
0040B4C8  |. 53             PUSH EBX
0040B4C9  |. 56             PUSH ESI
0040B4CA  |. 57             PUSH EDI
0040B4CB  |. 8B7D 08        MOV EDI,DWORD PTR SS:[EBP+8]
0040B4CE  |. C645 FF 00     MOV BYTE PTR SS:[EBP-1],0
0040B4D2  |. 33F6           XOR ESI,ESI
0040B4D4  |> 8B4F 24        /MOV ECX,DWORD PTR DS:[EDI+24]
0040B4D7  |. 33DB           |XOR EBX,EBX
0040B4D9  |. 8A5F 3C        |MOV BL,BYTE PTR DS:[EDI+3C]
0040B4DC  |. D3E3           |SHL EBX,CL
0040B4DE  |. C1FB 07        |SAR EBX,7
0040B4E1  |. 80E3 01        |AND BL,1
0040B4E4  |. FF47 24        |INC DWORD PTR DS:[EDI+24]
0040B4E7  |. 8B47 24        |MOV EAX,DWORD PTR DS:[EDI+24]
0040B4EA  |. 83F8 07        |CMP EAX,7
0040B4ED  |. 7E 2F          |JLE SHORT MINIES.0040B51E
0040B4EF  |. 33D2           |XOR EDX,EDX
0040B4F1  |. 8957 24        |MOV DWORD PTR DS:[EDI+24],EDX
0040B4F4  |. 8B4F 30        |MOV ECX,DWORD PTR DS:[EDI+30]
0040B4F7  |. 3B4F 34        |CMP ECX,DWORD PTR DS:[EDI+34]
0040B4FA  |. 7D 1B          |JGE SHORT MINIES.0040B517
0040B4FC  |. FF47 30        |INC DWORD PTR DS:[EDI+30]
0040B4FF  |. 8B47 38        |MOV EAX,DWORD PTR DS:[EDI+38]
0040B502  |. 8B57 30        |MOV EDX,DWORD PTR DS:[EDI+30]
0040B505  |. 8A0C10         |MOV CL,BYTE PTR DS:[EAX+EDX]
0040B508  |. 51             |PUSH ECX                                ; /Arg2
0040B509  |. 57             |PUSH EDI                                ; |Arg1
0040B50A  |. E8 65FBFFFF    |CALL MINIES.0040B074                    ; MINIES.0040B074
0040B50F  |. 83C4 08        |ADD ESP,8
0040B512  |. 8847 3C        |MOV BYTE PTR DS:[EDI+3C],AL
0040B515  |. EB 07          |JMP SHORT MINIES.0040B51E
0040B517  |> 8B47 34        |MOV EAX,DWORD PTR DS:[EDI+34]
0040B51A  |. 40             |INC EAX
0040B51B  |. 8947 30        |MOV DWORD PTR DS:[EDI+30],EAX
0040B51E  |> 80FB 01        |CMP BL,1
0040B521  |. 75 0A          |JNZ SHORT MINIES.0040B52D
0040B523  |. B8 02000000    |MOV EAX,2
0040B528  |. E9 AC000000    |JMP MINIES.0040B5D9
0040B52D  |> 8B4F 24        |MOV ECX,DWORD PTR DS:[EDI+24]
0040B530  |. 33DB           |XOR EBX,EBX
0040B532  |. 8A5F 3C        |MOV BL,BYTE PTR DS:[EDI+3C]
0040B535  |. D3E3           |SHL EBX,CL
0040B537  |. C1FB 07        |SAR EBX,7
0040B53A  |. 80E3 01        |AND BL,1
0040B53D  |. FF47 24        |INC DWORD PTR DS:[EDI+24]
0040B540  |. 8B47 24        |MOV EAX,DWORD PTR DS:[EDI+24]
0040B543  |. 83F8 07        |CMP EAX,7
0040B546  |. 7E 2F          |JLE SHORT MINIES.0040B577
0040B548  |. 33D2           |XOR EDX,EDX
0040B54A  |. 8957 24        |MOV DWORD PTR DS:[EDI+24],EDX
0040B54D  |. 8B4F 30        |MOV ECX,DWORD PTR DS:[EDI+30]
0040B550  |. 3B4F 34        |CMP ECX,DWORD PTR DS:[EDI+34]
0040B553  |. 7D 1B          |JGE SHORT MINIES.0040B570
0040B555  |. FF47 30        |INC DWORD PTR DS:[EDI+30]
0040B558  |. 8B47 38        |MOV EAX,DWORD PTR DS:[EDI+38]
0040B55B  |. 8B57 30        |MOV EDX,DWORD PTR DS:[EDI+30]
0040B55E  |. 8A0C10         |MOV CL,BYTE PTR DS:[EAX+EDX]
0040B561  |. 51             |PUSH ECX                                ; /Arg2
0040B562  |. 57             |PUSH EDI                                ; |Arg1
0040B563  |. E8 0CFBFFFF    |CALL MINIES.0040B074                    ; MINIES.0040B074
0040B568  |. 83C4 08        |ADD ESP,8
0040B56B  |. 8847 3C        |MOV BYTE PTR DS:[EDI+3C],AL
0040B56E  |. EB 07          |JMP SHORT MINIES.0040B577
0040B570  |> 8B47 34        |MOV EAX,DWORD PTR DS:[EDI+34]
0040B573  |. 40             |INC EAX
0040B574  |. 8947 30        |MOV DWORD PTR DS:[EDI+30],EAX
0040B577  |> 84DB           |TEST BL,BL
0040B579  |. 75 07          |JNZ SHORT MINIES.0040B582
0040B57B  |. B8 04000000    |MOV EAX,4
0040B580  |. EB 57          |JMP SHORT MINIES.0040B5D9
0040B582  |> 8B4F 24        |MOV ECX,DWORD PTR DS:[EDI+24]
0040B585  |. 33DB           |XOR EBX,EBX
0040B587  |. 8A5F 3C        |MOV BL,BYTE PTR DS:[EDI+3C]
0040B58A  |. D3E3           |SHL EBX,CL
0040B58C  |. C1FB 07        |SAR EBX,7
0040B58F  |. 80E3 01        |AND BL,1
0040B592  |. FF47 24        |INC DWORD PTR DS:[EDI+24]
0040B595  |. 8B47 24        |MOV EAX,DWORD PTR DS:[EDI+24]
0040B598  |. 83F8 07        |CMP EAX,7
0040B59B  |. 7E 2F          |JLE SHORT MINIES.0040B5CC
0040B59D  |. 33D2           |XOR EDX,EDX
0040B59F  |. 8957 24        |MOV DWORD PTR DS:[EDI+24],EDX
0040B5A2  |. 8B4F 30        |MOV ECX,DWORD PTR DS:[EDI+30]
0040B5A5  |. 3B4F 34        |CMP ECX,DWORD PTR DS:[EDI+34]
0040B5A8  |. 7D 1B          |JGE SHORT MINIES.0040B5C5
0040B5AA  |. FF47 30        |INC DWORD PTR DS:[EDI+30]
0040B5AD  |. 8B47 38        |MOV EAX,DWORD PTR DS:[EDI+38]
0040B5B0  |. 8B57 30        |MOV EDX,DWORD PTR DS:[EDI+30]
0040B5B3  |. 8A0C10         |MOV CL,BYTE PTR DS:[EAX+EDX]
0040B5B6  |. 51             |PUSH ECX                                ; /Arg2
0040B5B7  |. 57             |PUSH EDI                                ; |Arg1
0040B5B8  |. E8 B7FAFFFF    |CALL MINIES.0040B074                    ; MINIES.0040B074
0040B5BD  |. 83C4 08        |ADD ESP,8
0040B5C0  |. 8847 3C        |MOV BYTE PTR DS:[EDI+3C],AL
0040B5C3  |. EB 07          |JMP SHORT MINIES.0040B5CC
0040B5C5  |> 8B47 34        |MOV EAX,DWORD PTR DS:[EDI+34]
0040B5C8  |. 40             |INC EAX
0040B5C9  |. 8947 30        |MOV DWORD PTR DS:[EDI+30],EAX
0040B5CC  |> 84DB           |TEST BL,BL
0040B5CE  |. 75 07          |JNZ SHORT MINIES.0040B5D7
0040B5D0  |. B8 06000000    |MOV EAX,6
0040B5D5  |. EB 02          |JMP SHORT MINIES.0040B5D9
0040B5D7  |> 33C0           |XOR EAX,EAX
0040B5D9  |> 8BC8           |MOV ECX,EAX
0040B5DB  |. 33D2           |XOR EDX,EDX
0040B5DD  |. 8A57 44        |MOV DL,BYTE PTR DS:[EDI+44]
0040B5E0  |. D3FA           |SAR EDX,CL
0040B5E2  |. 80E2 03        |AND DL,3
0040B5E5  |. 8BCE           |MOV ECX,ESI
0040B5E7  |. D2E2           |SHL DL,CL
0040B5E9  |. 0855 FF        |OR BYTE PTR SS:[EBP-1],DL
0040B5EC  |. 83C6 02        |ADD ESI,2
0040B5EF  |. 83FE 08        |CMP ESI,8
0040B5F2  |.^0F8C DCFEFFFF  JL MINIES.0040B4D4
0040B5F8  |. 8A45 FF        MOV AL,BYTE PTR SS:[EBP-1]
0040B5FB  |. 5F             POP EDI
0040B5FC  |. 5E             POP ESI
0040B5FD  |. 5B             POP EBX
0040B5FE  |. 59             POP ECX
0040B5FF  |. 5D             POP EBP
0040B600  . C3             RETN
Обратная разработка одного проприетарного алгоритма шифрования - 8

Код на ассемблере достаточно сложно разобрать, однако можно заметить, что из входного потока считывается по одному биту. Биты группируются в символы длиной от 1 до 3 бит, а далее каждый символ сопоставляется двухбитному сочетанию, или дуплету. В итоге четыре символа образуют один полный байт.

Для того, чтобы определить, какое из двухбитных сочетаний будет выведено, используется четырёхэлементный массив двухбитных значений, который как раз составляет 8 байт (обозначим его как алфавит дуплетов). Алфавит дуплетов формируется при упаковке базы знаний и основывается на частотности дуплетов во входном потоке.

Соответствие между символами кода и алфавитом дуплетов

Соответствие между символами кода и алфавитом дуплетов

Для того, чтобы считывать байты из входного потока, вызывается функция 0x40B074, которая использует некоторое внешнее состояние для детерминированной деобфускации:

Дизассемблированная функция распутывания
0040B074  /$ 55             PUSH EBP
0040B075  |. 8BEC           MOV EBP,ESP
0040B077  |. 51             PUSH ECX
0040B078  |. 53             PUSH EBX
0040B079  |. 56             PUSH ESI
0040B07A  |. 57             PUSH EDI
0040B07B  |. 33DB           XOR EBX,EBX
0040B07D  |. 8B75 08        MOV ESI,DWORD PTR SS:[EBP+8]
0040B080  |. 8A5D 0C        MOV BL,BYTE PTR SS:[EBP+C]
0040B083  |. C645 FE 80     MOV BYTE PTR SS:[EBP-2],80
0040B087  |. C645 FD 01     MOV BYTE PTR SS:[EBP-3],1
0040B08B  |. 8B46 28        MOV EAX,DWORD PTR DS:[ESI+28]
0040B08E  |. 81E3 FF000000  AND EBX,0FF
0040B094  |. 83F8 0F        CMP EAX,0F                               ;  Switch (cases 0..F)
0040B097  |. 0F87 45010000  JA MINIES.0040B1E2
0040B09D  |. FF2485 A4B0400>JMP DWORD PTR DS:[EAX*4+40B0A4]
0040B0A4  |. E4B04000       DD MINIES.0040B0E4                       ;  Switch table used at 0040B09D
0040B0A8  |. F3B04000       DD MINIES.0040B0F3
0040B0AC  |. 02B14000       DD MINIES.0040B102
0040B0B0  |. 11B14000       DD MINIES.0040B111
0040B0B4  |. 20B14000       DD MINIES.0040B120
0040B0B8  |. 2EB14000       DD MINIES.0040B12E
0040B0BC  |. 3DB14000       DD MINIES.0040B13D
0040B0C0  |. 4CB14000       DD MINIES.0040B14C
0040B0C4  |. 53B14000       DD MINIES.0040B153
0040B0C8  |. AFB14000       DD MINIES.0040B1AF
0040B0CC  |. B7B14000       DD MINIES.0040B1B7
0040B0D0  |. BFB14000       DD MINIES.0040B1BF
0040B0D4  |. C4B14000       DD MINIES.0040B1C4
0040B0D8  |. CCB14000       DD MINIES.0040B1CC
0040B0DC  |. D4B14000       DD MINIES.0040B1D4
0040B0E0  |. DCB14000       DD MINIES.0040B1DC
0040B0E4  |> C1E3 06        SHL EBX,6                                ;  Case 0 of switch 0040B094
0040B0E7  |. 8BD3           MOV EDX,EBX
0040B0E9  |. C1EA 08        SHR EDX,8
0040B0EC  |. 0BDA           OR EBX,EDX
0040B0EE  |. E9 EF000000    JMP MINIES.0040B1E2
0040B0F3  |> C1E3 03        SHL EBX,3                                ;  Case 1 of switch 0040B094
0040B0F6  |. 8BCB           MOV ECX,EBX
0040B0F8  |. C1E9 08        SHR ECX,8
0040B0FB  |. 0BD9           OR EBX,ECX
0040B0FD  |. E9 E0000000    JMP MINIES.0040B1E2
0040B102  |> C1E3 05        SHL EBX,5                                ;  Case 2 of switch 0040B094
0040B105  |. 8BC3           MOV EAX,EBX
0040B107  |. C1E8 08        SHR EAX,8
0040B10A  |. 0BD8           OR EBX,EAX
0040B10C  |. E9 D1000000    JMP MINIES.0040B1E2
0040B111  |> C1E3 02        SHL EBX,2                                ;  Case 3 of switch 0040B094
0040B114  |. 8BD3           MOV EDX,EBX
0040B116  |. C1EA 08        SHR EDX,8
0040B119  |. 0BDA           OR EBX,EDX
0040B11B  |. E9 C2000000    JMP MINIES.0040B1E2
0040B120  |> 03DB           ADD EBX,EBX                              ;  Case 4 of switch 0040B094
0040B122  |. 8BCB           MOV ECX,EBX
0040B124  |. C1E9 08        SHR ECX,8
0040B127  |. 0BD9           OR EBX,ECX
0040B129  |. E9 B4000000    JMP MINIES.0040B1E2
0040B12E  |> C1E3 07        SHL EBX,7                                ;  Case 5 of switch 0040B094
0040B131  |. 8BC3           MOV EAX,EBX
0040B133  |. C1E8 08        SHR EAX,8
0040B136  |. 0BD8           OR EBX,EAX
0040B138  |. E9 A5000000    JMP MINIES.0040B1E2
0040B13D  |> C1E3 04        SHL EBX,4                                ;  Case 6 of switch 0040B094
0040B140  |. 8BD3           MOV EDX,EBX
0040B142  |. C1EA 08        SHR EDX,8
0040B145  |. 0BDA           OR EBX,EDX
0040B147  |. E9 96000000    JMP MINIES.0040B1E2
0040B14C  |> F7D3           NOT EBX                                  ;  Case 7 of switch 0040B094
0040B14E  |. E9 8F000000    JMP MINIES.0040B1E2
0040B153  |> 33C0           XOR EAX,EAX                              ;  Case 8 of switch 0040B094
0040B155  |> 8BC8           /MOV ECX,EAX
0040B157  |. 8BD3           |MOV EDX,EBX
0040B159  |. D3EA           |SHR EDX,CL
0040B15B  |. 80E2 01        |AND DL,1
0040B15E  |. B9 07000000    |MOV ECX,7
0040B163  |. 8855 FF        |MOV BYTE PTR SS:[EBP-1],DL
0040B166  |. 8BD0           |MOV EDX,EAX
0040B168  |. 03D2           |ADD EDX,EDX
0040B16A  |. 0FB67D FD      |MOVZX EDI,BYTE PTR SS:[EBP-3]
0040B16E  |. 2BCA           |SUB ECX,EDX
0040B170  |. 8BD3           |MOV EDX,EBX
0040B172  |. D3EA           |SHR EDX,CL
0040B174  |. 8BC8           |MOV ECX,EAX
0040B176  |. D3E7           |SHL EDI,CL
0040B178  |. 23D7           |AND EDX,EDI
0040B17A  |. 8BC8           |MOV ECX,EAX
0040B17C  |. 0FB67D FD      |MOVZX EDI,BYTE PTR SS:[EBP-3]
0040B180  |. D3E7           |SHL EDI,CL
0040B182  |. F7D7           |NOT EDI
0040B184  |. 23DF           |AND EBX,EDI
0040B186  |. 8BC8           |MOV ECX,EAX
0040B188  |. 0BD3           |OR EDX,EBX
0040B18A  |. 8BDA           |MOV EBX,EDX
0040B18C  |. 33D2           |XOR EDX,EDX
0040B18E  |. 8A55 FE        |MOV DL,BYTE PTR SS:[EBP-2]
0040B191  |. D3FA           |SAR EDX,CL
0040B193  |. F7D2           |NOT EDX
0040B195  |. 23DA           |AND EBX,EDX
0040B197  |. 33D2           |XOR EDX,EDX
0040B199  |. B9 07000000    |MOV ECX,7
0040B19E  |. 8A55 FF        |MOV DL,BYTE PTR SS:[EBP-1]
0040B1A1  |. 2BC8           |SUB ECX,EAX
0040B1A3  |. D3E2           |SHL EDX,CL
0040B1A5  |. 0BDA           |OR EBX,EDX
0040B1A7  |. 40             |INC EAX
0040B1A8  |. 83F8 04        |CMP EAX,4
0040B1AB  |.^7C A8          JL SHORT MINIES.0040B155
0040B1AD  |. EB 33          JMP SHORT MINIES.0040B1E2
0040B1AF  |> 81F3 D4000000  XOR EBX,0D4                              ;  Case 9 of switch 0040B094
0040B1B5  |. EB 2B          JMP SHORT MINIES.0040B1E2
0040B1B7  |> 81F3 C5000000  XOR EBX,0C5                              ;  Case A of switch 0040B094
0040B1BD  |. EB 23          JMP SHORT MINIES.0040B1E2
0040B1BF  |> 83F3 4F        XOR EBX,4F                               ;  Case B of switch 0040B094
0040B1C2  |. EB 1E          JMP SHORT MINIES.0040B1E2
0040B1C4  |> 81F3 B8000000  XOR EBX,0B8                              ;  Case C of switch 0040B094
0040B1CA  |. EB 16          JMP SHORT MINIES.0040B1E2
0040B1CC  |> 81F3 CA000000  XOR EBX,0CA                              ;  Case D of switch 0040B094
0040B1D2  |. EB 0E          JMP SHORT MINIES.0040B1E2
0040B1D4  |> 81F3 A1000000  XOR EBX,0A1                              ;  Case E of switch 0040B094
0040B1DA  |. EB 06          JMP SHORT MINIES.0040B1E2
0040B1DC  |> 81F3 EC000000  XOR EBX,0EC                              ;  Case F of switch 0040B094
0040B1E2  |> 81E3 FF000000  AND EBX,0FF                              ;  Default case of switch 0040B094
0040B1E8  |. 33D2           XOR EDX,EDX
0040B1EA  |. 8BC3           MOV EAX,EBX
0040B1EC  |. B9 0F000000    MOV ECX,0F
0040B1F1  |. C1E8 03        SHR EAX,3
0040B1F4  |. F7F1           DIV ECX
0040B1F6  |. 8B46 28        MOV EAX,DWORD PTR DS:[ESI+28]
0040B1F9  |. 8BCA           MOV ECX,EDX
0040B1FB  |. 40             INC EAX
0040B1FC  |. 03C8           ADD ECX,EAX
0040B1FE  |. 894E 28        MOV DWORD PTR DS:[ESI+28],ECX
0040B201  |. 83F9 0F        CMP ECX,0F
0040B204  |. 7E 04          JLE SHORT MINIES.0040B20A
0040B206  |. 836E 28 10     SUB DWORD PTR DS:[ESI+28],10
0040B20A  |> 8BC3           MOV EAX,EBX
0040B20C  |. 5F             POP EDI
0040B20D  |. 5E             POP ESI
0040B20E  |. 5B             POP EBX
0040B20F  |. 59             POP ECX
0040B210  |. 5D             POP EBP
0040B211  . C3             RETN
Обратная разработка одного проприетарного алгоритма шифрования - 10

Функция распутывания использует номер состояния от 0 до 15 и принимает на вход байт, который необходимо преобразовать. Для этого используется большой switch‑case, который можно выразить таблицей.

№ состояния

Операция

0

new_byte = (old_byte >> 2) | (old_byte << 6)

1

new_byte = (old_byte >> 5) | (old_byte << 3)

2

new_byte = (old_byte >> 3) | (old_byte << 5)

3

new_byte = (old_byte >> 6) | (old_byte << 2)

4

new_byte = (old_byte >> 7) | (old_byte << 1)

5

new_byte = (old_byte >> 1) | (old_byte << 7)

6

new_byte = (old_byte >> 4) | (old_byte << 4)

7

new_byte = ~old_byte

8

new_byte = reverse(old_byte)

9

new_byte = old_byte ^ 0xD4

10

new_byte = old_byte ^ 0xC5

11

new_byte = old_byte ^ 0x4F

12

new_byte = old_byte ^ 0xB8

13

new_byte = old_byte ^ 0xCA

14

new_byte = old_byte ^ 0xA1

15

new_byte = old_byte ^ 0xEC

Переворот бит обозначен как функция char reverse(char x) и реализован следующим образом:

Длинная реализация переворота бит
0040B155  |> 8BC8           /MOV ECX,EAX
0040B157  |. 8BD3           |MOV EDX,EBX
0040B159  |. D3EA           |SHR EDX,CL
0040B15B  |. 80E2 01        |AND DL,1
0040B15E  |. B9 07000000    |MOV ECX,7
0040B163  |. 8855 FF        |MOV BYTE PTR SS:[EBP-1],DL
0040B166  |. 8BD0           |MOV EDX,EAX
0040B168  |. 03D2           |ADD EDX,EDX
0040B16A  |. 0FB67D FD      |MOVZX EDI,BYTE PTR SS:[EBP-3]
0040B16E  |. 2BCA           |SUB ECX,EDX
0040B170  |. 8BD3           |MOV EDX,EBX
0040B172  |. D3EA           |SHR EDX,CL
0040B174  |. 8BC8           |MOV ECX,EAX
0040B176  |. D3E7           |SHL EDI,CL
0040B178  |. 23D7           |AND EDX,EDI
0040B17A  |. 8BC8           |MOV ECX,EAX
0040B17C  |. 0FB67D FD      |MOVZX EDI,BYTE PTR SS:[EBP-3]
0040B180  |. D3E7           |SHL EDI,CL
0040B182  |. F7D7           |NOT EDI
0040B184  |. 23DF           |AND EBX,EDI
0040B186  |. 8BC8           |MOV ECX,EAX
0040B188  |. 0BD3           |OR EDX,EBX
0040B18A  |. 8BDA           |MOV EBX,EDX
0040B18C  |. 33D2           |XOR EDX,EDX
0040B18E  |. 8A55 FE        |MOV DL,BYTE PTR SS:[EBP-2]
0040B191  |. D3FA           |SAR EDX,CL
0040B193  |. F7D2           |NOT EDX
0040B195  |. 23DA           |AND EBX,EDX
0040B197  |. 33D2           |XOR EDX,EDX
0040B199  |. B9 07000000    |MOV ECX,7
0040B19E  |. 8A55 FF        |MOV DL,BYTE PTR SS:[EBP-1]
0040B1A1  |. 2BC8           |SUB ECX,EAX
0040B1A3  |. D3E2           |SHL EDX,CL
0040B1A5  |. 0BDA           |OR EBX,EDX
0040B1A7  |. 40             |INC EAX
0040B1A8  |. 83F8 04        |CMP EAX,4
0040B1AB  |.^7C A8          JL SHORT MINIES.0040B155
Обратная разработка одного проприетарного алгоритма шифрования - 11

Новый номер состояния генерируется по формуле

S'=left(leftlfloor{frac{b'}8}rightrfloortextrm{mod }16+S+1right)textrm{mod }16

где S — старое состояние, b' — расшифрованный байт, S' — новое состояние.

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

Разбор формата базы знаний

Чтобы понять, каким образом устроен формат зашифрованной базы знаний, необходимо сначала заглянуть внутрь файла, чтобы понимать, что искать. Зашифруем одну из известных баз знаний и откроем её в HEX-редакторе:

Содержимое шифрованной базы знаний

Содержимое шифрованной базы знаний

В начале мы видим байт 0x02, байт 0x0A и строку "База знаний для программы "Малая ЭС" версии 2.0n", которая является магической строкой. Ищем ссылку на эту строку внутри редактора MKBEditor.exe и ссылки на неё. Строка размещена по адресу 0x472004 (что характерно, она начинается с байта 0x0A), нас интересует ссылка на неё в коде по адресу 0x40544E, где размещена инструкция push 472004h.

Размещение магической строки в памяти

Размещение магической строки в памяти
Ссылка на магическую строку

Ссылка на магическую строку

Функция начинается по адресу 0x405308 в файле MKBEditor и отвечает за сохранение базы знаний в файл. В этой функции полностью описан способ формирования файла, при этом активно используются функции из стандартной библиотеки.

Дизассемблированный код сохранения файла
00405308  /. 55             PUSH EBP
00405309  |. 8BEC           MOV EBP,ESP
0040530B  |. 83C4 DC        ADD ESP,-24
0040530E  |. 53             PUSH EBX
0040530F  |. 56             PUSH ESI
00405310  |. 57             PUSH EDI
00405311  |. 8B75 08        MOV ESI,DWORD PTR SS:[EBP+8]
00405314  |. 8B5D 0C        MOV EBX,DWORD PTR SS:[EBP+C]
00405317  |. 85DB           TEST EBX,EBX
00405319  |. 74 2F          JE SHORT MKBEDITO.0040534A
0040531B  |. 8B46 14        MOV EAX,DWORD PTR DS:[ESI+14]
0040531E  |. 50             PUSH EAX                                 ; /Arg1
0040531F  |. E8 34CC0500    CALL MKBEDITO.00461F58                   ; MKBEDITO.00461F58
00405324  |. 59             POP ECX
00405325  |. 53             PUSH EBX
00405326  |. E8 E5D60500    CALL MKBEDITO.00462A10
0040532B  |. 59             POP ECX
0040532C  |. 8BF8           MOV EDI,EAX
0040532E  |. 8D57 01        LEA EDX,DWORD PTR DS:[EDI+1]
00405331  |. 52             PUSH EDX                                 ; /Arg1
00405332  |. E8 F5CD0500    CALL MKBEDITO.0046212C                   ; MKBEDITO.0046212C
00405337  |. 59             POP ECX
00405338  |. 8946 14        MOV DWORD PTR DS:[ESI+14],EAX
0040533B  |. 47             INC EDI
0040533C  |. 57             PUSH EDI                                 ; /Arg3
0040533D  |. 53             PUSH EBX                                 ; |Arg2
0040533E  |. 8B46 14        MOV EAX,DWORD PTR DS:[ESI+14]            ; |
00405341  |. 50             PUSH EAX                                 ; |Arg1
00405342  |. E8 79D50500    CALL MKBEDITO.004628C0                   ; MKBEDITO.004628C0
00405347  |. 83C4 0C        ADD ESP,0C
0040534A  |> 837E 14 00     CMP DWORD PTR DS:[ESI+14],0
0040534E  |. 75 0A          JNZ SHORT MKBEDITO.0040535A
00405350  |. 33D2           XOR EDX,EDX
00405352  |. 8956 1C        MOV DWORD PTR DS:[ESI+1C],EDX
00405355  |. E9 CB030000    JMP MKBEDITO.00405725
0040535A  |> 68 4C204700    PUSH MKBEDITO.0047204C                   ; /Arg2 = 0047204C ASCII "w+b"
0040535F  |. 8B4E 14        MOV ECX,DWORD PTR DS:[ESI+14]            ; |
00405362  |. 51             PUSH ECX                                 ; |Arg1
00405363  |. E8 C4F30500    CALL MKBEDITO.0046472C                   ; MKBEDITO.0046472C
00405368  |. 83C4 08        ADD ESP,8
0040536B  |. 8945 FC        MOV DWORD PTR SS:[EBP-4],EAX
0040536E  |. 85C0           TEST EAX,EAX
00405370  |. 75 0C          JNZ SHORT MKBEDITO.0040537E
00405372  |. C746 1C 640000>MOV DWORD PTR DS:[ESI+1C],64
00405379  |. E9 A7030000    JMP MKBEDITO.00405725
0040537E  |> 8B5E 4C        MOV EBX,DWORD PTR DS:[ESI+4C]
00405381  |. 85DB           TEST EBX,EBX
00405383  |. 75 04          JNZ SHORT MKBEDITO.00405389
00405385  |. 33D2           XOR EDX,EDX
00405387  |. EB 09          JMP SHORT MKBEDITO.00405392
00405389  |> 53             PUSH EBX
0040538A  |. E8 81D60500    CALL MKBEDITO.00462A10
0040538F  |. 59             POP ECX
00405390  |. 8BD0           MOV EDX,EAX
00405392  |> 85D2           TEST EDX,EDX
00405394  |. 77 04          JA SHORT MKBEDITO.0040539A
00405396  |. 33C0           XOR EAX,EAX
00405398  |. EB 1E          JMP SHORT MKBEDITO.004053B8
0040539A  |> 8B7E 48        MOV EDI,DWORD PTR DS:[ESI+48]
0040539D  |. 85FF           TEST EDI,EDI
0040539F  |. 75 04          JNZ SHORT MKBEDITO.004053A5
004053A1  |. 33C9           XOR ECX,ECX
004053A3  |. EB 09          JMP SHORT MKBEDITO.004053AE
004053A5  |> 57             PUSH EDI
004053A6  |. E8 65D60500    CALL MKBEDITO.00462A10
004053AB  |. 59             POP ECX
004053AC  |. 8BC8           MOV ECX,EAX
004053AE  |> 85C9           TEST ECX,ECX
004053B0  |. 77 04          JA SHORT MKBEDITO.004053B6
004053B2  |. B0 02          MOV AL,2
004053B4  |. EB 02          JMP SHORT MKBEDITO.004053B8
004053B6  |> B0 01          MOV AL,1
004053B8  |> 84C0           TEST AL,AL
004053BA  |. 75 35          JNZ SHORT MKBEDITO.004053F1
004053BC  |. 8B55 FC        MOV EDX,DWORD PTR SS:[EBP-4]
004053BF  |. 52             PUSH EDX                                 ; /Arg4
004053C0  |. 8B4E 0C        MOV ECX,DWORD PTR DS:[ESI+C]             ; |
004053C3  |. 51             PUSH ECX                                 ; |Arg3
004053C4  |. 6A 01          PUSH 1                                   ; |Arg2 = 00000001
004053C6  |. 8B46 08        MOV EAX,DWORD PTR DS:[ESI+8]             ; |
004053C9  |. 50             PUSH EAX                                 ; |Arg1
004053CA  |. E8 75F70500    CALL MKBEDITO.00464B44                   ; MKBEDITO.00464B44
004053CF  |. 83C4 10        ADD ESP,10
004053D2  |. 3B46 0C        CMP EAX,DWORD PTR DS:[ESI+C]
004053D5  |. 0F84 3B030000  JE MKBEDITO.00405716
004053DB  |. 8B55 FC        MOV EDX,DWORD PTR SS:[EBP-4]
004053DE  |. 52             PUSH EDX                                 ; /Arg1
004053DF  |. E8 E0EF0500    CALL MKBEDITO.004643C4                   ; MKBEDITO.004643C4
004053E4  |. 59             POP ECX
004053E5  |. C746 1C 670000>MOV DWORD PTR DS:[ESI+1C],67
004053EC  |. E9 34030000    JMP MKBEDITO.00405725
004053F1  |> 8B5E 4C        MOV EBX,DWORD PTR DS:[ESI+4C]
004053F4  |. 85DB           TEST EBX,EBX
004053F6  |. 75 04          JNZ SHORT MKBEDITO.004053FC
004053F8  |. 33C9           XOR ECX,ECX
004053FA  |. EB 09          JMP SHORT MKBEDITO.00405405
004053FC  |> 53             PUSH EBX
004053FD  |. E8 0ED60500    CALL MKBEDITO.00462A10
00405402  |. 59             POP ECX
00405403  |. 8BC8           MOV ECX,EAX
00405405  |> 85C9           TEST ECX,ECX
00405407  |. 77 16          JA SHORT MKBEDITO.0040541F
00405409  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
0040540C  |. 50             PUSH EAX                                 ; /Arg1
0040540D  |. E8 B2EF0500    CALL MKBEDITO.004643C4                   ; MKBEDITO.004643C4
00405412  |. 59             POP ECX
00405413  |. C746 1C CA0000>MOV DWORD PTR DS:[ESI+1C],0CA
0040541A  |. E9 06030000    JMP MKBEDITO.00405725
0040541F  |> 6A 00          PUSH 0                                   ; /Arg1 = 00000000
00405421  |. E8 C6530600    CALL MKBEDITO.0046A7EC                   ; MKBEDITO.0046A7EC
00405426  |. 59             POP ECX
00405427  |. 50             PUSH EAX                                 ; /Arg1
00405428  |. E8 231E0600    CALL MKBEDITO.00467250                   ; MKBEDITO.00467250
0040542D  |. 59             POP ECX
0040542E  |. E8 491E0600    CALL MKBEDITO.0046727C
00405433  |. B9 0A000000    MOV ECX,0A
00405438  |. 99             CDQ
00405439  |. F7F9           IDIV ECX
0040543B  |. 8BDA           MOV EBX,EDX
0040543D  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
00405440  |. 50             PUSH EAX                                 ; /Arg2
00405441  |. 33D2           XOR EDX,EDX                              ; |
00405443  |. 8AD3           MOV DL,BL                                ; |
00405445  |. 52             PUSH EDX                                 ; |Arg1
00405446  |. E8 FD0C0600    CALL MKBEDITO.00466148                   ; MKBEDITO.00466148
0040544B  |. 83C4 08        ADD ESP,8
0040544E  |. 68 04204700    PUSH MKBEDITO.00472004                   ; /Arg2 = 00472004
00405453  |. 8B4D FC        MOV ECX,DWORD PTR SS:[EBP-4]             ; |
00405456  |. 51             PUSH ECX                                 ; |Arg1
00405457  |. E8 04F30500    CALL MKBEDITO.00464760                   ; MKBEDITO.00464760
0040545C  |. 83C4 08        ADD ESP,8
0040545F  |. E8 181E0600    CALL MKBEDITO.0046727C
00405464  |. 8BD8           MOV EBX,EAX
00405466  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
00405469  |. 50             PUSH EAX                                 ; /Arg2
0040546A  |. 8BFB           MOV EDI,EBX                              ; |
0040546C  |. 81E7 FF000000  AND EDI,0FF                              ; |
00405472  |. 57             PUSH EDI                                 ; |Arg1
00405473  |. E8 D00C0600    CALL MKBEDITO.00466148                   ; MKBEDITO.00466148
00405478  |. 83C4 08        ADD ESP,8
0040547B  |. 8BC7           MOV EAX,EDI
0040547D  |. B9 09000000    MOV ECX,9
00405482  |. 99             CDQ
00405483  |. F7F9           IDIV ECX
00405485  |. 8BFA           MOV EDI,EDX
00405487  |. 85FF           TEST EDI,EDI
00405489  |. 7C 1D          JL SHORT MKBEDITO.004054A8
0040548B  |> E8 EC1D0600    /CALL MKBEDITO.0046727C
00405490  |. 8BD8           |MOV EBX,EAX
00405492  |. 8B45 FC        |MOV EAX,DWORD PTR SS:[EBP-4]
00405495  |. 50             |PUSH EAX                                ; /Arg2
00405496  |. 33D2           |XOR EDX,EDX                             ; |
00405498  |. 8AD3           |MOV DL,BL                               ; |
0040549A  |. 52             |PUSH EDX                                ; |Arg1
0040549B  |. E8 A80C0600    |CALL MKBEDITO.00466148                  ; MKBEDITO.00466148
004054A0  |. 83C4 08        |ADD ESP,8
004054A3  |. 4F             |DEC EDI
004054A4  |. 85FF           |TEST EDI,EDI
004054A6  |.^7D E3          JGE SHORT MKBEDITO.0040548B
004054A8  |> E8 CF1D0600    CALL MKBEDITO.0046727C
004054AD  |. 8BD8           MOV EBX,EAX
004054AF  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
004054B2  |. 50             PUSH EAX                                 ; /Arg2
004054B3  |. 8BFB           MOV EDI,EBX                              ; |
004054B5  |. 81E7 FF000000  AND EDI,0FF                              ; |
004054BB  |. 57             PUSH EDI                                 ; |Arg1
004054BC  |. E8 870C0600    CALL MKBEDITO.00466148                   ; MKBEDITO.00466148
004054C1  |. D1FF           SAR EDI,1
004054C3  |. 83C4 08        ADD ESP,8
004054C6  |. 83E7 0F        AND EDI,0F
004054C9  |. B9 04000000    MOV ECX,4
004054CE  |. 897E 28        MOV DWORD PTR DS:[ESI+28],EDI
004054D1  |. 56             PUSH ESI
004054D2  |. 8D7D DC        LEA EDI,DWORD PTR SS:[EBP-24]
004054D5  |. BE 38204700    MOV ESI,MKBEDITO.00472038
004054DA  |. F3:A5          REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS>
004054DC  |. 5E             POP ESI
004054DD  |. 33DB           XOR EBX,EBX
004054DF  |. 8B46 08        MOV EAX,DWORD PTR DS:[ESI+8]
004054E2  |. 8BC8           MOV ECX,EAX
004054E4  |. EB 19          JMP SHORT MKBEDITO.004054FF
004054E6  |> 0FBE01         /MOVSX EAX,BYTE PTR DS:[ECX]
004054E9  |. 33D2           |XOR EDX,EDX
004054EB  |> 8BF8           |/MOV EDI,EAX
004054ED  |. 83E7 03        ||AND EDI,3
004054F0  |. FF44BD DC      ||INC DWORD PTR SS:[EBP+EDI*4-24]
004054F4  |. C1F8 02        ||SAR EAX,2
004054F7  |. 42             ||INC EDX
004054F8  |. 83FA 04        ||CMP EDX,4
004054FB  |.^7C EE          |JL SHORT MKBEDITO.004054EB
004054FD  |. 43             |INC EBX
004054FE  |. 41             |INC ECX
004054FF  |> 3B5E 0C         CMP EBX,DWORD PTR DS:[ESI+C]
00405502  |.^72 E2          JB SHORT MKBEDITO.004054E6
00405504  |. A1 48204700    MOV EAX,DWORD PTR DS:[472048]
00405509  |. 8945 F8        MOV DWORD PTR SS:[EBP-8],EAX
0040550C  |. BF 03000000    MOV EDI,3
00405511  |> 33C9           /XOR ECX,ECX
00405513  |. 8D55 F8        |LEA EDX,DWORD PTR SS:[EBP-8]
00405516  |. 8D45 DC        |LEA EAX,DWORD PTR SS:[EBP-24]
00405519  |. 3BF9           |CMP EDI,ECX
0040551B  |. 7E 30          |JLE SHORT MKBEDITO.0040554D
0040551D  |> 8B58 04        |/MOV EBX,DWORD PTR DS:[EAX+4]
00405520  |. 3B18           ||CMP EBX,DWORD PTR DS:[EAX]
00405522  |. 73 20          ||JNB SHORT MKBEDITO.00405544
00405524  |. 8B18           ||MOV EBX,DWORD PTR DS:[EAX]
00405526  |. 895D F4        ||MOV DWORD PTR SS:[EBP-C],EBX
00405529  |. 8B58 04        ||MOV EBX,DWORD PTR DS:[EAX+4]
0040552C  |. 8918           ||MOV DWORD PTR DS:[EAX],EBX
0040552E  |. 8B5D F4        ||MOV EBX,DWORD PTR SS:[EBP-C]
00405531  |. 8958 04        ||MOV DWORD PTR DS:[EAX+4],EBX
00405534  |. 8A1A           ||MOV BL,BYTE PTR DS:[EDX]
00405536  |. 885D F3        ||MOV BYTE PTR SS:[EBP-D],BL
00405539  |. 8A5A 01        ||MOV BL,BYTE PTR DS:[EDX+1]
0040553C  |. 881A           ||MOV BYTE PTR DS:[EDX],BL
0040553E  |. 8A5D F3        ||MOV BL,BYTE PTR SS:[EBP-D]
00405541  |. 885A 01        ||MOV BYTE PTR DS:[EDX+1],BL
00405544  |> 41             ||INC ECX
00405545  |. 42             ||INC EDX
00405546  |. 83C0 04        ||ADD EAX,4
00405549  |. 3BF9           ||CMP EDI,ECX
0040554B  |.^7F D0          |JG SHORT MKBEDITO.0040551D
0040554D  |> 4F             |DEC EDI
0040554E  |. 85FF           |TEST EDI,EDI
00405550  |.^7F BF          JG SHORT MKBEDITO.00405511
00405552  |. 8A5D F8        MOV BL,BYTE PTR SS:[EBP-8]
00405555  |. 8A45 FA        MOV AL,BYTE PTR SS:[EBP-6]
00405558  |. C1E0 04        SHL EAX,4
0040555B  |. 8A55 FB        MOV DL,BYTE PTR SS:[EBP-5]
0040555E  |. C1E3 06        SHL EBX,6
00405561  |. C1E2 02        SHL EDX,2
00405564  |. 02D8           ADD BL,AL
00405566  |. 02DA           ADD BL,DL
00405568  |. 025D F9        ADD BL,BYTE PTR SS:[EBP-7]
0040556B  |. 885E 44        MOV BYTE PTR DS:[ESI+44],BL
0040556E  |. 8B4D FC        MOV ECX,DWORD PTR SS:[EBP-4]
00405571  |. 51             PUSH ECX
00405572  |. 53             PUSH EBX                                 ; /Arg2
00405573  |. 56             PUSH ESI                                 ; |Arg1
00405574  |. E8 97040000    CALL MKBEDITO.00405A10                   ; MKBEDITO.00405A10
00405579  |. 83C4 08        ADD ESP,8
0040557C  |. 25 FF000000    AND EAX,0FF                              ; |
00405581  |. 50             PUSH EAX                                 ; |Arg1
00405582  |. E8 C10B0600    CALL MKBEDITO.00466148                   ; MKBEDITO.00466148
00405587  |. 83C4 08        ADD ESP,8
0040558A  |. 33D2           XOR EDX,EDX
0040558C  |. 8956 24        MOV DWORD PTR DS:[ESI+24],EDX
0040558F  |. 33C9           XOR ECX,ECX
00405591  |. 894E 20        MOV DWORD PTR DS:[ESI+20],ECX
00405594  |. 837E 4C 00     CMP DWORD PTR DS:[ESI+4C],0
00405598  |. 74 24          JE SHORT MKBEDITO.004055BE
0040559A  |. 33DB           XOR EBX,EBX
0040559C  |. EB 17          JMP SHORT MKBEDITO.004055B5
0040559E  |> 8B45 FC        /MOV EAX,DWORD PTR SS:[EBP-4]
004055A1  |. 50             |PUSH EAX                                ; /Arg3
004055A2  |. 8BD3           |MOV EDX,EBX                             ; |
004055A4  |. 43             |INC EBX                                 ; |
004055A5  |. 8B4E 4C        |MOV ECX,DWORD PTR DS:[ESI+4C]           ; |
004055A8  |. 8A0411         |MOV AL,BYTE PTR DS:[ECX+EDX]            ; |
004055AB  |. 50             |PUSH EAX                                ; |Arg2
004055AC  |. 56             |PUSH ESI                                ; |Arg1
004055AD  |. E8 F6050000    |CALL MKBEDITO.00405BA8                  ; MKBEDITO.00405BA8
004055B2  |. 83C4 0C        |ADD ESP,0C
004055B5  |> 8B56 4C         MOV EDX,DWORD PTR DS:[ESI+4C]
004055B8  |. 803C1A 00      |CMP BYTE PTR DS:[EDX+EBX],0
004055BC  |.^75 E0          JNZ SHORT MKBEDITO.0040559E
004055BE  |> 8B4D FC        MOV ECX,DWORD PTR SS:[EBP-4]
004055C1  |. 51             PUSH ECX                                 ; /Arg3
004055C2  |. 6A 01          PUSH 1                                   ; |Arg2 = 00000001
004055C4  |. 56             PUSH ESI                                 ; |Arg1
004055C5  |. E8 DE050000    CALL MKBEDITO.00405BA8                   ; MKBEDITO.00405BA8
004055CA  |. 83C4 0C        ADD ESP,0C
004055CD  |. 837E 48 00     CMP DWORD PTR DS:[ESI+48],0
004055D1  |. 74 24          JE SHORT MKBEDITO.004055F7
004055D3  |. 33DB           XOR EBX,EBX
004055D5  |. EB 17          JMP SHORT MKBEDITO.004055EE
004055D7  |> 8B45 FC        /MOV EAX,DWORD PTR SS:[EBP-4]
004055DA  |. 50             |PUSH EAX                                ; /Arg3
004055DB  |. 8BD3           |MOV EDX,EBX                             ; |
004055DD  |. 43             |INC EBX                                 ; |
004055DE  |. 8B4E 48        |MOV ECX,DWORD PTR DS:[ESI+48]           ; |
004055E1  |. 8A0411         |MOV AL,BYTE PTR DS:[ECX+EDX]            ; |
004055E4  |. 50             |PUSH EAX                                ; |Arg2
004055E5  |. 56             |PUSH ESI                                ; |Arg1
004055E6  |. E8 BD050000    |CALL MKBEDITO.00405BA8                  ; MKBEDITO.00405BA8
004055EB  |. 83C4 0C        |ADD ESP,0C
004055EE  |> 8B56 48         MOV EDX,DWORD PTR DS:[ESI+48]
004055F1  |. 803C1A 00      |CMP BYTE PTR DS:[EDX+EBX],0
004055F5  |.^75 E0          JNZ SHORT MKBEDITO.004055D7
004055F7  |> 8B4D FC        MOV ECX,DWORD PTR SS:[EBP-4]
004055FA  |. 51             PUSH ECX                                 ; /Arg3
004055FB  |. 6A 01          PUSH 1                                   ; |Arg2 = 00000001
004055FD  |. 56             PUSH ESI                                 ; |Arg1
004055FE  |. E8 A5050000    CALL MKBEDITO.00405BA8                   ; MKBEDITO.00405BA8
00405603  |. 83C4 0C        ADD ESP,0C
00405606  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
00405609  |. 50             PUSH EAX                                 ; /Arg3
0040560A  |. 8B56 0C        MOV EDX,DWORD PTR DS:[ESI+C]             ; |
0040560D  |. C1EA 18        SHR EDX,18                               ; |
00405610  |. 52             PUSH EDX                                 ; |Arg2
00405611  |. 56             PUSH ESI                                 ; |Arg1
00405612  |. E8 91050000    CALL MKBEDITO.00405BA8                   ; MKBEDITO.00405BA8
00405617  |. 83C4 0C        ADD ESP,0C
0040561A  |. 8B4D FC        MOV ECX,DWORD PTR SS:[EBP-4]
0040561D  |. 51             PUSH ECX                                 ; /Arg3
0040561E  |. 8B46 0C        MOV EAX,DWORD PTR DS:[ESI+C]             ; |
00405621  |. C1E8 10        SHR EAX,10                               ; |
00405624  |. 50             PUSH EAX                                 ; |Arg2
00405625  |. 56             PUSH ESI                                 ; |Arg1
00405626  |. E8 7D050000    CALL MKBEDITO.00405BA8                   ; MKBEDITO.00405BA8
0040562B  |. 83C4 0C        ADD ESP,0C
0040562E  |. 8B55 FC        MOV EDX,DWORD PTR SS:[EBP-4]
00405631  |. 52             PUSH EDX                                 ; /Arg3
00405632  |. 8B4E 0C        MOV ECX,DWORD PTR DS:[ESI+C]             ; |
00405635  |. C1E9 08        SHR ECX,8                                ; |
00405638  |. 51             PUSH ECX                                 ; |Arg2
00405639  |. 56             PUSH ESI                                 ; |Arg1
0040563A  |. E8 69050000    CALL MKBEDITO.00405BA8                   ; MKBEDITO.00405BA8
0040563F  |. 83C4 0C        ADD ESP,0C
00405642  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
00405645  |. 50             PUSH EAX                                 ; /Arg3
00405646  |. 8A56 0C        MOV DL,BYTE PTR DS:[ESI+C]               ; |
00405649  |. 52             PUSH EDX                                 ; |Arg2
0040564A  |. 56             PUSH ESI                                 ; |Arg1
0040564B  |. E8 58050000    CALL MKBEDITO.00405BA8                   ; MKBEDITO.00405BA8
00405650  |. 83C4 0C        ADD ESP,0C
00405653  |. 33DB           XOR EBX,EBX
00405655  |. EB 15          JMP SHORT MKBEDITO.0040566C
00405657  |> 8B45 FC        /MOV EAX,DWORD PTR SS:[EBP-4]
0040565A  |. 50             |PUSH EAX                                ; /Arg3
0040565B  |. 8B56 08        |MOV EDX,DWORD PTR DS:[ESI+8]            ; |
0040565E  |. 8A0C1A         |MOV CL,BYTE PTR DS:[EDX+EBX]            ; |
00405661  |. 51             |PUSH ECX                                ; |Arg2
00405662  |. 56             |PUSH ESI                                ; |Arg1
00405663  |. E8 40050000    |CALL MKBEDITO.00405BA8                  ; MKBEDITO.00405BA8
00405668  |. 83C4 0C        |ADD ESP,0C
0040566B  |. 43             |INC EBX
0040566C  |> 3B5E 0C         CMP EBX,DWORD PTR DS:[ESI+C]
0040566F  |.^72 E6          JB SHORT MKBEDITO.00405657
00405671  |. 837E 24 00     CMP DWORD PTR DS:[ESI+24],0
00405675  |. 74 27          JE SHORT MKBEDITO.0040569E
00405677  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
0040567A  |. 50             PUSH EAX
0040567B  |. 8B56 20        MOV EDX,DWORD PTR DS:[ESI+20]
0040567E  |. C1EA 18        SHR EDX,18
00405681  |. 52             PUSH EDX                                 ; /Arg2
00405682  |. 56             PUSH ESI                                 ; |Arg1
00405683  |. E8 88030000    CALL MKBEDITO.00405A10                   ; MKBEDITO.00405A10
00405688  |. 83C4 08        ADD ESP,8
0040568B  |. 33C9           XOR ECX,ECX                              ; |
0040568D  |. 8AC8           MOV CL,AL                                ; |
0040568F  |. 81E1 FF000000  AND ECX,0FF                              ; |
00405695  |. 51             PUSH ECX                                 ; |Arg1
00405696  |. E8 AD0A0600    CALL MKBEDITO.00466148                   ; MKBEDITO.00466148
0040569B  |. 83C4 08        ADD ESP,8
0040569E  |> 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
004056A1  |. 50             PUSH EAX                                 ; /Arg1
004056A2  |. E8 A9FC0500    CALL MKBEDITO.00465350                   ; MKBEDITO.00465350
004056A7  |. 59             POP ECX
004056A8  |. 33FF           XOR EDI,EDI
004056AA  |. 33DB           XOR EBX,EBX
004056AC  |. EB 15          JMP SHORT MKBEDITO.004056C3
004056AE  |> 8BCF           /MOV ECX,EDI
004056B0  |. 8B45 EC        |MOV EAX,DWORD PTR SS:[EBP-14]
004056B3  |. 83E1 03        |AND ECX,3
004056B6  |. 25 FF000000    |AND EAX,0FF
004056BB  |. C1E1 03        |SHL ECX,3
004056BE  |. D3E0           |SHL EAX,CL
004056C0  |. 33D8           |XOR EBX,EAX
004056C2  |. 47             |INC EDI
004056C3  |> 8B55 FC         MOV EDX,DWORD PTR SS:[EBP-4]
004056C6  |. 52             |PUSH EDX                                ; /Arg1
004056C7  |. E8 540A0600    |CALL MKBEDITO.00466120                  ; MKBEDITO.00466120
004056CC  |. 59             |POP ECX
004056CD  |. 8945 EC        |MOV DWORD PTR SS:[EBP-14],EAX
004056D0  |. 40             |INC EAX
004056D1  |.^75 DB          JNZ SHORT MKBEDITO.004056AE
004056D3  |. 8BCB           MOV ECX,EBX
004056D5  |. 8B55 FC        MOV EDX,DWORD PTR SS:[EBP-4]
004056D8  |. C1E9 18        SHR ECX,18
004056DB  |. 52             PUSH EDX                                 ; /Arg2
004056DC  |. 51             PUSH ECX                                 ; |Arg1
004056DD  |. E8 660A0600    CALL MKBEDITO.00466148                   ; MKBEDITO.00466148
004056E2  |. 83C4 08        ADD ESP,8
004056E5  |. 8BD3           MOV EDX,EBX
004056E7  |. C1EA 10        SHR EDX,10
004056EA  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
004056ED  |. 50             PUSH EAX                                 ; /Arg2
004056EE  |. 52             PUSH EDX                                 ; |Arg1
004056EF  |. E8 540A0600    CALL MKBEDITO.00466148                   ; MKBEDITO.00466148
004056F4  |. 83C4 08        ADD ESP,8
004056F7  |. 8BC3           MOV EAX,EBX
004056F9  |. C1E8 08        SHR EAX,8
004056FC  |. 8B4D FC        MOV ECX,DWORD PTR SS:[EBP-4]
004056FF  |. 51             PUSH ECX                                 ; /Arg2
00405700  |. 50             PUSH EAX                                 ; |Arg1
00405701  |. E8 420A0600    CALL MKBEDITO.00466148                   ; MKBEDITO.00466148
00405706  |. 83C4 08        ADD ESP,8
00405709  |. 8B55 FC        MOV EDX,DWORD PTR SS:[EBP-4]
0040570C  |. 52             PUSH EDX                                 ; /Arg2
0040570D  |. 53             PUSH EBX                                 ; |Arg1
0040570E  |. E8 350A0600    CALL MKBEDITO.00466148                   ; MKBEDITO.00466148
00405713  |. 83C4 08        ADD ESP,8
00405716  |> 8B4D FC        MOV ECX,DWORD PTR SS:[EBP-4]
00405719  |. 51             PUSH ECX                                 ; /Arg1
0040571A  |. E8 A5EC0500    CALL MKBEDITO.004643C4                   ; MKBEDITO.004643C4
0040571F  |. 59             POP ECX
00405720  |. 33C0           XOR EAX,EAX
00405722  |. 8946 1C        MOV DWORD PTR DS:[ESI+1C],EAX
00405725  |> 5F             POP EDI
00405726  |. 5E             POP ESI
00405727  |. 5B             POP EBX
00405728  |. 8BE5           MOV ESP,EBP
0040572A  |. 5D             POP EBP
0040572B  . C3             RETN
Обратная разработка одного проприетарного алгоритма шифрования - 19

Можно заметить, что строка по адресу 0x472004 передаётся в некоторую функцию, которая потом эту же строку в файл и выводит. Можно сделать вывод, что по адресу 0x464760 находится функция int __cdecl fputs(const char *str, FILE *file):

0040544E  |. 68 04204700    PUSH MKBEDITO.00472004                   ; /Arg2 = 00472004
00405453  |. 8B4D FC        MOV ECX,DWORD PTR SS:[EBP-4]             ; |
00405456  |. 51             PUSH ECX                                 ; |Arg1
00405457  |. E8 04F30500    CALL MKBEDITO.00464760                   ; MKBEDITO.00464760
0040545C  |. 83C4 08        ADD ESP,8
Обратная разработка одного проприетарного алгоритма шифрования - 20

Один из аргументов, собственно указатель на файл, сохраняется на стеке и является результатом вызова функции FILE *__cdecl fopen(const char *path, const char *mode):

0040535A  |> 68 4C204700    PUSH MKBEDITO.0047204C                   ; /Arg2 = 0047204C ASCII "w+b"
0040535F  |. 8B4E 14        MOV ECX,DWORD PTR DS:[ESI+14]            ; |
00405362  |. 51             PUSH ECX                                 ; |Arg1
00405363  |. E8 C4F30500    CALL MKBEDITO.0046472C                   ; MKBEDITO.0046472C
00405368  |. 83C4 08        ADD ESP,8
0040536B  |. 8945 FC        MOV DWORD PTR SS:[EBP-4],EAX
Обратная разработка одного проприетарного алгоритма шифрования - 21

Перед магической строкой идёт один байт, который формируется следующим образом:

0040542E  |. E8 491E0600    CALL MKBEDITO.0046727C
00405433  |. B9 0A000000    MOV ECX,0A
00405438  |. 99             CDQ
00405439  |. F7F9           IDIV ECX
0040543B  |. 8BDA           MOV EBX,EDX
0040543D  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
00405440  |. 50             PUSH EAX                                 ; /Arg2
00405441  |. 33D2           XOR EDX,EDX                              ; |
00405443  |. 8AD3           MOV DL,BL                                ; |
00405445  |. 52             PUSH EDX                                 ; |Arg1
00405446  |. E8 FD0C0600    CALL MKBEDITO.00466148                   ; MKBEDITO.00466148
0040544B  |. 83C4 08        ADD ESP,8
Обратная разработка одного проприетарного алгоритма шифрования - 22

По адресу 0x46727C размещена функция int rand(void), которая генерирует случайное значение, которое потом делят на 10 и находят остаток от деления. Полученный байт находится в промежутке от 0 до 9 и выводится с использованием функции int fputc(int char, FILE *stream) по адресу 0x466148. Можно предположить, что такой способ формирования первого байта является одной из мер безопасности через неясность.

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

0040545F  |. E8 181E0600    CALL MKBEDITO.0046727C
00405464  |. 8BD8           MOV EBX,EAX
00405466  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
00405469  |. 50             PUSH EAX                                 ; /Arg2
0040546A  |. 8BFB           MOV EDI,EBX                              ; |
0040546C  |. 81E7 FF000000  AND EDI,0FF                              ; |
00405472  |. 57             PUSH EDI                                 ; |Arg1
00405473  |. E8 D00C0600    CALL MKBEDITO.00466148                   ; MKBEDITO.00466148
00405478  |. 83C4 08        ADD ESP,8
Обратная разработка одного проприетарного алгоритма шифрования - 23

Количество случайных байт определяется очень просто: ранее записанный байт делится на 9, берётся остаток и далее в цикле с постусловием генерируется от 1 до 9 случайных байт, что тоже можно отнести к реализации безопасности через неясность:

0040547B  |. 8BC7           MOV EAX,EDI
0040547D  |. B9 09000000    MOV ECX,9
00405482  |. 99             CDQ
00405483  |. F7F9           IDIV ECX
00405485  |. 8BFA           MOV EDI,EDX
00405487  |. 85FF           TEST EDI,EDI
00405489  |. 7C 1D          JL SHORT MKBEDITO.004054A8
0040548B  |> E8 EC1D0600    /CALL MKBEDITO.0046727C
00405490  |. 8BD8           |MOV EBX,EAX
00405492  |. 8B45 FC        |MOV EAX,DWORD PTR SS:[EBP-4]
00405495  |. 50             |PUSH EAX                                ; /Arg2
00405496  |. 33D2           |XOR EDX,EDX                             ; |
00405498  |. 8AD3           |MOV DL,BL                               ; |
0040549A  |. 52             |PUSH EDX                                ; |Arg1
0040549B  |. E8 A80C0600    |CALL MKBEDITO.00466148                  ; MKBEDITO.00466148
004054A0  |. 83C4 08        |ADD ESP,8
004054A3  |. 4F             |DEC EDI
004054A4  |. 85FF           |TEST EDI,EDI
004054A6  |.^7D E3          JGE SHORT MKBEDITO.0040548B
Обратная разработка одного проприетарного алгоритма шифрования - 24

Далее генерируется состояние деобфускатора, для которого в очередной раз генерируется случайное число, откуда берутся 4 бита после самого младшего:

004054A8  |> E8 CF1D0600    CALL MKBEDITO.0046727C
004054AD  |. 8BD8           MOV EBX,EAX
004054AF  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
004054B2  |. 50             PUSH EAX                                 ; /Arg2
004054B3  |. 8BFB           MOV EDI,EBX                              ; |
004054B5  |. 81E7 FF000000  AND EDI,0FF                              ; |
004054BB  |. 57             PUSH EDI                                 ; |Arg1
004054BC  |. E8 870C0600    CALL MKBEDITO.00466148                   ; MKBEDITO.00466148
004054C1  |. D1FF           SAR EDI,1
004054C3  |. 83C4 08        ADD ESP,8
004054C6  |. 83E7 0F        AND EDI,0F
004054C9  |. B9 04000000    MOV ECX,4
004054CE  |. 897E 28        MOV DWORD PTR DS:[ESI+28],EDI
Обратная разработка одного проприетарного алгоритма шифрования - 25

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

Подсчёт дуплетов
004054D1  |. 56             PUSH ESI
004054D2  |. 8D7D DC        LEA EDI,DWORD PTR SS:[EBP-24]
004054D5  |. BE 38204700    MOV ESI,MKBEDITO.00472038
004054DA  |. F3:A5          REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS>
004054DC  |. 5E             POP ESI
004054DD  |. 33DB           XOR EBX,EBX
004054DF  |. 8B46 08        MOV EAX,DWORD PTR DS:[ESI+8]
004054E2  |. 8BC8           MOV ECX,EAX
004054E4  |. EB 19          JMP SHORT MKBEDITO.004054FF
004054E6  |> 0FBE01         /MOVSX EAX,BYTE PTR DS:[ECX]
004054E9  |. 33D2           |XOR EDX,EDX
004054EB  |> 8BF8           |/MOV EDI,EAX
004054ED  |. 83E7 03        ||AND EDI,3
004054F0  |. FF44BD DC      ||INC DWORD PTR SS:[EBP+EDI*4-24]
004054F4  |. C1F8 02        ||SAR EAX,2
004054F7  |. 42             ||INC EDX
004054F8  |. 83FA 04        ||CMP EDX,4
004054FB  |.^7C EE          |JL SHORT MKBEDITO.004054EB
004054FD  |. 43             |INC EBX
004054FE  |. 41             |INC ECX
004054FF  |> 3B5E 0C         CMP EBX,DWORD PTR DS:[ESI+C]
00405502  |.^72 E2          JB SHORT MKBEDITO.004054E6
00405504  |. A1 48204700    MOV EAX,DWORD PTR DS:[472048]
00405509  |. 8945 F8        MOV DWORD PTR SS:[EBP-8],EAX
0040550C  |. BF 03000000    MOV EDI,3
00405511  |> 33C9           /XOR ECX,ECX
00405513  |. 8D55 F8        |LEA EDX,DWORD PTR SS:[EBP-8]
00405516  |. 8D45 DC        |LEA EAX,DWORD PTR SS:[EBP-24]
00405519  |. 3BF9           |CMP EDI,ECX
0040551B  |. 7E 30          |JLE SHORT MKBEDITO.0040554D
0040551D  |> 8B58 04        |/MOV EBX,DWORD PTR DS:[EAX+4]
00405520  |. 3B18           ||CMP EBX,DWORD PTR DS:[EAX]
00405522  |. 73 20          ||JNB SHORT MKBEDITO.00405544
00405524  |. 8B18           ||MOV EBX,DWORD PTR DS:[EAX]
00405526  |. 895D F4        ||MOV DWORD PTR SS:[EBP-C],EBX
00405529  |. 8B58 04        ||MOV EBX,DWORD PTR DS:[EAX+4]
0040552C  |. 8918           ||MOV DWORD PTR DS:[EAX],EBX
0040552E  |. 8B5D F4        ||MOV EBX,DWORD PTR SS:[EBP-C]
00405531  |. 8958 04        ||MOV DWORD PTR DS:[EAX+4],EBX
00405534  |. 8A1A           ||MOV BL,BYTE PTR DS:[EDX]
00405536  |. 885D F3        ||MOV BYTE PTR SS:[EBP-D],BL
00405539  |. 8A5A 01        ||MOV BL,BYTE PTR DS:[EDX+1]
0040553C  |. 881A           ||MOV BYTE PTR DS:[EDX],BL
0040553E  |. 8A5D F3        ||MOV BL,BYTE PTR SS:[EBP-D]
00405541  |. 885A 01        ||MOV BYTE PTR DS:[EDX+1],BL
00405544  |> 41             ||INC ECX
00405545  |. 42             ||INC EDX
00405546  |. 83C0 04        ||ADD EAX,4
00405549  |. 3BF9           ||CMP EDI,ECX
0040554B  |.^7F D0          |JG SHORT MKBEDITO.0040551D
0040554D  |> 4F             |DEC EDI
0040554E  |. 85FF           |TEST EDI,EDI
00405550  |.^7F BF          JG SHORT MKBEDITO.00405511
Обратная разработка одного проприетарного алгоритма шифрования - 26

После того, как дуплеты отсортированы, они записываются в один байт по достаточно хитрой формуле: наиболее частый помещается в d2, второй по встречаемости — в d1, третий — в d3, четвёртый — в d0. Дуплеты размещены по адресам от EBP-8 (самый редкий) до EBP-5 (самый частый).

00405552  |. 8A5D F8        MOV BL,BYTE PTR SS:[EBP-8]
00405555  |. 8A45 FA        MOV AL,BYTE PTR SS:[EBP-6]
00405558  |. C1E0 04        SHL EAX,4
0040555B  |. 8A55 FB        MOV DL,BYTE PTR SS:[EBP-5]
0040555E  |. C1E3 06        SHL EBX,6
00405561  |. C1E2 02        SHL EDX,2
00405564  |. 02D8           ADD BL,AL
00405566  |. 02DA           ADD BL,DL
00405568  |. 025D F9        ADD BL,BYTE PTR SS:[EBP-7]
0040556B  |. 885E 44        MOV BYTE PTR DS:[ESI+44],BL
0040556E  |. 8B4D FC        MOV ECX,DWORD PTR SS:[EBP-4]
00405571  |. 51             PUSH ECX
00405572  |. 53             PUSH EBX                                 ; /Arg2
00405573  |. 56             PUSH ESI                                 ; |Arg1
00405574  |. E8 97040000    CALL MKBEDITO.00405A10                   ; MKBEDITO.00405A10
00405579  |. 83C4 08        ADD ESP,8
0040557C  |. 25 FF000000    AND EAX,0FF                              ; |
00405581  |. 50             PUSH EAX                                 ; |Arg1
00405582  |. E8 C10B0600    CALL MKBEDITO.00466148                   ; MKBEDITO.00466148
00405587  |. 83C4 08        ADD ESP,8
Обратная разработка одного проприетарного алгоритма шифрования - 27

Полученный алфавит дуплетов обрабатывается функцией 0x405A10, которая представляет собой функцию обфускации, и записывается в файл.

Далее - начинается запись уже шифрованных данных. За запись шифрованного символа отвечает функция 0x405BA8. В начале записывается два пароля: на редактирование и на чтение, при этом пароли заканчиваются на байт 0x01.

Запись паролей
0040558A  |. 33D2           XOR EDX,EDX
0040558C  |. 8956 24        MOV DWORD PTR DS:[ESI+24],EDX
0040558F  |. 33C9           XOR ECX,ECX
00405591  |. 894E 20        MOV DWORD PTR DS:[ESI+20],ECX
00405594  |. 837E 4C 00     CMP DWORD PTR DS:[ESI+4C],0
00405598  |. 74 24          JE SHORT MKBEDITO.004055BE
0040559A  |. 33DB           XOR EBX,EBX
0040559C  |. EB 17          JMP SHORT MKBEDITO.004055B5
0040559E  |> 8B45 FC        /MOV EAX,DWORD PTR SS:[EBP-4]
004055A1  |. 50             |PUSH EAX                                ; /Arg3
004055A2  |. 8BD3           |MOV EDX,EBX                             ; |
004055A4  |. 43             |INC EBX                                 ; |
004055A5  |. 8B4E 4C        |MOV ECX,DWORD PTR DS:[ESI+4C]           ; |
004055A8  |. 8A0411         |MOV AL,BYTE PTR DS:[ECX+EDX]            ; |
004055AB  |. 50             |PUSH EAX                                ; |Arg2
004055AC  |. 56             |PUSH ESI                                ; |Arg1
004055AD  |. E8 F6050000    |CALL MKBEDITO.00405BA8                  ; MKBEDITO.00405BA8
004055B2  |. 83C4 0C        |ADD ESP,0C
004055B5  |> 8B56 4C         MOV EDX,DWORD PTR DS:[ESI+4C]
004055B8  |. 803C1A 00      |CMP BYTE PTR DS:[EDX+EBX],0
004055BC  |.^75 E0          JNZ SHORT MKBEDITO.0040559E
004055BE  |> 8B4D FC        MOV ECX,DWORD PTR SS:[EBP-4]
004055C1  |. 51             PUSH ECX                                 ; /Arg3
004055C2  |. 6A 01          PUSH 1                                   ; |Arg2 = 00000001
004055C4  |. 56             PUSH ESI                                 ; |Arg1
004055C5  |. E8 DE050000    CALL MKBEDITO.00405BA8                   ; MKBEDITO.00405BA8
004055CA  |. 83C4 0C        ADD ESP,0C
004055CD  |. 837E 48 00     CMP DWORD PTR DS:[ESI+48],0
004055D1  |. 74 24          JE SHORT MKBEDITO.004055F7
004055D3  |. 33DB           XOR EBX,EBX
004055D5  |. EB 17          JMP SHORT MKBEDITO.004055EE
004055D7  |> 8B45 FC        /MOV EAX,DWORD PTR SS:[EBP-4]
004055DA  |. 50             |PUSH EAX                                ; /Arg3
004055DB  |. 8BD3           |MOV EDX,EBX                             ; |
004055DD  |. 43             |INC EBX                                 ; |
004055DE  |. 8B4E 48        |MOV ECX,DWORD PTR DS:[ESI+48]           ; |
004055E1  |. 8A0411         |MOV AL,BYTE PTR DS:[ECX+EDX]            ; |
004055E4  |. 50             |PUSH EAX                                ; |Arg2
004055E5  |. 56             |PUSH ESI                                ; |Arg1
004055E6  |. E8 BD050000    |CALL MKBEDITO.00405BA8                  ; MKBEDITO.00405BA8
004055EB  |. 83C4 0C        |ADD ESP,0C
004055EE  |> 8B56 48         MOV EDX,DWORD PTR DS:[ESI+48]
004055F1  |. 803C1A 00      |CMP BYTE PTR DS:[EDX+EBX],0
004055F5  |.^75 E0          JNZ SHORT MKBEDITO.004055D7
004055F7  |> 8B4D FC        MOV ECX,DWORD PTR SS:[EBP-4]
004055FA  |. 51             PUSH ECX                                 ; /Arg3
004055FB  |. 6A 01          PUSH 1                                   ; |Arg2 = 00000001
004055FD  |. 56             PUSH ESI                                 ; |Arg1
004055FE  |. E8 A5050000    CALL MKBEDITO.00405BA8                   ; MKBEDITO.00405BA8
00405603  |. 83C4 0C        ADD ESP,0C
Обратная разработка одного проприетарного алгоритма шифрования - 28

После того, как пароли записаны, записывается размер исходной базы знаний (вернее - исходного текстового файла) в формате big-endian. Естественно, размер шифруется:

Побайтовая запись размера базы знаний
00405606  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
00405609  |. 50             PUSH EAX                                 ; /Arg3
0040560A  |. 8B56 0C        MOV EDX,DWORD PTR DS:[ESI+C]             ; |
0040560D  |. C1EA 18        SHR EDX,18                               ; |
00405610  |. 52             PUSH EDX                                 ; |Arg2
00405611  |. 56             PUSH ESI                                 ; |Arg1
00405612  |. E8 91050000    CALL MKBEDITO.00405BA8                   ; MKBEDITO.00405BA8
00405617  |. 83C4 0C        ADD ESP,0C
0040561A  |. 8B4D FC        MOV ECX,DWORD PTR SS:[EBP-4]
0040561D  |. 51             PUSH ECX                                 ; /Arg3
0040561E  |. 8B46 0C        MOV EAX,DWORD PTR DS:[ESI+C]             ; |
00405621  |. C1E8 10        SHR EAX,10                               ; |
00405624  |. 50             PUSH EAX                                 ; |Arg2
00405625  |. 56             PUSH ESI                                 ; |Arg1
00405626  |. E8 7D050000    CALL MKBEDITO.00405BA8                   ; MKBEDITO.00405BA8
0040562B  |. 83C4 0C        ADD ESP,0C
0040562E  |. 8B55 FC        MOV EDX,DWORD PTR SS:[EBP-4]
00405631  |. 52             PUSH EDX                                 ; /Arg3
00405632  |. 8B4E 0C        MOV ECX,DWORD PTR DS:[ESI+C]             ; |
00405635  |. C1E9 08        SHR ECX,8                                ; |
00405638  |. 51             PUSH ECX                                 ; |Arg2
00405639  |. 56             PUSH ESI                                 ; |Arg1
0040563A  |. E8 69050000    CALL MKBEDITO.00405BA8                   ; MKBEDITO.00405BA8
0040563F  |. 83C4 0C        ADD ESP,0C
00405642  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
00405645  |. 50             PUSH EAX                                 ; /Arg3
00405646  |. 8A56 0C        MOV DL,BYTE PTR DS:[ESI+C]               ; |
00405649  |. 52             PUSH EDX                                 ; |Arg2
0040564A  |. 56             PUSH ESI                                 ; |Arg1
0040564B  |. E8 58050000    CALL MKBEDITO.00405BA8                   ; MKBEDITO.00405BA8
00405650  |. 83C4 0C        ADD ESP,0C
Обратная разработка одного проприетарного алгоритма шифрования - 29

Дальше - начинается запись самой базы знаний в файл.

00405653  |. 33DB           XOR EBX,EBX
00405655  |. EB 15          JMP SHORT MKBEDITO.0040566C
00405657  |> 8B45 FC        /MOV EAX,DWORD PTR SS:[EBP-4]
0040565A  |. 50             |PUSH EAX                                ; /Arg3
0040565B  |. 8B56 08        |MOV EDX,DWORD PTR DS:[ESI+8]            ; |
0040565E  |. 8A0C1A         |MOV CL,BYTE PTR DS:[EDX+EBX]            ; |
00405661  |. 51             |PUSH ECX                                ; |Arg2
00405662  |. 56             |PUSH ESI                                ; |Arg1
00405663  |. E8 40050000    |CALL MKBEDITO.00405BA8                  ; MKBEDITO.00405BA8
00405668  |. 83C4 0C        |ADD ESP,0C
0040566B  |. 43             |INC EBX
0040566C  |> 3B5E 0C         CMP EBX,DWORD PTR DS:[ESI+C]
0040566F  |.^72 E6          JB SHORT MKBEDITO.00405657
00405671  |. 837E 24 00     CMP DWORD PTR DS:[ESI+24],0
00405675  |. 74 27          JE SHORT MKBEDITO.0040569E
00405677  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
0040567A  |. 50             PUSH EAX
0040567B  |. 8B56 20        MOV EDX,DWORD PTR DS:[ESI+20]
0040567E  |. C1EA 18        SHR EDX,18
00405681  |. 52             PUSH EDX                                 ; /Arg2
00405682  |. 56             PUSH ESI                                 ; |Arg1
00405683  |. E8 88030000    CALL MKBEDITO.00405A10                   ; MKBEDITO.00405A10
00405688  |. 83C4 08        ADD ESP,8
Обратная разработка одного проприетарного алгоритма шифрования - 30

После того, как процесс «шифрования» закончен, вычисляется контрольная сумма, которая записывается побайтово в формате big‑endian. Для каждого символа x[i] сумма вычисляется по формуле hash = hash ^ (x[i] << ((i&3)<<3):

Вычисление и запись контрольной суммы
0040568B  |. 33C9           XOR ECX,ECX                              ; |
0040568D  |. 8AC8           MOV CL,AL                                ; |
0040568F  |. 81E1 FF000000  AND ECX,0FF                              ; |
00405695  |. 51             PUSH ECX                                 ; |Arg1
00405696  |. E8 AD0A0600    CALL MKBEDITO.00466148                   ; MKBEDITO.00466148
0040569B  |. 83C4 08        ADD ESP,8
0040569E  |> 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
004056A1  |. 50             PUSH EAX                                 ; /Arg1
004056A2  |. E8 A9FC0500    CALL MKBEDITO.00465350                   ; MKBEDITO.00465350
004056A7  |. 59             POP ECX
004056A8  |. 33FF           XOR EDI,EDI
004056AA  |. 33DB           XOR EBX,EBX
004056AC  |. EB 15          JMP SHORT MKBEDITO.004056C3
004056AE  |> 8BCF           /MOV ECX,EDI
004056B0  |. 8B45 EC        |MOV EAX,DWORD PTR SS:[EBP-14]
004056B3  |. 83E1 03        |AND ECX,3
004056B6  |. 25 FF000000    |AND EAX,0FF
004056BB  |. C1E1 03        |SHL ECX,3
004056BE  |. D3E0           |SHL EAX,CL
004056C0  |. 33D8           |XOR EBX,EAX
004056C2  |. 47             |INC EDI
004056C3  |> 8B55 FC         MOV EDX,DWORD PTR SS:[EBP-4]
004056C6  |. 52             |PUSH EDX                                ; /Arg1
004056C7  |. E8 540A0600    |CALL MKBEDITO.00466120                  ; MKBEDITO.00466120
004056CC  |. 59             |POP ECX
004056CD  |. 8945 EC        |MOV DWORD PTR SS:[EBP-14],EAX
004056D0  |. 40             |INC EAX
004056D1  |.^75 DB          JNZ SHORT MKBEDITO.004056AE
Обратная разработка одного проприетарного алгоритма шифрования - 31

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

Заключение

В данной статье мы провели обратную разработку алгоритма шифрования «Малой экспертной системы 2.0», которое, по факту, оказалось не шифрованием, а сжатием, к которому применяется обфускация потока. Формат шифрованного файла MKB является устроенным таким образом, чтобы затруднить его обратную разработку и модификацию самих файлов в качестве каких‑либо экспериментов, то есть, для защиты файлов от взлома используется принцип «безопасности через неясность», который в современной криптографии считается крайне ненадёжным.

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

Автор: danila-kondr2004

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js