Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 12 ноября!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

Keygenning Triple RSA-64

Обсудить статью на форуме

Очень удобно, когда все крэкерские инструменты, книги и статьи в одном месте. Используйте сборник от EXELAB - вот тут.

Автор: ev1l^4 [tPORt] <ev1l4@mail.ru>

Target: Plato DVD Copy (http://cracklab.ru/art/ev1l4/platodvdcopy.rar)
Tools: OllyDbg, MASM, RSA-Tool, VMMN (http://cracklab.ru/art/ev1l4/vmmn.zip)

Triple RSA-64 - это RSA использующий три раза RSA Encrypt/Decrypt, в нашем случае сериал делится на 3 части и каждая криптуется, криптованные данные должны соответствовать условиям проверки регистрации.
В качестве примера будет использоваться программа Plato DVD Copy 6.68 и ещё один интересный момент, там RSA реализован с помощью miracl, это компонент для Microsoft Visual C++ имеющий более 100 арифметических функций.
От вас требуется знать работу реализации RSA Encrypt/Decrypt!

Загружаем в OllyDbg, открываем окно регистрации, вводим произвольный сериал и нажимаем кнопку ОК, видно, что окно вызывается API ShowWindow, ставим на неё брейк и снова вызываем окно, трейсим, добираемся до такого места:

0042DC32  PUSH EAX
0042DC33  CALL 0042DAB5                            ; 0042DAB5
0042DC38  ADD ESP, 8
0042DC3B  TEST EAX, EAX
0042DC3D  JNZ SHORT 0042DC5B                       ; 0042DC5B
0042DC3F  PUSH 40
0042DC41  PUSH 4E9FC4                              ; ASCII "Sorry"
0042DC46  PUSH 4E9FCC                              ; ASCII "Invalid license name or license code"
0042DC4B  MOV ECX, DWORD PTR [EBP-204]
0042DC51  CALL 0042DE21                            ; 0042DE21
0042DC56  JMP 0042DCEE                             ; 0042DCEE

Как вы уже догадались, проверка находится в процедуре CALL 0042DAB5:

0042DAC2  PUSH EAX
0042DAC3  CALL 004B0B56                            ; 
0042DAC8  ADD ESP, 4

- считает длину сериала.


0042DACB  CMP EAX, 30
0042DACE  JE SHORT 0042DAD7                        ; 0042DAD7
0042DAD0  XOR EAX, EAX
0042DAD2  JMP 0042DBEE                             ; 0042DBEE

- ага, длина должна быть равна 48-ми символам. Советую использовать такой сериал:
112233445566778811223344556677881122334455667788
т.к. мы наглядно видим, что это наш сериал.

0042DADE  MOV ECX, 3F
0042DAE3  XOR EAX, EAX
0042DAE5  LEA EDI, DWORD PTR [EBP-10F]
0042DAEB  REP STOS DWORD PTR ES:[EDI]
0042DAED  STOS WORD PTR ES:[EDI]
0042DAEF  STOS BYTE PTR ES:[EDI]
0042DAF0  MOV BYTE PTR [EBP-210], 0
0042DAF7  MOV ECX, 3F
0042DAFC  XOR EAX, EAX
0042DAFE  LEA EDI, DWORD PTR [EBP-20F]
0042DB04  REP STOS DWORD PTR ES:[EDI]
0042DB06  STOS WORD PTR ES:[EDI]
0042DB08  STOS BYTE PTR ES:[EDI]
0042DB09  MOV BYTE PTR [EBP-310], 0
0042DB10  MOV ECX, 3F
0042DB15  XOR EAX, EAX
0042DB17  LEA EDI, DWORD PTR [EBP-30F]
0042DB1D  REP STOS DWORD PTR ES:[EDI]
0042DB1F  STOS WORD PTR ES:[EDI]
0042DB21  STOS BYTE PTR ES:[EDI]

- очистка зарезервированной памяти в стеке.


0042DB22  PUSH 10
0042DB24  MOV ECX, DWORD PTR [EBP+C]
0042DB27  PUSH ECX
0042DB28  LEA EDX, DWORD PTR [EBP-110]
0042DB2E  PUSH EDX
0042DB2F  CALL DWORD PTR [4B56C0]                  ; msvcrt.strncpy
0042DB35  ADD ESP, 0C
0042DB38  PUSH 10
0042DB3A  MOV EAX, DWORD PTR [EBP+C]
0042DB3D  ADD EAX, 10
0042DB40  PUSH EAX
0042DB41  LEA ECX, DWORD PTR [EBP-210]
0042DB47  PUSH ECX
0042DB48  CALL DWORD PTR [4B56C0]                  ; msvcrt.strncpy
0042DB4E  ADD ESP, 0C
0042DB51  PUSH 10
0042DB53  MOV EDX, DWORD PTR [EBP+C]
0042DB56  ADD EDX, 20
0042DB59  PUSH EDX
0042DB5A  LEA EAX, DWORD PTR [EBP-310]
0042DB60  PUSH EAX
0042DB61  CALL DWORD PTR [4B56C0]                  ; msvcrt.strncpy
0042DB67  ADD ESP, 0C

- деление сериала на три части в зарезервированную память.


0042DB7F  PUSH 4E9F88                              ; ASCII "7F96BD95BAE4C541"
0042DB84  LEA ECX, DWORD PTR [EBP-110]
0042DB8A  PUSH ECX
0042DB8B  CALL 0042D8BF                            ; 0042D8BF
0042DB90  ADD ESP, 8
0042DB93  MOV DWORD PTR [EBP-4], EAX

- заносится в стек первая публичная экспонента N и первая часть нашего сериала, после работы возвращается результат.

замечаем ещё две такие же процедуры:

0042DB96  PUSH 4E9F9C                              ; ASCII "7F96BD95BAE4C541"
0042DB9B  LEA EDX, DWORD PTR [EBP-210]
0042DBA1  PUSH EDX
0042DBA2  CALL 0042D8BF                            ; 0042D8BF
0042DBA7  ADD ESP, 8
0042DBAA  MOV DWORD PTR [EBP-8], EAX

- заносится в стек вторая публичная экспонента N и вторая часть нашего сериала, после работы возвращается результат.


0042DBAD  PUSH 4E9FB0                              ; ASCII "B253CC27814A4E29"
0042DBB2  LEA EAX, DWORD PTR [EBP-310]
0042DBB8  PUSH EAX
0042DBB9  CALL 0042D8BF                            ; 0042D8BF
0042DBBE  ADD ESP, 8
0042DBC1  MOV DWORD PTR [EBP-C], EAX

- заносится в стек третья публичная экспонента N и третья часть нашего сериала, после работы возвращается результат.

зайдём немного вперёд:

0042DBC4  CMP DWORD PTR [EBP-4], 0
0042DBC8  JLE SHORT 0042DBD6                       ; 0042DBD6
0042DBCA  CMP DWORD PTR [EBP-8], 0
0042DBCE  JLE SHORT 0042DBD6                       ; 0042DBD6
0042DBD0  CMP DWORD PTR [EBP-C], 0
0042DBD4  JG SHORT 0042DBDA                        ; 0042DBDA
0042DBD6  XOR EAX, EAX
0042DBD8  JMP SHORT 0042DBEE                       ; 0042DBEE

- проверка, результаты должны быть >0.


0042DBDA  MOV ECX, DWORD PTR [EBP-4]
0042DBDD  ADD ECX, DWORD PTR [EBP-8]
0042DBE0  CMP ECX, DWORD PTR [EBP-C]
0042DBE3  JNZ SHORT 0042DBEC                       ; 0042DBEC
0042DBE5  MOV EAX, 1
0042DBEA  JMP SHORT 0042DBEE                       ; 0042DBEE

нам нужно, чтобы в eax вернулась значение >0, результаты 1-ой + 2-ой процедуры должны быть равны 3-ей.

Рассмотрим процедуру CALL 0042D8BF:
Для исследования данной или подобной процедуры с использованием miracl я написал Viewer Miracl Magic Numbers and Routines(VMMN).


0042D8C9  PUSH 0
0042D8CB  PUSH 64
0042D8CD  CALL 004ABBA0                            ; 004ABBA0

- процедура mirsys, определяется это просто, заходим в процедуру, чуть ниже подглядываем константу у команды такого вида:
004ABBE7 MOV DWORD PTR [EAX+ECX*4+20], 1D

выбираем magic number в VMMN и видим, это mirsys, её описание:
Initialise the MIRACL system for the current program thread, as described below. Must be called before attempting to use any other MIRACL routines.

(1) The error tracing mechanism is initialised.
(2) the number of computer words to use for each big/flash number is calculated from nd and nb.
(3) Sixteen big work variables (four of them double length) are initialised.
(4) Certain instance variables are given default initial values.
(5) The random number generator is started by calling irand(0L).

данная процедура инициализирует miracl.


0042D8EB  PUSH 0
0042D8ED  CALL 004AB9D0                            ; 004AB9D0

- mirvar An integer initial value for the big/flash number.
- резервирует место под экспоненты.


0042D9CF  MOV EAX, DWORD PTR [EBP+8]
0042D9D2  PUSH EAX
0042D9D3  MOV ECX, DWORD PTR [EBP-118]
0042D9D9  PUSH ECX
0042D9DA  CALL 004ADA90                            ; 004ADA90

- cinstr
- A big/flash number x and a string s.
- переводит строку в хекс значения, наш сериал.


0042D9E2  MOV EDX, DWORD PTR [EBP+C]               ; dvdcopy.004E9F88
0042D9E5  PUSH EDX                                 ; dvdcopy.004E9F88
0042D9E6  MOV EAX, DWORD PTR [EBP-11C]
0042D9EC  PUSH EAX
0042D9ED  CALL 004ADA90                            ; 004ADA90

- cinstr, str to hex, экспонента N


0042D9F5  PUSH 4E9F80                              ; ASCII "10001"
0042D9FA  MOV ECX, DWORD PTR [EBP-8]
0042D9FD  PUSH ECX
0042D9FE  CALL 004ADA90                            ; 004ADA90

- cinstr, str to hex, экспонента E


0042DA06  MOV EDX, DWORD PTR [EBP-11C]
0042DA0C  PUSH EDX
0042DA0D  MOV EAX, DWORD PTR [EBP-118]
0042DA13  PUSH EAX
0042DA14  CALL 004AC820                            ; 004AC820

- проверка сериала с текущей экспонентой, наш сериал не должен быть равен ей.


0042DA21  MOV ECX, DWORD PTR [EBP-4]
0042DA24  PUSH ECX
0042DA25  MOV EDX, DWORD PTR [EBP-11C]
0042DA2B  PUSH EDX
0042DA2C  MOV EAX, DWORD PTR [EBP-8]
0042DA2F  PUSH EAX
0042DA30  MOV ECX, DWORD PTR [EBP-118]
0042DA36  PUSH ECX
0042DA37  CALL 004AD810                            ; 004AD810

- Raise a big number to a big power modulus another big. Uses a sophisticated 5-bit sliding window technique, which is close to optimal for popular modulus sizes (such as 512 or 1024 bits). Uses Montgomery arithmetic internally if the modulus z is odd.

This function can be speeded up further for particular moduli, by invoking special assembly language routines (if your compiler allows it). A KCM Modular Multiplier will be automatically invoked if MR_KCM has been defined in mirdef.h and has been set to an appropriate size. Alternatively a Comba modular multiplier will be used if MR_COMBA is so defined, and the modulus is of the specified size. Experimental coprocessor code will be called if MR_PENTIUM is defined. Only one of these conditionals should be defined.
- powmod
- C = M^E mod N.
- это основное действие RSA, в данном случае это RSA Encrypt, потомучто используется экспонента E.


0042DA3F  PUSH 0
0042DA41  LEA EDX, DWORD PTR [EBP-108]
0042DA47  PUSH EDX
0042DA48  MOV EAX, DWORD PTR [EBP-4]
0042DA4B  PUSH EAX
0042DA4C  PUSH 100
0042DA51  CALL 004AD210                            ; 004AD210

- big_to_bytes
- Converts a positive big number x into a binary octet string
- переворачивает байты сохраняя в другом буфере, исключая кол-во блоков и адрес данных.


0042DAA6  PUSH EDX
0042DAA7  CALL DWORD PTR [4B56B8]                  ; msvcrt.atoi

- в качестве параметра использует криптованные данные, переводит строку в dec.

Факторизируем экспоненты:
N1 - 7F96BD95BAE4C541, D1 - 22E810D1E408B249
N2 - 7F96BD95BAE4C541, D2 - 22E810D1E408B249
N3 - B253CC27814A4E29, D3 - 7A9B38BA28DF954D

и делаем кейген по шагам:
1. Генерируем случайные данные.
2. В конце первого и второго буфера вписываем 39x, в конце третьего 78x. 78=39*2, символ x обозначает конец переводимых данных из строки в десятичное значение.
3. Остальное место занимаем случайными данным, чтобы сериал был всегда разным.
4. Факторизируем экспоненты и декриптуем каждую часть со своими экспонентами.
5. Переводим значения в строку и соединяем по-порядку.

Процедура генерации из моего кейгена:

			xor RandomValue,'ev1l'
			mov eax, RandomValue
			mov ebx,eax
			shl ebx,2
			add eax,ebx
			mov RandomValue,eax

			mov _C1_Buffer,2
			mov _C1_Buffer+4,eax
			mov _C1_Buffer+8,ebx
			mov word ptr [_C1_Buffer+10],3339h
			mov byte ptr [_C1_Buffer+9],'t'
			invoke _BigIn,addr _N1,16,addr _N1_Buffer
			invoke _BigIn,addr _D1,16,addr _D1_Buffer
			invoke _BigPowMod,addr _C1_Buffer, addr _D1_Buffer, addr _N1_Buffer, addr _C1_Buffer
			mov esi, offset _C1_Buffer+11
			mov edi, offset serial_buffer
			call _hex_to_string
			
			mov word ptr [_C1_Buffer+10],3339h
			mov byte ptr [_C1_Buffer+9],'t'
			invoke _BigIn,addr _N2,16,addr _N1_Buffer
			invoke _BigIn,addr _D2,16,addr _D1_Buffer
			invoke _BigPowMod,addr _C1_Buffer, addr _D1_Buffer, addr _N1_Buffer, addr _C1_Buffer
			mov esi, offset _C1_Buffer+11
			mov edi, offset serial_buffer+16
			call _hex_to_string
			
			mov word ptr [_C1_Buffer+10],3738h
			mov byte ptr [_C1_Buffer+9],'t'
			invoke _BigIn,addr _N3,16,addr _N1_Buffer
			invoke _BigIn,addr _D3,16,addr _D1_Buffer
			invoke _BigPowMod,addr _C1_Buffer, addr _D1_Buffer, addr _N1_Buffer, addr _C1_Buffer
			mov esi, offset _C1_Buffer+11
			mov edi, offset serial_buffer+32
			call _hex_to_string
			
			invoke SetDlgItemText,hWnd,_SERIAL, addr serial_buffer

.data
_N1	db	"7F96BD95BAE4C541",0
_D1	db	"22E810D1E408B249",0
_N2	db	"7F96BD95BAE4C541",0
_D2	db	"22E810D1E408B249",0
_N3	db	"B253CC27814A4E29",0
_D3	db	"7A9B38BA28DF954D",0

.data ?
RandomValue	dd	?
serial_buffer	dd	13	dup(?)
_N1_Buffer	dd	4	dup(?)
_D1_Buffer	dd	4	dup(?)
_C1_Buffer	dd	4	dup(?)


Source: http://cracklab.ru/art/ev1l4/source.triple.rsa.64.zip

сериал из кейгена - 707EFD68ABEB8C381166EAF6F4CEB6B17920A00445F546AE
в реализации RSA использовался компонент biglib от roy,я.

Ну вот и всё, на этом взлом Triple RSA-64 закончен. Не смотрите на небольшие различия в поставленных шагах и выполнении их в исходном коде, т.к. это рассказано образно.

Greets to:

Red_Bar0n, M!H@N, x0man and all tPORt members...



Обсуждение статьи: Keygenning Triple RSA-64 >>>


Комментарии к статье: Keygenning Triple RSA-64

Spirit 30.08.2007 00:27:21
Грубо!
Хотя я и закейгенил прог 10 с рса, тут я ничего не понял...
-1
---
ev1l_4 31.08.2007 15:05:29
Spirit> Хотя я и закейгенил прог 10 с рса, тут я ничего не понял...
Видимо на столько знаете реализацию RSA, но специально для таких как вы я приложил исходники, а если совсем ничего непонятно, задавайте конкретный вопрос!
---
x0man 31.08.2007 21:22:23
Читать внимательней надо, а не пролистывать сразу в конец и писать комменты =\
---
nechto 30.11.2007 16:51:17
немного непонятно как происходит самая интересная часть - факторизация.
---
xenus 04.03.2008 19:03:55
Хорошая статейка жаль только файликов по линкам(hxxp://tport.astalavista.ms/DOW/*) нету :-(
---

Материалы находятся на сайте https://exelab.ru



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS