Сейчас на форуме: (+5 невидимых)

 eXeL@B —› Дневники и блоги —› Практика ключей (only keys)
Посл.ответ Сообщение

Ранг: 33.8 (посетитель), 38thx
Активность: 0.060
Статус: Участник

Создано: 16 августа 2013 05:44 · Поправил: dimka_new
· Личное сообщение · #1

Доброго времени, появилось у меня немного свободного времени, решил немного по умничать )
По мотивам этого топа - https://ssl.exelab.ru/f/action=vthread&forum=5&topic=19777

В данном блоге хочу размещать информацию о реверсе программ, патчей здесь не будет, только ключи.
Если можно закейгенить - буду постараться закейгенить, исходники соответственно тоже буду вылаживать. Из языков программирования - мучу я delphi - качество кода оставляет желать лучшего, но улучшать навыки в дельфях я не намерен, хотите красоты - переделывайте сами.

Варнинг - тема для новичков, кем в принципе я тоже являюсь.

Предложения, поправки, дополнение, пожелания, матерная ругань, троллинг, надменные усмешки и прочее приветствуются.
Есть желание выложить что-то свое - велком.



Ранг: 33.8 (посетитель), 38thx
Активность: 0.060
Статус: Участник

Создано: 17 августа 2013 05:21 · Поправил: dimka_new
· Личное сообщение · #2

Здравствуйте

Сегодня я решил рассмотреть программу Free Renju версия 5.02. Версия 5.03 стала бесплатной, так что вреда автору мы не нанесем.
Сама игра мне не интересна, лечил по просьбе товарища тысчу лет назад - недавно обнаружил на старом винчестере.

Исследование начнем с определения компилятора и наличия упаковки - PeID выдал Borland C++.
Запускаем программу, вводим произвольные любые рег. данные и получаем красивое сообщение - "Неверное имя или ключ".
Грузим exe-ник в OllyDbg и ставил бряки на GetDlgItemTextA\W, запускаем программу, вводим любые данные и нажимаем кнопку Ok в окне регистрации.
Брякаемся в модуле USER32 - выходим из модуля нажав несколько раз F8

Оказываемся здесь:

004013F6 |. E8 D79D0300 CALL <JMP.&USER32.GetDlgItemTextA> ; \GetDlgItemTextA
МЫ ТУТ ->>> 004013FB |. 68 80000000 PUSH 80 ; /Count = 80 (128.)
00401400 |. 8D95 D0FEFFFF LEA EDX,DWORD PTR SS:[EBP-130] ; |
00401406 |. 52 PUSH EDX ; |Buffer
00401407 |. 6A 69 PUSH 69 ; |ControlID = 69 (105.)
00401409 |. 57 PUSH EDI ; |hWnd
0040140A |. E8 C39D0300 CALL <JMP.&USER32.GetDlgItemTextA> ; \GetDlgItemTextA
0040140F |. 8D8D 50FFFFFF LEA ECX,DWORD PTR SS:[EBP-B0]
00401415 |. 8D85 D0FEFFFF LEA EAX,DWORD PTR SS:[EBP-130]

Бряки можно снять, доходим до адреса 0040141B и видим в стеке введенные нами данные:

НАШИ ДАННЫЕ В СТЕКЕ ->>> 0040141B |. 51 PUSH ECX ; /Arg3
0040141C |. 50 PUSH EAX ; |Arg2
0040141D |. 68 281D4400 PUSH frerenju.00441D28 ; |Arg1 = 00441D28
00401422 |. E8 D93C0000 CALL frerenju.00405100 ; \frerenju.00405100
00401427 |. 83C4 0C ADD ESP,0C
0040142A |. 85C0 TEST EAX,EAX
0040142C |. 0F84 12030000 JE frerenju.00401744

Вроде все ясно по адресу 00401422 - происходит проверка введенных данных, если все удачно в EAX помещается 1.

