Сделал крякмис от нечего делать, Ссыль: http://gr8.cih.ms/uploads/crackme_vm.exe (6 кб) Сложность: средняя Задача: найти серийник под ваш ник =) Дерзайте, у кого есть время и кому не лень разгребать кодесы)
При беглом осмотре - ключ dword, так что можно набрутить =) Глубже пока не копал, просто любопытно - защита от брута есть?
раска, ты засранец... я так не успею первым сбрутить =))) хотя отрыв ото всех у мну уже есть ЗЫ: там футбол начался.... ток что, Great... секаса у меня не будет))) пойду смотреть
если пропустить прыжок на вывод неправильного сообщения, то выводит превуюи последнюю букву "М" в сообщении. Если пропустить всю проверку, то М только в конце Было бы время, поиздевался, а так - нет. Только зачем там SEH я не понял... PS Блин, расскажите кто-нибудь про это ваше приватное коммьюнити cih.ms
Ну кароч структура команд ясна - первый байт - опкод с двумя флагами. второй байт - по 4 бита индексы регистров вм. еще 2 дворда - добавление к содержимому регистров вм. за суммирование отвечает флаг в команде. данные грузятя из регистров вм в стековые переменные функции-обработчика. еще важным является регистр edx, ибо в нем результат выполняемой команды лежит. иль я где-то накосячил? ну а теперь надо декодировать команды вм. [ADDED] хехе, уже переписываю пикод на псевдоасм =) Ваще вм больше напоминает реальный проц нежели систему, целью которой служит усложнение исследования =) Больно все академично. Ах да, ключег вот: Ra$cal 568AA687 Ща допишу табличку опкодов и псевдокод. Code: mov r0, name mov r1, E98FB720 mov r7, key xor r4, r4 mov r5, name add r5, name_len lbl_NEXT_1: mov r3, dword_ptr [r0] xor r3, r1 add r4, r3 inc r0 ;// к следующей букве имени cmp r0, r5 jle lbl_NEXT_1 cmp r4, r7 jnz lbl_EXIT mov r8, 87148712 lbl_EXIT: mov r4, 0 ret 6 млабших бит первого байта команды - opcode 8ой бит первого байта команды - управление разыменовыванием r1 7ой бит первого байта команды - управление разыменовыванием r2 4 млабших бита второго байта - r1. Индекс регистра вм 4 старших бита второго байта - r2. Индекс регистра вм 4 байта - data_r2 4 байта - data_r1 Длина команды - 10 байт Если r1 или r2 равно 0x0C, то загружается в функцию data_r1 или data_r2 соответственно rvm0 - адрес имени rvm2 - длина имени rvm7 - ключ rvm1 - константа ксора 6 - xor r2, r1 3 - mov r2, r1 4 - add r2, r1 A - inc r1 F - cmp r2, r1 14 - jg $+0x0A 10 - jz $+0x0A 3F - ret
Ra$cal, довольно точно реверснул структуру команд VM, за исключением неокторых моментов. Могу дать подсказку, что регистр edx ничем не отличается от остальных в реализации VM, в самом интерпретаторе используются команды фиксированного размера по 10 байт, эмулируются 10 регистров общего назначения, а так же регистр указателя инструкций, регистр указателя стека и набор флагов для осуществления условных операций (только на условия e, g, l, ge, le) А вообще половина эмулируемых возможностей в коде не используется.. Вообще писал чисто ради интереса, если реверсить было так же интересно, то мне лишь приятно) Вообще было большое желание усложнить все это дело, что, видимо, и сделаю в следующий раз В следующий раз будет пожестче + некоторые интересные антиотладочные приемы.
да, я описал только то, что используется и не очень очевидно, vm_eip думаю каждый нашел =). ну и солюшн напешу для тех, кто неосилел. зы: на счет edx не согласен Code: 004020DD |> \807D 08 01 CMP BYTE PTR SS:[EBP+8], 1 004020E1 |. 75 02 JNZ SHORT crackme_.004020E5 004020E3 |. 8B3F MOV EDI, DWORD PTR DS:[EDI] 004020E5 |> 8917 MOV DWORD PTR DS:[EDI], EDX edx приходит из обработчиков команд. может это сделал компилятор, но в регистр вм пишется всегда содержимое регистра edx.
Nick: taha Password: 45F6431E Извините за задержку... просто мне тут друзья позвонили... пришлось отлучится попить пива и покурить пару бульбиков Вобщем Ай эм хеккер! Сериал ок Солюшен: 1. Патчим прогу Code: 004025A7 . FF35 7D154000 push dword ptr ds:[40157D] 004025AD . 68 55154000 push offset <crackme_.Nick> ; ASCII "taha" 004025B2 . E8 06FFFFFF call crackme_.004024BD 004025B7 . 84C0 test al,al 004025B9 75 08 jnz short crackme_.004025C3 004025BB FF05 7D154000 inc dword ptr ds:[40157D] 004025C1 ^ EB E4 jmp short crackme_.004025A7 004025C3 CC int3 004025C4 CC int3 2. Уходим пить пиво и курить траву! 3. Постим ник и пас Вот такой вот простой хэкк! add: Брут брутом, а я уже почти дореверисл вм
>> может это сделал компилятор я на фасме писал ) edx используется просто тупо потому, что в одном месте я написал код, который его юзает, а потом просто скопипастил с изменениями. получилось, что он везде юзается для одной цели. с другими регистрами в принципе так же ввиду того же копипаста)
вообще только птатчингом я и спасся минут за 5 проставив бряк на GetDlgTextItemA))) до алгоритма не докопался. Не подскажите хорошую статейку как вообще реализуется брутфорс для подбора пароля на программы?
там простейший алгоритм Статью про брут? ммммммм.... общего способа нет... Code: 004025A7 . FF35 7D154000 push dword ptr ds:[40157D] 004025AD . 68 55154000 push offset <crackme_.Nick> ; ASCII "taha" 004025B2 . E8 06FFFFFF call crackme_.004024BD 004025B7 . 84C0 test al,al 004025B9 75 08 jnz short crackme_.004025C3 004025BB FF05 7D154000 inc dword ptr ds:[40157D] 004025C1 ^ EB E4 jmp short crackme_.004025A7 004025C3 CC int3 004025C4 CC int3 Пароль лежит по адресу 40157D... call crackme_.004024BD ; функция, которая проверяет пароль... если правильный, то al = 1 обнуляем dword... дальше увеличиваем [40157D] на единицу и проверяем al... и так пока al не будет равен 1 Когда al = 1 смотрим, что находится по адресу 40157D... Вот и весь брут! Так по аналогии и в других прогах! Только это не эфективно
Можно было проще, загрузил в отладчик(OllyDbg) crackme, запустил, ввел любые данные например: 0verbreaK 123456789 Что бы искать было проще, затем, Search for -> All reference text strings, и находишь 00402599 . 68 69154000 PUSH crackme_.00401569 ; ASCII "123456789" и ты уже ближе к проверке, потом трасируешь потихоньку, недаром автора говорил копаться в коде, так как пройтись придется определенное время.
Ура! Грэйт, я тебя обожаю=))) Скинь исходник, если не жалко - давненько я такого изврата не видел=)) Так, чуть не забыл.. как и обещал - имя: TeruS пасс: 14F4F5D3 Раскрутил вм, после цикла вот это вот Code: 0F 74 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 03 C8 00 00 00 00 12 87 14 87 03 C4 00 00 00 00 00 00 00 00 3F 00 00 00 00 00 00 00 00 00 C3 C2 04 00 00 00 00 00 00 00 не смотрел, так как, к моему счастью, цифры, образовавщиеся после цикла, подошли Ничё се не отличается о_0... >>>added чтобы быстро узнать пасс, ставим бряк на 004023D4, и смотрим дворд по адресу 004023D4... усё=)
Мда исходник жжет, на самом деле способов обхода было много... но задача была поставлена одна - найти имя и соответсвующий ему пароль))) буду копаться дальше, спс за советы))
тоже выход)) я это обнаружил когда проморгал функцию вычисления пароля)) уже потомо посмторел на строки входа (по моему они там 2 раза дублирутся) но с разными адресами