Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 12 ноября!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

Исследование Moyea Swf to Video Converter v1.3.1.0

Обсудить статью на форуме

Очень удобно, когда все крэкерские инструменты, книги и статьи в одном месте. Используйте сборник от EXELAB - вот тут.

Автор: GeGter <pisem@net>

ПРЕЛЮДИЯ


Прога переводит Swf в Avi, Mpeg, MP4, 3GP, MOV, WMV, по легенде даже битые, естественно с поддержкой сжатия с помощью установленных в системе кодеков. Существует мнение (не мое, I'm don't known), что эта прога одна из лучших в своем роде. Ограничения в незареганой версии: наг скрин, предупрежление о наложении ватермарка, непосредственное наложение ватермарка по центру получаемого изображения. Данная статья не предназначена для нелегального использования данной софтины, а являет собой лишь предмет для показа многих ошибок и заблуждений программистов. Статья ко всему прочему будет содержать преднамеренные ошибки. После написания она не будет проверяться 1+ раз на грамматику, орфографию, пунктуацию и синтаксис, а также соблюдение общего смысла. Статья имеет одну важную идею, которой она будет следовать до последнего знака. Прочитать статью может любой страждущий и если даже истинных знаний он не почерпнет из нее, то ради интереса сделать это стоит. Данная прога была запрощена на взлом и на написание тутора на форуме крэклаба, ей соответствует ветка: http://cracklab.ru/f/index.php?action=vthread&forum=2&topic=7459 если конечно не переместят или не удалят. Для тестирования могу предложить данный мувик: http://rapidshare.com/files/12561651/021168145645343.swf.html

ВВЕДЕНИЕ


Для исследования данной программы мне понадобилось несколько основных инструментов: OllyDbg v1.10 (он(а) был(а) пропатчен(а) мной везде где только можно, класс и хэндл окна были изменены на GeGter - скромности мне не занимать, а фантазии нет, поэтому ничего сказать о том, определяет прога присутствие отладчика или нет, я не могу, но при первом взгляде на прогу с вероятностью 97% могу утверждать, что нет), WinHex, LordPe. Любой иснтрумент может быть убран из этого списка, либо заменен на аналогичный. Взять прогу для исследования можно здесь http://www.flash-video-mx.com/. Для чтения статьи рекомендую использовать Bred с гаммой Black и развернуть окно на весь экран с разрешением 1280*1024 пикселя на мониторе диагональю 19", а также включить перенос строк.

ОСНОВНАЯ ЧАСТЬ


Грузим прогу в олю и останавливаемся на oep, видим следующее:


00510234 >/$ 55               PUSH EBP
00510235  |. 8BEC             MOV EBP,ESP
00510237  |. 83C4 E4          ADD ESP,-1C
0051023A  |. 53               PUSH EBX
0051023B  |. 56               PUSH ESI
0051023C  |. 57               PUSH EDI
0051023D  |. 33C0             XOR EAX,EAX
0051023F  |. 8945 E4          MOV DWORD PTR SS:[EBP-1C],EAX
00510242  |. 8945 E8          MOV DWORD PTR SS:[EBP-18],EAX
00510245  |. 8945 EC          MOV DWORD PTR SS:[EBP-14],EAX
00510248  |. B8 84FD5000      MOV EAX,SWF2Vide.0050FD84
0051024D  |. E8 9A65EFFF      CALL SWF2Vide.004067EC
00510252  |. 8B3D B83D5100    MOV EDI,DWORD PTR DS:[513DB8]
00510258  |. 33C0             XOR EAX,EAX


Стандартное начало для проги написанной на Borland Delphi v7.0.

РАСПАКОВКА