По F7 заходим в функу по адресу 00401422 и не спеша трейсим код, по ходу дела отмечая интересные места (данные которые я ввел - Dimka_New и код 12345).
Доходим до такого места:

Code:
  1. 00405207  |. 83F8 1A        CMP EAX,1A


Похоже, что здесь сравнивается размер введенного серийника с 1A (26 в десятичном виде)
Ставим бряк - и вводим новый ключ - 12345678901234567890123456

Идем далее, до такого места:

00405250 |. 8D97 C4120000 LEA EDX,DWORD PTR DS:[EDI+12C4]
00405256 |> 8A08 /MOV CL,BYTE PTR DS:[EAX]
Сравнение с "FR" ->>> 00405258 |. 3A0A |CMP CL,BYTE PTR DS:[EDX]
0040525A |. 75 48 |JNZ SHORT frerenju.004052A4
0040525C |. 84C9 |TEST CL,CL
0040525E |. 74 12 |JE SHORT frerenju.00405272
00405260 |. 8A48 01 |MOV CL,BYTE PTR DS:[EAX+1]
00405263 |. 3A4A 01 |CMP CL,BYTE PTR DS:[EDX+1]
00405266 |. 75 3C |JNZ SHORT frerenju.004052A4
00405268 |. 83C0 02 |ADD EAX,2
0040526B |. 83C2 02 |ADD EDX,2
0040526E |. 84C9 |TEST CL,CL
00405270 |.^75 E4 \JNZ SHORT frerenju.00405256
00405272 |> 75 30 JNZ SHORT frerenju.004052A4

Тут сравниваются первые 2 символа введенного нами номера с FR.
Наши данные приобретают вид: FR345678901234567890123456

Доходим до такого места:

00405368 |> 83FB 0A /CMP EBX,0A
0040536B |. 7E 07 |JLE SHORT frerenju.00405374
0040536D |. 33C0 |XOR EAX,EAX
0040536F |. E9 98000000 |JMP frerenju.0040540C
00405374 |> 8A16 |MOV DL,BYTE PTR DS:[ESI]
Сравнение 1-го символа имени ->>> 00405376 |. 3A55 D8 |CMP DL,BYTE PTR SS:[EBP-28]
00405379 |. 74 10 |JE SHORT frerenju.0040538B
0040537B |. 43 |INC EBX
0040537C |. 46 |INC ESI
0040537D |> 8D4D B0 LEA ECX,DWORD PTR SS:[EBP-50]
00405380 |. 51 |PUSH ECX
00405381 |. E8 86970200 |CALL frerenju.0042EB0C
00405386 |. 59 |POP ECX
00405387 |. 3BC3 |CMP EAX,EBX
00405389 |.^77 DD \JA SHORT frerenju.00405368

Следующий символ в рег.номере - первый символ из введенного имени.
Преображаем серийник: FRD45678901234567890123456

Трассируем до адреса:

Code:
  1. 004053F6  |. E8 19000000    CALL frerenju.00405414

По F7 заходим в функу и исследуем ее:

0040544D . 8B45 0C MOV EAX,DWORD PTR SS:[EBP+C]
00405450 . 8A10 MOV DL,BYTE PTR DS:[EAX]
Сравнение с "-" ->>> 00405452 . 3A16 CMP DL,BYTE PTR DS:[ESI]
00405454 . 75 2F JNZ SHORT frerenju.00405485

В цикле проверяется наличие символа "-".
Я не стал слишком усердствовать - FRD-5678901234567890123456
Данные ключ прошел все проверки и является валидным для имени Dimka_New, поздравляю !

Данные о регистрации храняться в ветке реестре - HKEY_CURRENT_USER\Software\Vitaliy Levchenko\Logical Crossroads\Free Renju MRelease

Пишем кейген (Delphi):

