![]() |
|
|||||||
| Взлом Взлом и всё что с этим связано. |
![]() |
|
|
Опции темы | Опции просмотра |
|
|
#1 (permalink) | ||||||||
|
Начинающий пофигист
Моё настроение:
Вы сказали Спасибо: 30 Поблагодарили 64 раз(а) в 27 сообщениях Вес репутации: 4
Репутация: 15 |
Эта статья показывает каким образом можно взломать программы программы приложив минимум усилий и максиму отдачи.
Сразу оговорюсь, что таким образом ломаються далеко не все программы + вам придется познакомиться с ассемблером(не пугайтесь руководствуясь етой статьей можно понять необходимый миниму манипуляций с ним) В статье описан взлом простенькой игрушки Net Sea War v4.00 И так... Инструментарий. Ни один взлом никогда не обходится без инструментов, по большому счёту мы даже банку консервов взломать без инструментов не в состоянии. Но сегодня мы используем минимум инструментов, т.к защитой в программе даже не пахнет, но всё же, блокнотом нам её не одолеть. Что нам понадобится: Net Sea War 4 – Можно конечно обойтись и без него, но в таком случае, нам нечего будет ломать…Где взять – не знаю, зато подскажу где можно найти http://pofig.com через него можно найти практически любой софт. HDasm – или любой другой дизассемблер. Мне больше по душе HDasm, чем, к примеру, Win32Dasm, но как бы то ни было, любую из этих программ, ты сможешь найти на просторах рунета. Исследование. Думаю, что ты уже в курсе, что взлом всегда начинается с исследования целевой программы. Поэтому, не будем отступать от традиций и начнём именно с исследования. Итак, первый запуск. Нас попросят ввести имя, и в роли кого мы будем выступать в соединении (клиентом или сервером). Мы выбираем сервер. В строке состояния будет сказано, что мы можем подождать, пока к нам приконнектится клиент или можно нажать 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-адрес. Добавлено через 2 минуты 9 секунд Статья не моя!!! Но способ проверенный лично мной так ,что вопросы можете задавать мне...постараюсь ответить на все... Последний раз редактировалось eros, 05.04.2007 в 17:11. Причина: Добавлено сообщение |
||||||||
|
|
|
|
|
#3 (permalink) | ||||||||
|
Начинающий пофигист
Моё настроение:
Вы сказали Спасибо: 30 Поблагодарили 64 раз(а) в 27 сообщениях Вес репутации: 4
Репутация: 15 |
|
||||||||
|
|
|
| Этот пользователь сказал Спасибо Walinor за это полезное сообщение: |
ARTSLASHMAIN (05.04.2007)
|
|
|
#4 (permalink) | ||||||||
|
Художник пофигатор
Адрес: Питер
Вы сказали Спасибо: 2,401 Поблагодарили 5,074 раз(а) в 2,344 сообщениях Вес репутации: 22
Репутация: 1277 |
Не говори, тока читать не охота, как нить в свободное времечко зайду и буду зубрить...
__________________
![]() ![]()
|
||||||||
|
|
|
![]() |
| Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
| Опции темы | |
| Опции просмотра | |
|
|
Похожие темы
|
||||
| Тема | Автор | Раздел | Ответов | Последнее сообщение |
| Взлом компа через инет.. | Walinor | Взлом | 21 | 09.09.2007 12:52 |
| Взлом архива | Sous | Варезник | 12 | 14.05.2007 18:14 |
| Взлом ..... конечно ж аськи FAQ | MagAssist | Взлом | 2 | 16.04.2007 00:09 |
| Ni Anti Shareware 3.0 (продлить триал платных программ) | ARTSLASHMAIN | Варезник | 3 | 13.04.2007 12:33 |
| Хакерский тест, Попробуйте пройти | sng | Базар | 37 | 11.02.2007 13:14 |