Net Sea War v4.00 Идеальный взлом для самых маленьких (2 метода) [ Хакерство для новичков ] Автор: Плёткин Олег aka $had0w E-Mail: oleg666@list.ru Дата: 14.12.05 Net Sea War v4.00 Идеальный взлом для самых маленьких в два метода.(by $had0w) Пролог. Статей про изменение заветного байта в программе с целью её регистрации написано не мало и все они, естественно, ориентированны на начинающих крэкеров. Но всё же, как говориться: «повторение - мать учения». Перво-наперво пойми раз и навсегда – чтобы быть хакером, ты обязан хотя бы на среднем уровне владеть ассемблером! Без знания ассемблера тебе ни одну даже самую простенькую прожку не сломать! Итак, бери большую кружку пива (сигареты, вино, соль, перец по вкусу…) и начинай внимать, всё чему я тебя сегодня постараюсь научить. Почему именно Net Sea War. На первых порах всегда трудно найти хорошую программку для тренировки. Специально для этой цели написано множество crackme, но всё же, ломать настоящие программы всегда интересней, а Net Sea War как нельзя лучше подходит для одного из первых взломов. Инструментарий. Ни один взлом никогда не обходится без инструментов, по большому счёту мы даже банку консервов взломать без инструментов не в состоянии? Но сегодня мы используем минимум инструментов, т.к защитой в программе даже не пахнет, но всё же, блокнотом нам её не одолеть. Что нам понадобится: Net Sea War 4 – Можно конечно обойтись и без него, но в таком случае, нам нечего будет ломать?…Где взять – не знаю, зато подскажу где можно найти http://softsearch.ru через него можно найти практически любой софт. HDasm – или любой другой дизассемблер. Мне больше по душе HDasm, чем, к примеру, Win32Dasm, но как бы то ни было, любую из этих программ, ты сможешь найти на просторах рунета. Зайди на http://wasm.ru HIEW – на правах одного из лучших редакторов файлов PE формата (если ты вдруг ещё не знаешь – именно в этом формате идут все EXE и DLL в Win32) Исследование. Думаю, что ты уже в курсе, что взлом всегда начинается с исследования целевой программы. Поэтому, не будем отступать от традиций и начнём именно с исследования. Итак, первый запуск. Нас попросят ввести имя, и в роли кого мы будем выступать в соединении (клиентом или сервером). Мы выбираем сервер. В строке состояния будет сказано, что мы можем подождать, пока к нам приконнектится клиент или можно нажать F2 для боя с компом. Жмём F2. Расставляем корабли, и мочим безжалостно бедного, тупого компа… уже размочили? Да? Ну, вот и славненько. Поиграв ещё некоторое время, мы обнаруживаем весёлое сообщение, о том, что нужно бы нам заплатить, чтобы поиграть. Тут я намерен сделать некоторое отступление. Я полагаю, что если ты читаешь эту статью, ты относишься к группе тех людей, которые в жизни ни цента из своего кармана не отдали за софт (и не собираются). К этим людям отношу себя и я. Конечно, скажут некоторые, что это не справедливо по отношению к авторам, но я придерживаюсь мнения, что удел поэта – слава. Про юмористов из M$ молчу. Может действительно, возьмём и заплатим, а? Хорошо, идём на офф сайт и платим... Ладно, шучу. Загружаем программу ещё раз. Жмём Registration->Register . и видим окошко для ввода серийника. Попробуйте ввести “fdsfsf”… ага, просит только integer(т.е число). Вводим “12345”. На что нам выпадает сообщение о неверном серийнике. Запоминаем этот текст (он нам ещё пригодиться). Подведём итог: программа в качестве кода принимает только цифры. Ждёт некоторое время и только по прошествии, которого программа закрывается => срабатывает таймер. Ломка. Метод №1 или выдернем серийник. Открываем HDasm File->Open->”seawar.exe” Дизассемблируем в обычном режиме (Mode – Normal) выбранные сектора (Disassemble selected sections) тип файла PE и выбираем секцию .text После дизассембляции мы получим ассемблерный код программы именно его нам, и придется исследовать. Спешу тебя обрадовать – это не надолго? Выбираем References->String References. И вводим там текст о неверном серийном коде(“Sorry, your personal registration code is uncorrect.”) Мы обнаруживаем, что такой текст найден, кликаем по нему дважды и оказываемся на следующем коде 00404E7F: 50 push eax * String: "Sorry, your personal registration code is uncorrect." 00404E80: 680C024300 push 0043020C 00404E85: 8B4D90 mov ecx, [ebp-70] 00404E88: E8DC530100 call 0041A269 это означает, что call 0041A269 вызывает функцию показа сообщения. А push 0043020C кладёт в стек указатель на строчку о неверном серийнике. Взглянем чуточку выше: * String: "Thank You for support NetIntellGames shareware authors!" 00404E53: 68D4014300 push 004301D4 00404E58: 8B4D90 mov ecx, [ebp-70] 00404E5B: E809540100 call 0041A269 ;Вызов сообщения о верном сн 00404E60: EB2B jmp 00404E8D * Jump: 00404E33(C) ;Сюда прыгают с адреса 00404E33 00404E62: 8B5590 mov edx, [ebp-70] 00404E65: C7828402000000000000 mov dword ptr [edx+00000284], 00000000 00404E6F: 6A10 push 00000010 00404E71: 8B4D90 mov ecx, [ebp-70] 00404E74: 81C17C020000 add ecx, 0000027C 00404E7A: E8C1C6FFFF call 00401540 00404E7F: 50 push eax * String: "Sorry, your personal registration code is uncorrect." 00404E80: 680C024300 push 0043020C 00404E85: 8B4D90 mov ecx, [ebp-70] 00404E88: E8DC530100 call 0041A269 ;Вызов сообщения о неверном сн Вы не заметили ничего странного? И я заметил. Точнее это даже не странность, а уже закономерность ламерских Шароварок. * Jump: 00404E33(C) ;Кликните дважды по этому тексту в HDasm 00404E62: 8B5590 mov edx, [ebp-70] Как мы видим на адрес, 00404E62 прыгают с адреса 00404E33. Кликнув дважды, мы видим: 00404E2B: E8AE0B0000 call 004059DE 00404E30: 83F801 cmp eax, 00000001 00404E33: 752D jne 00404E62 ;Если EAX не равен 01 прыгаем Похоже, что данный код работает так: call 004059DE проверяет наш код, если он подходит, ставит в EAX 01. Кликаем дважды по call 004059DE. И видим следующее: * Call: 00402804, 0040285B, 00404E2B 004059DE: 55 push ebp 004059DF: 8BEC mov ebp, esp 004059E1: 51 push ecx 004059E2: 894DFC mov [ebp-04], ecx 004059E5: 6A00 push 00000000 * String: "Reg" 004059E7: 6878034300 push 00430378 * String: "Names" 004059EC: 687C034300 push 0043037C 004059F1: E87ABEFFFF call 00401870 004059F6: 8BC8 mov ecx, eax 004059F8: E8ECDA0100 call 004234E9 ;похоже на функцию получения введённой нами строчки в HEX формате 004059FD: 3D336D454F cmp eax, 4F456D33 ;Оччччень интересно! 00405A02: 7507 jne 00405A0B Дальше идущий код я обрезал, т. к в данной ситуации он для нас значения не имеет. Меня сильно заинтересовала команда cmp eax, 4F456D33. А знаете чем? А тем, что она сравнивает то, что находиться в eax с 4F456D33. Дело в том, что если бы эта команда выглядела так: cmp eax,DWORD ptr [4F456D33]. Она бы сравнивала двойное слово(4 байта), находящееся в памяти по адресу 4F456D33. А она сравнивает именно с ЧИСЛОМ 4F456D33. А вы помните, что программа принимает только числа в качестве серийника? В общем, не буду вас томить. Откройте калькулятор виндовс. Вид поставьте инженерный (мы же реверс инженеры?) Нажмите F5 для перевода его в шестнадцатеричную систему счисления и введите 4F456D33. Затем нажмите F6 для преобразования числа в нашу любимую десятичную. Мы получили число 1329950003. А теперь введите это число в форму для ввода серийника. Ну, как? Мне тоже понравилось? Это только первый метод, которым мы сломаем эту прогу сегодня. Вывод: серийник(1329950003) храниться прямо в коде в HEX виде. Метод №2 или патч двух байтов. Взглянем ещё раз на код: 00404E2B: E8AE0B0000 call 004059DE ;функция проверки серийника 00404E30: 83F801 cmp eax, 00000001 00404E33: 752D jne 00404E62 ;Если EAX не равен 01 прыгаем на сообщение о неверном серийнике В данной ситуации нам нужно «занопить» jne 00404E62. Занопить - значит заменить байты целевой инструкции на 90. В нашем случае целевая инструкция (jne 00404E62) занимает два байта (75 2D)=> на их место нужно поставить две инструкции NOP(две – потому, что инструкция NOP занимает один байт, а 75 2D – это два байта) Инструкция NOP ничего не делает. Она, наверное, была создана специально для нас? Сделать это можно с помощью HIEW. Открываем seawar.exe в HIEW. Жмём F4 и выбираем decode. Затем F5 и вбиваем адрес 4E33(это смещение относительно начала файла, вычислить его можно с помощью W32Dasm или HIEW(нажав ALT+F1), но иногда он похож на VA(виртуальный адрес, в нашем случае 404E33)) Мы видим следующую картину: 00404E33: 752D jne 00404E62 ^^^^ нужно исправить на 9090 Исправив 752D на 9090, мы получим: 00404E33: 90 nop 00404E34: 90 nop Теперь жмите F9. И запускаем прогу. Попробуйте ввести на этот раз в окне ввода серийника 123. Программа скажет вам большое спасибо и станет якобы зарегистрированной. Происходит это потому, что мы занопили условный переход => его НЕТ, и он выполняться не будет! Но если перезапустить или поиграть в неё подольше мы опять получим сообщение о том, что нужно заплатить. А это происходит потому, что мы изменили прыжок только на вводе серийника, а функция проверки серийника (которая вызывается перед сравнением eax с 01), до сих пор говорит, что он неверный. Взглянем на её полный вид: * Call: 00402804, 0040285B, 00404E2B ;От суда мы видим, что функция вызывается с трёх адресов 004059DE: 55 push ebp 004059DF: 8BEC mov ebp, esp 004059E1: 51 push ecx 004059E2: 894DFC mov [ebp-04], ecx 004059E5: 6A00 push 00000000 * String: "Reg" 004059E7: 6878034300 push 00430378 * String: "Names" 004059EC: 687C034300 push 0043037C 004059F1: E87ABEFFFF call 00401870 004059F6: 8BC8 mov ecx, eax 004059F8: E8ECDA0100 call 004234E9 004059FD: 3D336D454F cmp eax, 4F456D33 ;Проверка 00405A02: 7507 jne 00405A0B ;Прыжок на обнуление eax, если не равны 00405A04: B801000000 mov eax, 00000001 00405A09: EB02 jmp 00405A0D ;Прыжок на финишную прямую * Jump: 00405A02(C) 00405A0B: 33C0 xor eax, eax ;Обнуление eax * Jump: 00405A09(U) 00405A0D: 8BE5 mov esp, ebp ;Финишная прямая 00405A0F: 5D pop ebp 00405A10: C3 ret ;Выход из функции Как вы уже, наверное, догадались, мы будем колдовать над инструкцией jne 00405A0B. Правда, теперь у нас есть выбор:1)Мы можем занопить её как в предыдущем случае. 2) Мы можем изменить jne на противоположенную её инструкцию je Jne выполняет прыжок если код неверный (FZ = 0), а je наоборот, если он верен (FZ = 1) У первого метода преимущество в том, что не будет разницы, подошел серийник или нет, в любом случае функция «скажет», что серийник подошел. А при использовании второго метода, функция на правильный серийник будет реагировать отрицательно, зато на все не правильные наоборот – положительно? 1) Думаю не обязательно повторно объяснять все действия, которые необходимо совершить, просто, если забыли – руководствуйтесь тем, что я написал выше, только вместо 4E33 читайте 5A02 2) Здесь всё также просто, даже ещё проще, нужно изменить всего лишь второй полубайт байта 75 на 4. А если по-русски, то по адресу 5A02 нужно байты 7507 изменить на байты 7407 и всё! Дело в том, что опкод jne- 75XX, а опкод je-74XX, где XX-адрес. Эпилог. Вот и подошел к концу мой туториал, надеюсь, тебе было интересно его прочесть. Могу спорить, что у тебя остались некоторые вопросы, но я дядька добрый, и поэтому даю тебе на растерзание мой e-mail: oleg666[!@!]ilst.ru(только знаки ненужные убери?). А ещё даю тебе ссылки, на сайты, которые достойны того, чтобы ты их посетил: http://wasm.ru – Куча статей про программирование на асме. Туториалы Iceleon’a. Архив Assembler.ru(Рекомендую) http://www.cydem.org.ua – Вообще-то сайт посвящён безопасности информационных/вычислительных систем, но есть немножко и о reversing’e http://hackzona.ru – Много статей http://nemarov.com/ - смеяться хакерам, тоже пока никто не запрещал? Остальные ищи на рамблере? Немного о себе. Как можно написать туториал и не написать ничего про себя? Я неизлечимо болен… манией величия, но это у всех компьютерщиков такое заболевание (хорошо, что от этого хоть не умирают)? А если серьёзно, то зовут меня Олег (Сергеевич) aka $had0w. Образование – 9 Кл. Пишу на Pascal, Delphi, Assembler(!),HTML, PHP Реверсингом занимаюсь относительно недавно (около 1 месяца), зато уже успел несколько софтин поломать и посложнее, чем Net Sea War? Ещё радиоэлектроникой некоторое время увлекался. Телефонный жучок собрал? Ну ладно, удачных тебе взломов! Пока!