Code:
  1. //Получаем случайный символ
  2. function RandLetter ():String;
  3. var
  4.   i:Integer;
  5. begin
  6.   i:= 0;
  7.   while i < 48 do
  8.     begin
  9.       Randomize;
  10.       i:= random (57);
  11.     end;
  12.   result:= chr(i);
  13. end;
  14.  
  15. procedure TForm1.GenButtonClick(Sender: TObject);
  16. var
  17.   FinalKey, TempKey : String;
  18.   I                 : Integer;
  19. begin
  20.   if LicName.Text = ''
  21.   then
  22.     exit;
  23.   TempKey:= 'FR' + Copy(LicName.Text, 1, 1) + '-';
  24.   For i:=0 to 21 do
  25.     begin
  26.       TempKey:= TempKey + RandLetter;
  27.     end;
  28.   FinalKey    := TempKey;
  29.   LicKey.Text := FinalKey;
  30. end;


Где:
LicName - Edit
LicKey - Edit
GenButton - Button

Ссылка на дистрибьютив и кейген (~500Kb) - http://rghost.ru/48171365




Ранг: 533.6 (!), 232thx
Активность: 0.450
Статус: Uploader
retired

Создано: 17 августа 2013 22:27 · Поправил: BoRoV
· Личное сообщение · #3

Ф-ия RandLetter повеселила. Правильно так:
Code:
  1. function RandLetter ():String;
  2. begin
  3.   Randomize;
  4.   result:= chr(random (9) + 48);
  5. end;


Теперь больше по эстетическим моментам.
Code:
  1. Copy(LicName.Text, 1, 1)

Как по мне, то один символ лучше получить по индексу:
Code:
  1. LicName.Text[1]

Переменная FinalKey как раз и выступает в роли временной переменной, а не наоборот. Зачем было её вводить.

-----
Лучше быть одиноким, но свободным © $me


| Сообщение посчитали полезным: dimka_new

Ранг: 33.8 (посетитель), 38thx
Активность: 0.060
Статус: Участник

Создано: 18 августа 2013 16:34
· Личное сообщение · #4

BoRoV

Спасибо конечно за замечания, но:

dimka_new пишет:
Из языков программирования - мучу я delphi - качество кода оставляет желать лучшего, но улучшать навыки в дельфях я не намерен, хотите красоты - переделывайте сами.


Перезаливать и переделывать кейген я не буду, смотрите советы BoRoV.
Реально давно уже ничего кроме контроллеров не программирую, ну иной раз пару строчек под QNX напишу.
Так-что не обессудьте )

ЗЫ
BoRoV пишет:
Ф-ия RandLetter повеселила. Правильно так:

Первый попавшийся пример из яндекса




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 18 августа 2013 18:07 · Поправил: reversecode
· Личное сообщение · #5

идея не нова, www.manhunter.ru тоже чуть чуть ломает и показывает как
что бы было совсем всем интересно, возьмите и разберите взлом какойто сложной программы, с оригинальной защитой
на руборде такие подскажут

| Сообщение посчитали полезным: dimka_new

Ранг: 33.8 (посетитель), 38thx
Активность: 0.060
Статус: Участник

Создано: 19 августа 2013 03:40
· Личное сообщение · #6

reversecode

На оригинальность и не претендую, но и однотипные примеры размещать не буду.
Жаль как-то валяются наработки на диске - глядишь кто почитает и найдет что-то новое.

Ломать что-то сложное, жалко времени, да и не реверсер я уже давно.

Ну и
dimka_new пишет:
Есть желание выложить что-то свое - велком.




Ранг: 33.8 (посетитель), 38thx
Активность: 0.060
Статус: Участник

Создано: 20 сентября 2013 16:43
· Личное сообщение · #7

Сегодня заломал свою первую нет-прогу, на днях выложу мануал, насчет кейгена не уверен (что смогу победить)




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 20 сентября 2013 22:47
· Личное сообщение · #8

dimka_new похвально

-----
[nice coder and reverser]



 eXeL@B —› Дневники и блоги —› Практика ключей (only keys)
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати