Название главы: «Глава 15 - Поиск жестко заданного серийного номера. Часть 3»
Найти рассматриваемые крекми и уроки можно на сайте GitHub, гуглите "Уроки по ollydbg Рикардо Наваха" и переходите на GitHub к пользователю в папку /.gitbook/assets/files/14
Посмотрим на нашего подопытного:
Your mission is to disable the Splash Screen, find the hardcoded serial
and to keygen the Name/Serial part. This level is to make sure you understand
how to use your tools and what is going on in the program. These are three very
basic and easy protections. Good luck and see you on the next level.
Crudd
";
1. Убираем заставку:
| 0040105E | 6A 01 | push 1 | |
| 00401060 | E8 BF060000 | call <JMP.&GetSystemMetrics> | |
| 00401065 | 50 | push eax | |
| 00401066 | FF35 73344000 | push dword ptr ds:[403473] | |
| 0040106C | E8 F0030000 | call splish.401461 | |
| 00401071 | A3 7B344000 | mov dword ptr ds:[40347B],eax | |
| 00401076 | FF75 08 | push dword ptr ss:[ebp+8] | |
| 00401079 | E8 F9030000 | call splish.401477 | <--- наша функция |
| 0040107E | C745 D0 30000000 | mov dword ptr ss:[ebp-30],30 | 30:'0' <--- попадаем сюда |
2. Находим Hardcoded ключ:
| 0040135F | 68 15324000 | push splish.403215 | |
| 00401364 | FF35 90344000 | push dword ptr ds:[403490] | |
| 0040136A | E8 BB030000 | call <JMP.&GetWindowTextA> | |
| 0040136F | 8D05 53134000 | lea eax,dword ptr ds:[401353] | 00401353:"HardCoded" <---- сюда |
| 00401375 | 8D1D 15324000 | lea ebx,dword ptr ds:[403215] | <---- наш код |
| 0040137B | 8038 00 | cmp byte ptr ds:[eax],0 | eax:"HardCoded" |
| 0040137E | 74 0C | je splish.40138C | |
| 00401380 | 8A08 | mov cl,byte ptr ds:[eax] | eax:"HardCoded" |
| 00401382 | 8A13 | mov dl,byte ptr ds:[ebx] | |
| 00401384 | 38D1 | cmp cl,dl | <--- посимвольное сравнение нашего кода |
| 00401386 | 75 4A | jne splish.4013D2 | со строкой "HardCoded" |
| 00401388 | 40 | inc eax | eax:"HardCoded" |
| 00401389 | 43 | inc ebx | |
| 0040138A | EB EF | jmp splish.40137B | |
| 0040138C | EB 2F | jmp splish.4013BD |
3. Пишем кейген к Name/Serial части:
| 0040160D | E8 18010000 | call <JMP.&GetWindowTextA> | <--- наш брейкпоинт |
| 00401612 | 85C0 | test eax,eax | |
| 00401614 | 74 68 | je splish.40167E | |
| 00401616 | A3 63344000 | mov dword ptr ds:[403463],eax | |
| 0040161B | 33C9 | xor ecx,ecx | |
| 0040161D | 33DB | xor ebx,ebx | |
| 0040161F | 33D2 | xor edx,edx | |
| 00401621 | 8D35 36324000 | lea esi,dword ptr ds:[403236] | esi:"3058561", 00403236:"mackswe" |
| 00401627 | 8D3D 58324000 | lea edi,dword ptr ds:[403258] | а это промежуточная переменная для вычислений |
| 0040162D | B9 0A000000 | mov ecx,A | 0A:'\n' |
| 00401632 | 0FBE041E | movsx eax,byte ptr ds:[esi+ebx] | "Генерация по имени" берём посимвольно |
| 00401636 | 99 | cdq | |
| 00401637 | F7F9 | idiv ecx | делим на десять name[i] символ |
| 00401639 | 33D3 | xor edx,ebx | манипуляции с остачей от деления |
| 0040163B | 83C2 02 | add edx,2 | манипуляции с остачей от деления |
| 0040163E | 80FA 0A | cmp dl,A | 0A:'\n' |
| 00401641 | 7C 03 | jl splish.401646 | |
| 00401643 | 80EA 0A | sub dl,A | если остача больше или равно 10, отнимаем 10 |
| 00401646 | 88141F | mov byte ptr ds:[edi+ebx],dl | сохраняем наш байт в промежуточную переменную |
| 00401649 | 43 | inc ebx | |
| 0040164A | 3B1D 63344000 | cmp ebx,dword ptr ds:[403463] | конец строки? Нет? |
| 00401650 | 75 E0 | jne splish.401632 | Значит возвратимся для генерации байтов перемеременной |
| 00401652 | 33C9 | xor ecx,ecx | |
| 00401654 | 33DB | xor ebx,ebx | |
| 00401656 | 33D2 | xor edx,edx | |
| 00401658 | 8D35 42324000 | lea esi,dword ptr ds:[403242] | esi:"3058561", 00403242:"3058561" |
| 0040165E | 8D3D 4D324000 | lea edi,dword ptr ds:[40324D] | промежуточная переменная которая будет сравнена с др. перемен. |
| 00401664 | B9 0A000000 | mov ecx,A | 0A:'\n' |
| 00401669 | 0FBE041E | movsx eax,byte ptr ds:[esi+ebx] | генерация по паролю посимвольно |
| 0040166D | 99 | cdq | |
| 0040166E | F7F9 | idiv ecx | делим код символа на 10 и |
| 00401670 | 88141F | mov byte ptr ds:[edi+ebx],dl | сохраняем |
| 00401673 | 43 | inc ebx | |
| 00401674 | 3B1D 67344000 | cmp ebx,dword ptr ds:[403467] | сравнение с длиной имени |
| 0040167A | 75 ED | jne splish.401669 | возвращаемся пока не конец имени |
| 004016BE | 0FBE041F | movsx eax,byte ptr ds:[edi+ebx] | |
| 004016C2 | 0FBE0C1E | movsx ecx,byte ptr ds:[esi+ebx] | esi+ebx*1:"058561" |
| 004016C6 | 3BC1 | cmp eax,ecx | <-- сравнение наших сериалов посимвольно |
| 004016C8 | 75 18 | jne splish.4016E2 | |
| 004016CA | 43 | inc ebx | |
| 004016CB | EB E9 | jmp splish.4016B6 | |
| 004016CD | 6A 00 | push 0 | |
| 004016CF | 68 0A304000 | push splish.40300A | 40300A:"Splish, Splash" |
| 004016D4 | 68 42304000 | push splish.403042 | 403042:"Good job, now keygen it." |
| 004016D9 | 6A 00 | push 0 | |
| 004016DB | E8 68000000 | call <JMP.&MessageBoxA> | |
| 004016E0 | EB 13 | jmp splish.4016F5 | |
| 004016E2 | 6A 00 | push 0 | |
| 004016E4 | 68 0A304000 | push splish.40300A | 40300A:"Splish, Splash" |
| 004016E9 | 68 67304000 | push splish.403067 | 403067:"Sorry, please try again." |
| 004016EE | 6A 00 | push 0 | |
| 004016F0 | E8 53000000 | call <JMP.&MessageBoxA> | |
| 004016F5 | C9 | leave | |
| 004016F6 | C2 0800 | ret 8 |
- Посивольно берём имя;
- Получаем последнее число символа для каждого символа по очереди в десятичной системе (делим на десять и получаем остаток);
- Для полученого остатка для каждого символа, применяем команду xor <остаток>, <индекс символа в строке> (нумерация индекса начинается с нуля);
- Далее к этому байту добавляем двойку;
- Теперь если наш байт (остаток по сути), больше равно 10 тогда отнимаем 10, и сохраняем байт. И так для каждого символа Name;
- И теперь каждое полученное число должно равняться, последнему числу кода символа нашего Serial.
При таких условиях, для одного имени можно генерить сотни а то и тысячи Serial, но мы не будем в это углубляться так как задача уже выполнена.
Обращайтесь если нужно, могу скинуть листинг кейгена написаного на Delphi 7.
Комментариев нет:
Отправить комментарий