Прокручиваю вверх и вижу, что определенный код олей не распознан, а это значит, что часть кода запакована. Очевидно, что сама прога, перед тем как запакованный код будет выполнен, должна его распаковать. Также заметно, что запакована только малая часть основного кода. Уже здесь можно догадаться, где следует копать. Чтобы поглядеть действительно ли все верно, что я написал выше, следует изменить один байт в запакованном участке кода на любой, а после вернуть все обратно. У оли в результате этого перещелкнет один контакт и она все изменяемные участки будет выделять красным цветом. Мне понравился байт по адресу 50B200, меняю его на 01 и обратно на B8 (пкм, binary, edit - or Ctrl+E). Далее отпускаем прогу - жмем F9. Экран заполнился красными байтами и по-идее я должен был увидеть наг скрин, но не увидел его, т.к. прога у меня уже пропатчена. Хм, заменю ка я пропатченные файлы оригинальными. Итак, я предлагаю сделать прогу полностью распакованной, т.к. распакованный код изучать куда приятнее. Кроме того торможение других людей (в том числе и на форуме), изучавших данную прогу, я связываю именно с тем, что они работали с запакованной прогой (по крайней мере до поры до времени). Это в свою очередь усложняло ее анализ. Кроме того вы не сможете ставить Toggle Breakpoint (F2), а только Hardware Breakpoint. Точнее сказать ставить то сможете, вот только ничего хорошего из этого не получится. Итак, смотрим где начинается распакованный код и где заканчивается (по выделенным красным байтам): начало - 50A224, конец - 50FCC3, весь остальной код неизменен. Запускаем Lord Pe и дампим часть (Dump Partial) проги: Address - 50A224, Size = 50FCC3 - 50A224 + 1 = 5AA0 (надеюсь понятно почему дополнительно + 1). Сохраняем в 1.code. Рекомендую сделать бэкап exe проги и dll. Теперь надо выяснить какая инструкция занимается распаковкой. Первая мысль - поставить бряк на запись по адресу 50A224 и... она безрезультатна, значит пишет сама в себя не прога, а тот, кто имеет более высокие права - библа (от слова библиутека). Хорошо, перезапускем прогу и делаем Search for all intermodular calls. Далее жмем кнопочку Destination и лезем вверх списка. Видим, что прога обращается к библам RegLib и VideoDra. Глянем ка в дирректорию прогу - действительно, есть такие библы, а также еще и другие. Здесь может возникнуть вопрос, почему прога не обращается к дрю библам - обращается, только через библы RegLib и VideoDra. И какое-то название у RegLib подозрительное. Я в тот момент решил поставить бряки на 3 найденых обращения к RegLib - это адреса 4FD618, 50FD1A и 5102C5. Ставим. Запускаем прогу. Сразу тормознулись на 5102С5. Жмем Ctrl+G - это перейти на заданный код и набираем (or copy & paste) 50A224, чтоб посмотреть распакован уже код или нет - у меня не распакован. Жмем F8, т.е. сделать шаг без захода в call. Опять лезем на адрес 50A224 и смотрим - код вновь не распакован. Жмем F9. Тормознули на 50FD1A. Смотрим, код не распакован. Повторяем F8 and go 50A224. Угу, код распакован. Идем в конец кода, который должен распаковаться, т.е. 50FCC3. Ok, весь код от начала и до конца распакован. Теперь понятно, что пишет код библа и вызов идет с 50FD1A:


0050FD10  /$ 68 C4FC5000      PUSH SWF2Vide.0050FCC4
0050FD15  |. 68 24A25000      PUSH SWF2Vide.0050A224
0050FD1A  |. E8 EDBDF6FF      CALL <JMP.&RegLib.#113>
0050FD1F  |. 83C4 08          ADD ESP,8
0050FD22  . C3               RETN


Restart и F9, заходим в call по адресу 50FD1A, а там:


