Одно время я занимался разработкой порта «Малой экспертной системы 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 обнаружить все файлы, которые будут установлены на компьютер:
Как видно на рисунке выше, и сама «Малая ЭС», и «Редактор баз знаний» — это EXE‑файлы, которые, по всей видимости, слинкованы статически. Если посмотреть строки, которые содержатся внутри этих файлов, то можно заметить, что Малая экспертная система была написана на Borland C++ Builder с использованием Borland VCL:
Вместе с программой поставляется справка в формате WinHelp, которая на современных версиях Windows не открывается, однако её можно просмотреть в Windows XP и более ранних версиях.
Чтобы, однако, судить о том, что делает эта программа, нужно будет заглянуть в исходные коды. Для этого я использовал 86Box с установленной Windows 98 SE и отладчиком OllyDbg.
Ищем процедуру загрузки базы знаний
Чтобы раскрыть алгоритм шифрования базы знаний, необходимо понять, откуда начинать отладку машинных кодов. Отправной точкой для расшифровки базы знаний является её загрузка из файла. Чтобы наткнуться на процедуру загрузки, я решил перехватывать функцию WinAPI MessageBox, так как она обычно вызывается при ошибке.
Ищем строку в памяти, которая соответствует одному из сообщений об ошибке (она доступна по адресу 0x47С510) и место, где мы к ней обращаемся.


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

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

Ставим точку останова и переходим на адрес 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
Код на ассемблере достаточно сложно разобрать, однако можно заметить, что из входного потока считывается по одному биту. Биты группируются в символы длиной от 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
Функция распутывания использует номер состояния от 0 до 15 и принимает на вход байт, который необходимо преобразовать. Для этого используется большой switch‑case, который можно выразить таблицей.
|
№ состояния |
Операция |
|
0 |
|
|
1 |
|
|
2 |
|
|
3 |
|
|
4 |
|
|
5 |
|
|
6 |
|
|
7 |
|
|
8 |
|
|
9 |
|
|
10 |
|
|
11 |
|
|
12 |
|
|
13 |
|
|
14 |
|
|
15 |
|
Переворот бит обозначен как функция 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
Новый номер состояния генерируется по формуле
где — старое состояние,
— расшифрованный байт,
— новое состояние.
Таким образом, можно сделать вывод, что всё шифрование представляет собой сжатие с обфускацией. Если так, то существует возможность извлечь не только базу знаний, но и пароль от неё.
Разбор формата базы знаний
Чтобы понять, каким образом устроен формат зашифрованной базы знаний, необходимо сначала заглянуть внутрь файла, чтобы понимать, что искать. Зашифруем одну из известных баз знаний и откроем её в 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
Можно заметить, что строка по адресу 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
Один из аргументов, собственно указатель на файл, сохраняется на стеке и является результатом вызова функции 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
Перед магической строкой идёт один байт, который формируется следующим образом:
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
По адресу 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
Количество случайных байт определяется очень просто: ранее записанный байт делится на 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
Далее генерируется состояние деобфускатора, для которого в очередной раз генерируется случайное число, откуда берутся 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
После того, как деобфускатор инициализирован, генерируется алфавит дуплетов. Генерируется он очень просто: исходный текст базы знаний разбивается на дуплеты, количество дуплетов подсчитывается, далее при помощи пузырьковой сортировки они сортируются по частоте:
Подсчёт дуплетов
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
После того, как дуплеты отсортированы, они записываются в один байт по достаточно хитрой формуле: наиболее частый помещается в 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
Полученный алфавит дуплетов обрабатывается функцией 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
После того, как пароли записаны, записывается размер исходной базы знаний (вернее - исходного текстового файла) в формате 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
Дальше - начинается запись самой базы знаний в файл.
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
После того, как процесс «шифрования» закончен, вычисляется контрольная сумма, которая записывается побайтово в формате 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
Таким образом, можно сделать вывод, что шифрование по факту является сжатием со слоем детерминированной обфускации.
Заключение
В данной статье мы провели обратную разработку алгоритма шифрования «Малой экспертной системы 2.0», которое, по факту, оказалось не шифрованием, а сжатием, к которому применяется обфускация потока. Формат шифрованного файла MKB является устроенным таким образом, чтобы затруднить его обратную разработку и модификацию самих файлов в качестве каких‑либо экспериментов, то есть, для защиты файлов от взлома используется принцип «безопасности через неясность», который в современной криптографии считается крайне ненадёжным.
Тем не менее, свою задачу такая схема обфускации выполняла в течение долгого времени. Пользователь, который хотел посмотреть шифрованный файл, не мог этого сделать, поскольку для этого требовался пароль, кроме того, такой файл нельзя было прочесть ничем, кроме программы, в которой он был создан.
Автор: danila-kondr2004
