KeyGen для WinCAM 2000

Перейти на главную страницу, индексную страницу.


Автор: GL#0M gl00m-crk@yandex.ru

Цель: WinCAM 2000
Инструменты: SoftICE и любой компилятор.

О программе

Взял я новый Chip (10/2003), как обычно, смотрю список программ, и на глаза мне попадается WinCAM 2000. Да что же это такое!? Им что ли выложить на сидюк больше нечего?!!!
Решил завершить исследование на новой версии, а проще говоря сделать keygen...

Взлом

Заходим в программу, вводим любые 17 символов, например: 12512512512512512. Ставим breakpoint на hmemcpy (bpx hmemcpy F5) и нажимаем "Enter Code..." В SoftICE жмём F12, пока не выйдем в адресное пространство программы. Пробегаем по F10 до вот такого кода:

* Reference To: MFC42D.Ordinal:0370, Ord:0370h
                                  |
:004BA9F0 E8AD610800              Call 00540BA2
:004BA9F5 50                           push eax
:004BA9F6 E87F96F4FF              call 0040407A // заходим...
:004BA9FB 83C404                    add esp, 00000004
:004BA9FE 85C0                       test eax, eax
:004BAA00 7456                       je 004BAA58
:004BAA02 8B45FC                    mov eax, dword ptr [ebp-04]
:004BAA05 0534010000              add eax, 00000134
:004BAA0A 51                           push ecx
:004BAA0B 8BCC                       mov ecx, esp
:004BAA0D 8965F4                    mov dword ptr [ebp-0C], esp
:004BAA10 50                          push eax
...
В call 0040407A, начная с 00503940 и по 00503B83, идёт длиннющая сверка введённого кода с "ГОСТ"-ом, так сказать... =) Короче номерок должен выглядеть, например, вот так: 1-1234-123-4321-1. Далее, с 00503BBC по 00503D61, идёт "посимвольное сложение" чисел *1234-123-4321* (или какие там у вас?), т.е. 1+2+3+4+1+2+3+4+3+2+1=26. А затем:


:00503D64 8B45BC                  mov eax, dword ptr [ebp-44]      // EAX := сумма чисел
:00503D67 99                         cdq
:00503D68 B91A000000            mov ecx, 0000001A      // EСX := 26
:00503D6D F7F9                      idiv ecx
:00503D6F 83C241                  add edx, 00000041      // к остатку прибавляем 65.
:00503D72 8855C0                  mov byte ptr [ebp-40], dl      // запоминаем букву.
:00503D75 0FBE55C0                movsx edx, byte ptr [ebp-40]
:00503D79 0FBE45E4                movsx eax, byte ptr [ebp-1C]
:00503D7D 3BD0                      cmp edx, eax
:00503D7F 7407                      je 00503D88
:00503D81 33C0                      xor eax, eax
:00503D83 E98A000000            jmp 00503E12      // на ошибку

*---------------вырезано---------------*

* Reference To: MSVCRTD._chkesp, Ord:00C8h
|
:00503D99 E8C8E20300              Call 00542066
:00503D9E 8945B8                     mov dword ptr [ebp-48], eax     // EAX = 1234 (например).
:00503DA1 817DB8D0070000        cmp dword ptr [ebp-48], 000007D0
:00503DA8 7D04                       jge 00503DAE      // если > или = 2000, то прыжок
:00503DAA 33C0                       xor eax, eax
:00503DAC EB64                       jmp 00503E12       // на ошибку
...
Теперь понятно, что номерок, например, должен быть такой: K-2000-123-2000-1. Ладно, смотрим дальше:


...
* Reference To: MSVCRTD._chkesp, Ord:00C8h
|
:00503DD8 E889E20300           Call 00542066
:00503DDD 8945B0                  mov dword ptr [ebp-50], eax
:00503DE0 8B4DB8                  mov ecx, dword ptr [ebp-48] // ECX := 2000
:00503DE3 034DB4                  add ecx, dword ptr [ebp-4C] // + 123
:00503DE6 034DB0                  add ecx, dword ptr [ebp-50] // + 2000
:00503DE9 894DAC                  mov dword ptr [ebp-54], ecx
:00503DEC 8B45AC                  mov eax, dword ptr [ebp-54] // EAX := 4123
:00503DEF 99                         cdq
:00503DF0 B91A000000            mov ecx, 0000001A
:00503DF5 F7F9                      idiv ecx
:00503DF7 83C241                  add edx, 00000041
:00503DFA 8855C0                  mov byte ptr [ebp-40], dl // запоминаем букву.
:00503DFD 0FBE55C0                movsx edx, byte ptr [ebp-40]
:00503E01 0FBE45CC                movsx eax, byte ptr [ebp-34]
:00503E05 3BD0                      cmp edx, eax
:00503E07 7404                      je 00503E0D
:00503E09 33C0                      xor eax, eax
:00503E0B EB05                      jmp 00503E12 // на ошибку

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00503E07(C)
|
:00503E0D B801000000              mov eax, 00000001
...
Ну, всё... из комментариев, надеюсь, всё понятно. Кейгеним! Удачи!


Этот материал опубликован в целях самообразования, за последствия которого Автор ответственности не несёт!


Материалы находятся на сайте http://cracklab.narod.ru/doc/






Hosted by uCoz