0047BB0C   $-FF25 8C7A5100    JMP DWORD PTR DS:[<&RegLib.#113>]


Жмем F8. Попадаем на 20001923. Мы в библе, как в ... код глянете сами. Сразу бросились в глаза вызовы из kernel Virtual Protect, т.е. защита кода от изменения. Ну, я предлагаю потрасировать код - наиболее быстрый способ заработать себе что-то и сберечь глаза от изучения кода. Зажимаю F8 и радуюсь, смотря как изменяются регистры. У меня стал повторяться вот этот код:


2000198C   8B45 DC             MOV EAX,DWORD PTR SS:[EBP-24]      <-- начало цикла
2000198F   83C0 01             ADD EAX,1
20001992   8945 DC             MOV DWORD PTR SS:[EBP-24],EAX
20001995   8B4D DC             MOV ECX,DWORD PTR SS:[EBP-24]
20001998   3B4D CC             CMP ECX,DWORD PTR SS:[EBP-34]      <-- сравнение - все распаковано или нет?
2000199B   7D 65               JGE SHORT RegLib.20001A02          <-- выход из цикла, если все распаковано
2000199D   8B55 E4             MOV EDX,DWORD PTR SS:[EBP-1C]
200019A0   0355 DC             ADD EDX,DWORD PTR SS:[EBP-24]
200019A3   33C0                XOR EAX,EAX
200019A5   8A02                MOV AL,BYTE PTR DS:[EDX]
200019A7   C1F8 04             SAR EAX,4
200019AA   83E0 0F             AND EAX,0F
200019AD   33C9                XOR ECX,ECX
200019AF   8A88 70E40020       MOV CL,BYTE PTR DS:[EAX+2000E470]
200019B5   8B55 E4             MOV EDX,DWORD PTR SS:[EBP-1C]
200019B8   0355 DC             ADD EDX,DWORD PTR SS:[EBP-24]
200019BB   33C0                XOR EAX,EAX
200019BD   8A02                MOV AL,BYTE PTR DS:[EDX]
200019BF   83E0 0F             AND EAX,0F
200019C2   33D2                XOR EDX,EDX
200019C4   8A90 70E40020       MOV DL,BYTE PTR DS:[EAX+2000E470]
200019CA   C1E2 04             SHL EDX,4
200019CD   0BCA                OR ECX,EDX
200019CF   8B45 E4             MOV EAX,DWORD PTR SS:[EBP-1C]
200019D2   0345 DC             ADD EAX,DWORD PTR SS:[EBP-24]
200019D5   8808                MOV BYTE PTR DS:[EAX],CL           <-- Записывает в код
200019D7   8B4D E4             MOV ECX,DWORD PTR SS:[EBP-1C]
200019DA   034D DC             ADD ECX,DWORD PTR SS:[EBP-24]
200019DD   33D2                XOR EDX,EDX
200019DF   8A11                MOV DL,BYTE PTR DS:[ECX]
200019E1   8B45 DC             MOV EAX,DWORD PTR SS:[EBP-24]
200019E4   25 7F000080         AND EAX,8000007F
200019E9   79 05               JNS SHORT RegLib.200019F0
200019EB   48                  DEC EAX
200019EC   83C8 80             OR EAX,FFFFFF80
200019EF   40                  INC EAX
200019F0   33D0                XOR EDX,EAX
200019F2   8855 D8             MOV BYTE PTR SS:[EBP-28],DL
200019F5   8B4D E4             MOV ECX,DWORD PTR SS:[EBP-1C]
200019F8   034D DC             ADD ECX,DWORD PTR SS:[EBP-24]
200019FB   8A55 D8             MOV DL,BYTE PTR SS:[EBP-28]
200019FE   8811                MOV BYTE PTR DS:[ECX],DL           <-- Записывает в код
20001A00  ^EB 8A               JMP SHORT RegLib.2000198C          <-- Jmp ту начало цикла


Вот, с помощью этого кода библа и раскриптовывает запакованный код. Разбираться как это она делает желания у меня не было и я не разбирался (разборка в окончании статьи). Собственно ставим бряки на 200019FE и 200019D5 и смотрим, что куда она пишет (можно перезапустить прогу). Хм, при первом срабатывании бряка:


200019D5   8808                MOV BYTE PTR DS:[EAX],CL


где EAX = 20001000, а CL = 55, т.е. данная команда положит PUSH EBP на адрес 20001000, но ведь это ж библа! Значит часть кода в библе тоже распаковывается, чтож изменяем любой байт в библе и изменяем его на прежний, чтоб байты выделялись. Отпускаем прогу сняв все брякм (disable). В библе изменился код с адреса 20001000 до 20001907, итого size = 908 (считаем в уме). Перезапускаем прогу и ставим бряк с условием (Conditional) на 200019D5. Условие такое: EAX == 20001907, т.е. это будет конец распаковки библы. Старт проги (пишу в последний раз, должны уже догадываться сами, когда надо давить F9 или F8 или перезапустить прогу. если сделали что-то не так, перезапускаете прогу и начинаете с места где облажадись). Тормознулись, выпоняем код по F8, прыжок JGE (2000199B) выполнился, далее попадаем опять на этот злополучный цикл. Доходим до 200019D5 и в EAX у меня 50A225, пошла распаковка кода exe. Значит найденный цикл верный. Можно поставить условие EAX == 50FCC3 на 200019D5 и удостовериться в этом. Брякнулись, трасируем код, прыжок JGE выполнился, выход из библы, больше в код распаковки, начинающийся с 20001923 мы не попадем (чтоб проверить - ставьте бряк F2 на 20001923 и отпускайте прогу). Отпускаем прогу и делаем дамп части библы, также как и на примере с exe, и сохраняем его в 2.code. Отлично, теперь необходимо прилепить распакованный код библы и exe к соответствующим dll и exe. Грузим SWF2Video.exe в WinHex. Хм, теперь нужен offset. Грузим тот же SWF2Video.exe в LordPe и жмем кнопку FLC, вбиваем в VA (Virtual Adress) циферки и буковки 50A224 - это если еще не забыли начало распакованного кода в exe, жмем DO (Сделать). Запоминаем (именно запоминаем, а не записываем - тренируйте память), что написано в Offset. Переходим в WinHex и вбиваем полученный OffSet в "Позиция -> Перейти к смещению". Ok, перешли, теперь загружаем 1.code в WinHex, жмем Ctrl+A (выделить все) и копируем в буфера как Hex значения, далее вписываем!!! (а не вставляем) как Hex в SWF2Video.exe. Сохраняем. Аналогично делайте с reglib.dll, ей соответствует сдампленный участок 2.code, там кста offset вычисляется проще: 20001000 - 20000000 = ???. Вписываете, сохраняете. Ну, типа почти все. Почти! потому что библа будет пытаться раскриптовать распакованный код по-новой, т.е. на деле закриптует его вновь по xxx знает какому алгоритму, чтоб избежать этого, необходимо избавить ее от:


200019D5   8808                MOV BYTE PTR DS:[EAX],CL           <-- Записывает в код
и
200019FE   8811                MOV BYTE PTR DS:[ECX],DL           <-- Записывает в код


Два нупа, да еще два нупа будет четыре, однако. Справитесь сами? Олю придется прикрыть. Далее проверьте прогу на работоспособность - просто запустите ее - если она выдаст ошибку доступа, то значит она заметила, что вы ее пропатчили (изменили), т.е. сработала защита кода. В этом случае проделайте все, что выше вновь. Помните! один неверный байт (не соответствующий оригинальному, полученному при раскриптовке проги) и вас заметят. Как с этим бороться я расскажу ниже, т.к. патчить нам придется! и прога должна это понять.

ИЗУЧЕНИЕ ПРОГИ


Грузим в олю, и конечно лезем на распакованный код - 50A224, изучаем его до 50FCC3. Появились дополнительные обращения в reglib.dll и VideoDrawer.dll, и какие-то странные надписи: fullkey, license, trial. В этот момент у меня в голове вертелись мысли: "Скорее всего где fullkey - это проверка кода..." и "Обращения в VideoDrawer.dll не случайные, уж не ватермарк ли накладывается?". Но мысли эти временно вылетели из головы и меня переклинило поискать рег. код - чего и вам желаю. Запускаем прогу под отладчиком. Поймали исключение (раньше я на него не обращал внимание и далее обращать не буду!) по адресу 20001E2A - INT 1, нажимаем Shift+F9 и видим наг скрин, такой интересный наг скрин. Надпись Registration Code о чем то давно забытом говорит, но вот проблема? код то я не знаю. Вводим че нить от головы. Жмем заветную кнопку (правее) и Yo! мы зареганы, хотя, нет, обождите, пишут на белом фоне: "Invalid registration code", какой такой инвалид? Лады, в оле - Search for all referenced text strings, поднимаемся в выданном списке в самый верх и набираем в поиске "Invalid registration". По-секрету: нажатие Ctrl+L приведет к переходу на следующий найденный вариант. Дествительно правильный вариант был найден на 4FD644. Не торопитесь топать туда (а вдруг не то место, а вы уже начнете там код изучать), просто поставьте бряк F2 и нажмите повторно на "Register". Тормознули, умно смотрим код выше:


004FD631   . E8 5A70F0FF    CALL SWF2Vide.00404690
004FD636   . 83F8 18        CMP EAX,18                     <-- сравнение длины введенного кода!
004FD639   . 74 49          JE SHORT SWF2Vide.004FD684     <-- если длина верная, то сообщения не будет
004FD63B   . 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
004FD63E   . 8B80 10030000  MOV EAX,DWORD PTR DS:[EAX+310]
004FD644   . BA A0D74F00    MOV EDX,SWF2Vide.004FD7A0      ;  ASCII "Invalid registration code"
004FD649   . E8 6AC7F5FF    CALL SWF2Vide.00459DB8         <-- вывод сообщения о неверном коде
004FD64E   . 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]


Что мы имеем из этого: знаем длину пасса - 24 символа (18 шестнадцетеричное, т.е. hex). Хм, вводим пасс состоящий из 24 символов. Прыжок выполнился, стек начал быстро мелеть, прога закрылась и вновь открылась. Вот с##а, вылезла из под отладчика. В оле написано Terminated. Вывод: если ключ введен длиной 24 символа, то прога пишет его в Myego.dat (было видно), идет на перезапуск и при старте считывает его из Myego.dat и проверяет на дрю условия. В общем дальше я покавырял поиск валидного ключега, но за 15 минут ни че хорошего не нашел, поэтому забил на ключик. Я выяснил только, что ключ считывается, рабивается на части по 12 символов, а после по 6 символов и проверяется на неявные условия. Подглядеть в стеках валидный ключ у меня не получилось. Если хотите, то возьмите себе домашнее задание - найти валидный ключ - можно изучением проверок, можно брутфорсом - только не вручную! Прога принимает любой ключ длиной 24 символа (буквы, цифры, знаки и т.д.), например "QG6^IK#GDPL:'589V1JDSUJH", поэтому брутфорс может быть долгим.

УДАЛЕНИЕ НАЛОЖЕНИЯ ВАТЕРМАРКА


Первым делом бы хотелось убрать наг. Помните надписи fullkey -> вот туда и топаем. Делайте поиск текста. У меня нашлось fullkey по адресам: 4FD6BE - это не то, т.к. здесь проверка на длину паса, а мы ее уже прошли, 50FA97 и 50FB4C - это уже ближе:


0050FB37  |. 837D EC 00     CMP DWORD PTR SS:[EBP-14],0     <-- показывать наг или нет?
0050FB3B  |. 74 1C          JE SHORT SWF2Vide.0050FB59      <-- прыгаем если не надо
0050FB3D  |. 8D45 EC        LEA EAX,DWORD PTR SS:[EBP-14]
0050FB40  |. E8 6F48EFFF    CALL SWF2Vide.004043B4
0050FB45  |. 6A 00          PUSH 0
0050FB47  |. BA 98FC5000    MOV EDX,SWF2Vide.0050FC98       ;  ASCII "License"
0050FB4C  |. B9 88FC5000    MOV ECX,SWF2Vide.0050FC88       ;  ASCII "fullkey"
0050FB51  |. 8B45 E8        MOV EAX,DWORD PTR SS:[EBP-18]
0050FB54  |. 8B18           MOV EBX,DWORD PTR DS:[EAX]
0050FB56  |. FF53 04        CALL DWORD PTR DS:[EBX+4]
0050FB59  |> 33C0           XOR EAX,EAX


Обратите внимание на 50FB37, именно это позволило мне в тот момент быстро выйти на прыжок, отменяющий наложение ватермарка. Итак, изменяйте в exe (с помощью WinHex) байт 74 на EB. В этот момент на форуме (ссыль выше) появились первые сообщения, что код проги покриптован (нужен лоадер), где находится fullkey и как распаковывается код - все это уже проделано. Запускаем прогу и видим сообщение об ошибке - ошибка доступа. Если сказать не языком программистов, желающих запутать нас, а по-русски, то "Нас пальнули". Прога заметила, что мы изменили ее код. Именно не то, что мы распаковали код (она провнряет валидность истинного кода, а не пакованного), а то, что мы делаем из незареганной версии зарегистрированную. Запомнили адресок? Ползите туда:


20001D90  /$ 55              PUSH EBP
20001D91  |. 8BEC            MOV EBP,ESP
20001D93  |. 83EC 0C         SUB ESP,0C
20001D96  |. 8D45 FC         LEA EAX,DWORD PTR SS:[EBP-4]
20001D99  |. 8945 F8         MOV DWORD PTR SS:[EBP-8],EAX
20001D9C  |. 8B4D F8         MOV ECX,DWORD PTR SS:[EBP-8]
20001D9F  |. 81C1 00020000   ADD ECX,200
20001DA5  |. 894D F8         MOV DWORD PTR SS:[EBP-8],ECX
20001DA8  |. C745 F4 000000> MOV DWORD PTR SS:[EBP-C],0
20001DAF  |. EB 09           JMP SHORT RegLib.20001DBA
20001DB1  |> 8B55 F4         /MOV EDX,DWORD PTR SS:[EBP-C]
20001DB4  |. 83C2 01         |ADD EDX,1
20001DB7  |. 8955 F4         |MOV DWORD PTR SS:[EBP-C],EDX
20001DBA  |> 817D F4 000200>  CMP DWORD PTR SS:[EBP-C],200
20001DC1  |. 7D 10           |JGE SHORT RegLib.20001DD3
20001DC3  |. E8 D32C0000     |CALL RegLib.20004A9B
20001DC8  |. 8B4D F4         |MOV ECX,DWORD PTR SS:[EBP-C]
20001DCB  |. 8B55 F8         |MOV EDX,DWORD PTR SS:[EBP-8]
20001DCE  |. 89048A          |MOV DWORD PTR DS:[EDX+ECX*4],EAX  <-- возникнет ошибка
20001DD1  |.^EB DE           JMP SHORT RegLib.20001DB1
20001DD3  |> 8BE5            MOV ESP,EBP
20001DD5  |. 5D              POP EBP
20001DD6  . C3              RETN


Глупая, кричит, что ее патчат, а надо тихо закрываться. Исправляем ошибку: меняем байт 55 на С3 по адресу 20001D90, т.е. PUSH EBP на RETN. Закроем олю, перейдем в WinHex на 1D90 в библе reglib.dll и исправим байт 55 на C3 - пояснять надо? Запускаем прогу -> запустилась без ошибок (если у вас другое -> где-то вы ошиблись). Запускаем, теперь нага нет. Отмечу, что необходимо хотя бы один раз ввести любой ключег длиной 24 символа, либо до пропатчивания, либо после -> иначе наг все равно будет. Теперь желательно избавиться от предупреждения о наложении ватермарка при попытке конвертации (первоначально загрузите в прогу любой swf) swf в avi (4 Convert). Прога выкидывает окошко с надписью: "This is a trial version product ...". Окошко больно напоминает MessageBox. Щелкаем "Отмена" и ставим бряки на все MessageBox. Щелкаем вновь Convert, брякнулись на 50BC42:


0050BC11   . 80B8 0C050000 00      CMP BYTE PTR DS:[EAX+50C],0        <-- вновь знакомое сравнение с 0
0050BC18   . 74 34                 JE SHORT SWF2Vide.0050BC4E         <-- прыгаем если зареганы
0050BC1A   . 6A 21                 PUSH 21
0050BC1C   . 8D55 88               LEA EDX,DWORD PTR SS:[EBP-78]
0050BC1F   . A1 B83D5100           MOV EAX,DWORD PTR DS:[513DB8]
0050BC24   . 8B00                  MOV EAX,DWORD PTR DS:[EAX]
0050BC26   . E8 C5E4F6FF           CALL SWF2Vide.0047A0F0
0050BC2B   . 8B45 88               MOV EAX,DWORD PTR SS:[EBP-78]
0050BC2E   . E8 5D8CEFFF           CALL SWF2Vide.00404890
0050BC33   . 50                    PUSH EAX
0050BC34   . 68 04C55000           PUSH SWF2Vide.0050C504             ;  ASCII "This is a trial ..."
0050BC39   . 8B45 FC               MOV EAX,DWORD PTR SS:[EBP-4]
0050BC3C   . E8 BF49F5FF           CALL SWF2Vide.00460600
0050BC41   . 50                    PUSH EAX                           ; |hOwner
0050BC42   . E8 89B7EFFF           CALL <JMP.&user32.MessageBoxA>     ; MessageBoxA
0050BC47   . 48                    DEC EAX
0050BC48   . 0F85 01080000         JNZ SWF2Vide.0050C44F
0050BC4E   > 8B45 F0               MOV EAX,DWORD PTR SS:[EBP-10]


Надо объяснять, что делать далее? Правим один байт в WinHex. Теперь пора избавляться от ватермарка. Посмотрите, при Capture его нет, а вот при анализе записи на диск уже происходит его наложение. Ставим бряки на обращения к VideoDrawer.dll. У меня их получилось 33. F9. Брякнулись на 50A301 - это явно не то, т.к. с видео мы пока не работаем. Снимаем бряк и F9. Загружаем любой swf, выбираем Convert (баловаться с опциями будете потом). Брякнулись на 50CEF0 - это еще рано (я обращал внимание на время наложение ватермарка). Снимаем бряк и F9. Пошел анализ swf. Предлагают выбрать Capture Speed - соглашаемся с приведенным - жмем Next. Start Capture. Ждем секунд 10 и щелкаем финиш. Ага! брякнулись на 50D191:


0050D111   > 80BE 0C050000 00    CMP BYTE PTR DS:[ESI+50C],0
0050D118   . 0F84 B2000000       JE SWF2Vide.0050D1D0
// вырезано //
0050D190   . 50             PUSH EAX
0050D191   . E8 8601FFFF    CALL <JMP.&VideoDrawer.#317>     <-- бряк
0050D196   . 68 C8000000    PUSH 0C8
0050D19B   . 8B86 E8040000  MOV EAX,DWORD PTR DS:[ESI+4E8]
0050D1A1   . 50             PUSH EAX
0050D1A2   . E8 7D01FFFF    CALL <JMP.&VideoDrawer.#319>     <-- бряк
0050D1A7   . 6A 02          PUSH 2
0050D1A9   . 8B86 E8040000  MOV EAX,DWORD PTR DS:[ESI+4E8]
0050D1AF   . 50             PUSH EAX
0050D1B0   . E8 7701FFFF    CALL <JMP.&VideoDrawer.#322>     <-- бряк
0050D1B5   . 6A FF          PUSH -1
0050D1B7   . 6A 00          PUSH 0
0050D1B9   . 6A FF          PUSH -1
0050D1BB   . 8D85 60FFFFFF  LEA EAX,DWORD PTR SS:[EBP-A0]
0050D1C1   . 50             PUSH EAX
0050D1C2   . 6A 00          PUSH 0
0050D1C4   . 8B86 E8040000  MOV EAX,DWORD PTR DS:[ESI+4E8]
0050D1CA   . 50             PUSH EAX
0050D1CB   . E8 2401FFFF    CALL <JMP.&VideoDrawer.#309>     <-- бряк
0050D1D0   > BF C4FC5000    MOV EDI,SWF2Vide.0050FCC4


Обратите внимание на 50D111 - я указывал несколько раз на это сравнение. Если JE по адресу 50D118 выполнится, то ватермарк накладываться не будет. Меняйте его на JNZ - сменится один байт 50D119 - 84 -> 85. Исправляйте его в WinHex. Теперь тестируйте прогу -> ограничений нет.

ПАТЧ или ИССЛЕДОВАНИЕ КРИПТО ДВИЖКА


Fix exe & dll - это конечно хорошо (именно данные результаты я вначале выложил на форум, т.к. времени в тот момент клепать патч не было), но они имеют довольно приличный размер - 650 Кб в архиве, поэтому сделать патч - разумнее. Сейчас будем патчить запакованный код, т.е. необходимо изменить байты таким образом, чтобы при раскриптовке JE стал JMP или JNZ. Необходимо подробнее рассмотреть движок раскриптовки (я рассмотрю его на примере раскриптовки байта для 50A227 !!!):


2000198C   8B45 DC             MOV EAX,DWORD PTR SS:[EBP-24]      <-- начало цикла
2000198F   83C0 01             ADD EAX,1
20001992   8945 DC             MOV DWORD PTR SS:[EBP-24],EAX
20001995   8B4D DC             MOV ECX,DWORD PTR SS:[EBP-24]
20001998   3B4D CC             CMP ECX,DWORD PTR SS:[EBP-34]      <-- сравнение - все распаковано или нет?
2000199B   7D 65               JGE SHORT RegLib.20001A02          <-- выход из цикла, если все распаковано
2000199D   8B55 E4             MOV EDX,DWORD PTR SS:[EBP-1C]
200019A0   0355 DC             ADD EDX,DWORD PTR SS:[EBP-24]
200019A3   33C0                XOR EAX,EAX
200019A5   8A02                MOV AL,BYTE PTR DS:[EDX]           <-- кладем в AL байт прочтенный из кода, т.е. DB
200019A7   C1F8 04             SAR EAX,4                          <-- сдвигаем EAX вправо, т.е. от DB в AL останется D
200019AA   83E0 0F             AND EAX,0F
200019AD   33C9                XOR ECX,ECX
200019AF   8A88 70E40020       MOV CL,BYTE PTR DS:[EAX+2000E470]  <-- кладем в CL байт из массива соответствующий EAX+2000E470,
200019B5   8B55 E4             MOV EDX,DWORD PTR SS:[EBP-1C]          т.е. 2000E470+D = 2000E47D - в массиве это 00 (см. ниже)
200019B8   0355 DC             ADD EDX,DWORD PTR SS:[EBP-24]
200019BB   33C0                XOR EAX,EAX
200019BD   8A02                MOV AL,BYTE PTR DS:[EDX]           <-- кладем в AL тот же байт D1
200019BF   83E0 0F             AND EAX,0F                         <-- от DB в AL останется только B
200019C2   33D2                XOR EDX,EDX1
200019C4   8A90 70E40020       MOV DL,BYTE PTR DS:[EAX+2000E470]  <-- кладем в DL байт 0C из массива (2000E47B)
200019CA   C1E2 04             SHL EDX,4                          <-- сдвигает EDX влево, т.е. в DL будет С0
200019CD   0BCA                OR ECX,EDX                         <-- складывает EDX и ECX, т.е. С0+00=С0
200019CF   8B45 E4             MOV EAX,DWORD PTR SS:[EBP-1C]
200019D2   0345 DC             ADD EAX,DWORD PTR SS:[EBP-24]
200019D5   8808                MOV BYTE PTR DS:[EAX],CL           <-- Записывает в код С0
200019D7   8B4D E4             MOV ECX,DWORD PTR SS:[EBP-1C]
200019DA   034D DC             ADD ECX,DWORD PTR SS:[EBP-24]
200019DD   33D2                XOR EDX,EDX                        <-- обнуление EDX
200019DF   8A11                MOV DL,BYTE PTR DS:[ECX]           <-- кладем С0 в DL из кода (только что записали)
200019E1   8B45 DC             MOV EAX,DWORD PTR SS:[EBP-24]
200019E4   25 7F000080         AND EAX,8000007F
200019E9   79 05               JNS SHORT RegLib.200019F0
200019EB   48                  DEC EAX
200019EC   83C8 80             OR EAX,FFFFFF80
200019EF   40                  INC EAX                            <-- увеличение на 1 EAX
200019F0   33D0                XOR EDX,EAX                        <-- хорим С0 с EAX, т.е. xor C0,03 = C3
200019F2   8855 D8             MOV BYTE PTR SS:[EBP-28],DL
200019F5   8B4D E4             MOV ECX,DWORD PTR SS:[EBP-1C]
200019F8   034D DC             ADD ECX,DWORD PTR SS:[EBP-24]
200019FB   8A55 D8             MOV DL,BYTE PTR SS:[EBP-28]
200019FE   8811                MOV BYTE PTR DS:[ECX],DL           <-- Записывает в код полученное С3
20001A00  ^EB 8A               JMP SHORT RegLib.2000198C          <-- Jmp ту начало цикла

Массив для раскриптовки:
2000E470  0F 04 0E 02 01 03 07 0D
2000E478  05 09 0A 0C 08 00 0B 06
2000E480  0D 04 03 05 01 08 0F 06
2000E488  0C 09 0A 0E 0B 07 02 00


Надеюсь по комментам понятно, если нет самостоятельно учим ассемблер. Обратите внимание на увеличение EAX на 1 с каждым прохождением цикла, т.е. первоначально константа для xor имеет значение 00, а после увеличивается постоянно на 1, т.е. мы имеем не постоянную константу. В приведенном случае идет xor с 03, т.к. 50A227 - 50A224 (начало цикла) = 03. Команда xor обратима, т.е. X xor Y = Z и мы знаем из этого Z - что нам надо получить, и Y - константу, то мы можем легко найти X = Y xor Z. Все полюбили этот прием, т.к. он быстр и удобен, но чтобы несколько усложнить раскриптовку программисты сделали увеличение константы, хоть и на 1 (хотя это могло быть любое число), т.е. константа переменная. Константа линейно увеличивается, т.е. 00, 01, 02, ... , 5B, 5C, 5D, ... , 7E, 7F, и вновь 00, 01, ... Итак избавление от нага: необходимо изменить один байт по адресу 50FB3B на такой, чтобы после раскриптовки он стал не 74, а EB. Т.е. мы имеем Z = EB. В оле ставим бряк с условием EAX == 50FB3B на адрес 200019D5. Смотрим EAX = 17, т.е. Y = 17. Вычисляем X = Y xor Z = 17 xor EB = FC. Раскладываем FC на a=0C и b=0F - обратите внимание, что a соответствует вторая часть байта (почему - смотрим алгоритм раскриптовки выше). Смотрим в массиве для a это B и для b это 0, т.е. получили байт B0 !!! Заменяйте распакованные варианты проги и библы на оригинальные и в WinHex меняйте байт по адресу 50FB3B - offset 10EF3B - 5F -> B0. Запускаем прогу, библа кричит, что ее патчат, исправляем это также как в прошлый раз: offset 1D90 в библе reglib.dll, байт 55 на C3. Запускаем вновь - нага нет (посмотреть как исправился байт можно в отладчике). Теперь убираем предупреждение: Z = EB, Y = 74, отсюда X = 74 xor EB = 9F, раскладываем: a=0F и b=09. Соответственно получаем из массива 0 и 9, т.е. байт 09. Изменяем в WinHex. Теперь ватермарк. Необходимо сменить байт при раскриптовке 84 на 85 по адресу 50D119. Имеем: Z = 85, Y = 75, отсюда X = F0, тогда a=00, b=0F, это соотв. D и 0, т.е. получаем байт D0. Заменяем (не забывайте высчитывать правильно offset!) и проверяем.

ЗАКЛЮЧЕНИЕ


Теперь можно сделать маленький приятный патч. Патч должен изменять 3 байта в SWF2Video.exe, 1 байт в reglib.dll (чтоб не кричала о патченье) и таскать с собой Myego.dat (чтоб не вводить пасс 24 символьный) - вот это его миссия. Результат исследования проги: мне пришлось переустанавливать винду (хотя это и не из-за проги, а из-за ее преждевременного износа моими усилиями), pavka не спал всю ночь (сори от меня - надо было сказать ему тогда где накладывается ватермарк, хотя под утро он это всеж нашел, правда не знаю как). Ну, и наверное, P.S. у меня на взлом данной прожки ушло 2 часа свободного времени, хотя на написание статьи я потратил больше. Все вопросы на крэклаб, в раздел новичков: http://cracklab.ru/f/index.php?action=vtopic&forum=5. Ну, и наконец не верьте всему, что пишут, т.к. звучало, что "нужен лоадер", патч будет делать сложно, т.к. прога использует Virtual Protect и т.д., не буду показывать пальцем - проверяйте все сами, но не впадайте в маразм. Можете считать, что сегодня у вас хороший день, т.к. вы съэкономили "ONLY $79.95".

P.P.S. слушайте качественный музон... он мне помог при написании статьи.

GeGter
21.01.07



Обсуждение статьи: Исследование Moyea Swf to Video Converter v1.3.1.0 >>>


Комментарии к статье: Исследование Moyea Swf to Video Converter v1.3.1.0


Материалы находятся на сайте https://exelab.ru



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS