Сейчас на форуме: Rio, johnniewalker, vsv1, Magister Yoda, Kybyx (+4 невидимых)

 eXeL@B —› Крэки, обсуждения —› Статья. Простая защита или ломаем TurboLaunch 5.1.3 тремя способами
Посл.ответ Сообщение


Ранг: 253.5 (наставник), 684thx
Активность: 0.260.25
Статус: Участник
radical

Создано: 14 июня 2011 10:05 · Поправил: DimitarSerg
· Личное сообщение · #1

Привет. Хочу представить свою первую полноценную статью по исследованию защиты программ.
Речь пойдет о программе TurboLaunch 5.1.3.
Статья разбита на 3 подраздела, в каждом из них описывается разный способ взлома (патч, сниффер, кейген).

Хочу услышать отзывы, пожелания и т.д. и т.п.

fb16_14.06.2011_EXELAB.rU.tgz - TL.rar

-----
ds





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

Создано: 14 июня 2011 10:58 · Поправил: BoRoV
· Личное сообщение · #2

А почему через асм-вставку, почему не перевел в паскаль?

Запомни это ф-ию и эту константу:
Code:
  1.             PUSH EBX
  2.             XOR EBX,EBX
  3.             IMUL EDX,sn_tmp,08088405h
  4.             INC EDX
  5.             MOV sn_tmp,EDX
  6.             MUL EDX
  7.             MOV EAX,EDX
  8.             POP EBX


Это ф-ия Random.

sn_tmp - это RandSeed.

Текст не читал.

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


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


Ранг: 253.5 (наставник), 684thx
Активность: 0.260.25
Статус: Участник
radical

Создано: 14 июня 2011 11:07
· Личное сообщение · #3

BoRoV
Спасибо, буду знать. Не перевел в Паскаль, потому что знаний не хватило...
Если бы кто помог перевести на чистый Паскаль - был бы очень благодарен.

-----
ds





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

Создано: 14 июня 2011 11:17 · Поправил: BoRoV
· Личное сообщение · #4

Ну у тебя же половина листинга прокомментирована на понятный тебе образ вот и и отталкивайся от этого. Вот и потренируешься.

Могу дать пару подсказок по тому что ты не знал.
Code:
  1. mov sn_tmp,EAX             // Сохраняем результат вычислений

Это будет:
Code:
  1. RandSeed := _EAX and $FFFF; // _EAX это у тебя будет какая-то переменная, я не знаю как она будет у тебя называться


Code:
  1. MOV EAX,021h                         // EAX=33
  2.        // -->CALL @TurboLau_004034E8              ;<= Jump/Call Address Not Resolved
  3.             PUSH EBX
  4.             XOR EBX,EBX
  5.             IMUL EDX,sn_tmp,08088405h
  6.             INC EDX
  7.             MOV sn_tmp,EDX
  8.             MUL EDX
  9.             MOV EAX,EDX
  10.             POP EBX


Это тебе вызвать рандом с параметром 33:
Code:
  1. SomeVal := Random(33);


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





Ранг: 170.1 (ветеран), 96thx
Активность: 0.090.01
Статус: Участник

Создано: 14 июня 2011 11:57
· Личное сообщение · #5

Code:
  1. 00000003  01  [CODE    ]  000028F1  .004034F1  05840808  ...   PKZip & Borland PRNG


67ab_14.06.2011_EXELAB.rU.tgz - TurboLaunch.rar




Ранг: 324.3 (мудрец), 221thx
Активность: 0.480.37
Статус: Участник

Создано: 14 июня 2011 14:34
· Личное сообщение · #6

BoRoV, правильней MOV EDX,021h, там ж трёхоперандный мул с edx

-----
IZ.RU





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

Создано: 14 июня 2011 14:43
· Личное сообщение · #7

DenCoder пишет:
BoRoV, правильней MOV EDX,021h, там ж трёхоперандный мул с edx

1. Это не мой код.
2. Там всё верно.

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





Ранг: 324.3 (мудрец), 221thx
Активность: 0.480.37
Статус: Участник

Создано: 14 июня 2011 15:07 · Поправил: DenCoder
· Личное сообщение · #8

BoRoV пишет:
2. Там всё верно.

Ни одна из инструкций в коде ни берёт, ни меняет eax! Другими словами - ни eax не влияет на код, ни код не влияет на eax!

BoRoV пишет:
1. Это не мой код.
Эт точно, решил взглянуть даже Интересно, что метки вида @TurboLau_005406C1 - код генерации выдран из TL или откуда-то? (TurboLau не указывает на 100%, что TL - например, я, чтобы быстро набросать какой-нить гене-алго для программы, часто там же и асмю, а потом, если заинтересован сохранить, копирую и вставляю txt)

-----
IZ.RU





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

Создано: 14 июня 2011 15:10
· Личное сообщение · #9

DenCoder пишет:
Ни одна из инструкций в коде ни берёт, ни меняет eax!

Дык смотрите внимательно, или поднимайте справочники.
Code:
  1. mul edx


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





Ранг: 324.3 (мудрец), 221thx
Активность: 0.480.37
Статус: Участник

Создано: 14 июня 2011 15:13 · Поправил: DenCoder
· Личное сообщение · #10

Блин, точно. Не заметил Пардон

P. S. Это происки тёмных сил

-----
IZ.RU





Ранг: 253.5 (наставник), 684thx
Активность: 0.260.25
Статус: Участник
radical

Создано: 22 августа 2011 15:10
· Личное сообщение · #11

Люблю доводить дело до конца, поэтому вчера вечерком вспомнил об этой программульке, перевел алго для Дельфы. Просьба к опытным кейгенерам бегло глянуть код, может где-то можно красивее и правильнее написать:

Code:
  1. procedure generate;
  2. Var
  3. NameBuffer,SerNum,tmp:String;
  4. EDX,EAX,len,i,RSeed,v6,v7,tmp1:integer;
  5. Textname: PChar;
  6.  
  7. begin
  8.   len  := GetWindowTextLengthA(TxtNameHwnd);
  9.   if len > 1 then
  10.   begin
  11.   GetMem(Textname, len + 1);
  12.   GetWindowTextA(TxtNameHwnd,PAnsiChar(Textname),len + 1);
  13.   KeyStr:= 'GF2DSA38HJKL7M4NZXCV5BY9UPT6R1EWQ40I1CP';
  14.   NameBuffer:=String(Textname);
  15.   SerNum:='';
  16.   
  17. Randomize;
  18. EDX:=0;
  19.          for i:=1 to len do
  20.          begin
  21.     EDX := EDX xor (ord(NameBuffer[i]) shl $8);
  22.  
  23.     EAX := $8;
  24.            while EAX <> 0 do
  25.            begin;
  26.     tmp:=copy(IntToHex(EDX,2),Length(IntToHex(EDX,2))-3,2);
  27.       if StrToInt('$'+tmp) >= $80
  28.                      then
  29.                        EDX := EDX * $2 xor $1021
  30.                      else
  31.           EDX := EDX * $2;
  32.                  dec(EAX);
  33.     end;
  34.   end;
  35.  
  36. RandSeed := EDX and $0FFFF;
  37.  
  38. i:=1;
  39. while i <> $13 do
  40. begin
  41.       v6 := 0;
  42.       v7 := $13 - i;
  43.       if $13 - i > 0 then
  44.       begin
  45.         while v7 > 0 do
  46.           begin
  47.             v6:=Random(33);
  48.             inc(v6);
  49.             if i > len then tmp1:=ord(NameBuffer[i mod len]) else tmp1:=ord(NameBuffer[i]);
  50.             tmp1:=tmp1 xor $0FF and $0FF;
  51.             v6 := v6 + tmp1;
  52.                          dec(v7);
  53.           end;
  54.                    end;
  55.  
  56.       while v6 > $21 do
  57.         begin
  58.                        v6 := v6 - $21;
  59.         end;
  60.       SerNum := SerNum + KeyStr[v6];
  61.     inc(i);
  62. end;
  63.  
  64. Insert('-',SerNum,7);
  65. Insert('-',SerNum,14);
  66. For i:=0 to 43 do
  67.   begin
  68.     if NameBuffer = BlackList[i] then
  69.       begin
  70.       SerNum:='BLACKLISTED NAME';
  71.       Break;
  72.       end
  73.       else ;
  74.   end;
  75.  
  76.   { Display The Results }
  77.   SetWindowTextA(TxtSerialHwnd,PChar(SerNum));
  78.   FreeMem (Textname, len + 1);
  79.   end
  80.   Else
  81.   { Display Error }
  82.        SetWindowText(TxtSerialHwnd,'Not Enough Characters..');
  83. end;


-----
ds





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

Создано: 22 августа 2011 16:10
· Личное сообщение · #12

Code:
  1. tmp:=copy(IntToHex(EDX,2),Length(IntToHex(EDX,2))-3,2);
  2.       if StrToInt('$'+tmp) >= $80

Это че за изврощение то такое, сначала пеерводить в строку ,а потом обратно в число. Работай сразу с ним как с числом, без этих лишних телодвижений.

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





Ранг: 253.5 (наставник), 684thx
Активность: 0.260.25
Статус: Участник
radical

Создано: 22 августа 2011 16:24
· Личное сообщение · #13

BoRoV пишет:
Это че за изврощение то такое, сначала пеерводить в строку ,а потом обратно в число. Работай сразу с ним как с числом, без этих лишних телодвижений.

Сейчас так сразу и не вспомню, так как первую часть я перевел еще с месяц назад, но это вроде я так пытался использовать DH ))

-----
ds





Ранг: 307.9 (мудрец), 196thx
Активность: 0.180
Статус: Участник

Создано: 22 августа 2011 16:53 · Поправил: mysterio
· Личное сообщение · #14

этот кусок
Code:
  1. if StrToInt('$'+tmp) >= $80
  2.                      then
  3.                        EDX := EDX * $2 xor $1021
  4.                      else
  5.           EDX := EDX * $2;


в любом случае выполняем EDX := EDX * $2 и ксорим только когда условие выполняется:
Code:
  1. EDX := EDX * $2;
  2.   if StrToInt('$'+tmp) >= $80 then EDX := EDX xor $1021;


Почему именно $2 (почему не shl 1 =) ? Двойка в хексе точно такая же как и в десятичной системе =)

-----
Don_t hate the cracker - hate the code.





Ранг: 253.5 (наставник), 684thx
Активность: 0.260.25
Статус: Участник
radical

Создано: 22 августа 2011 17:08
· Личное сообщение · #15

Спасибо...
1 - не заметил
2 - Двойка в хексе точно такая же как и в десятичной системе =) ))) Это я знаю, как-то прогавил, а вот то, что можно заменить на shl 1 - не знал

Еще вопрос к знатокам: test DH,1 - как перевести на паскаль ?, так как я трейсил и сам высматривал что это за условие, чтобы срослось.

-----
ds





Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 22 августа 2011 17:27
· Личное сообщение · #16

test=and, если что. Отсюда вполне перевести можно.

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


Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 22 августа 2011 18:25 · Поправил: PE_Kill
· Личное сообщение · #17

Тогда уж
if PByteArray(@EDX)^[2] >= $80

или
if (Byte(EDX shr 8) >= $80)

или
if Word(EDX and $FFFF0000) >= $8000

-----
Yann Tiersen best and do not fuck


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


Ранг: 253.5 (наставник), 684thx
Активность: 0.260.25
Статус: Участник
radical

Создано: 25 августа 2011 16:29 · Поправил: DimitarSerg
· Личное сообщение · #18

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

TEST DH,080h //сравниваем DH с 080h
JE @MYPROG_0053F44B // прыгаем, если равно

Я сделал так (хотя когда писал - и сам знал, что это изврат)
tmp:=copy(IntToHex(EDX,2),Length(In tToHex(EDX,2))-3,2);
if StrToInt('$'+tmp) >= $80

потому что если не ошибаюсь


Подскажите, где туплю ?!

-----
ds




Ранг: 516.1 (!), 39thx
Активность: 0.280
Статус: Участник

Создано: 25 августа 2011 16:42
· Личное сообщение · #19

так прокатит?

tmp:= (EDX >> 8) & 0x0FF
tmp >= $80

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


Ранг: 253.5 (наставник), 684thx
Активность: 0.260.25
Статус: Участник
radical

Создано: 25 августа 2011 17:04
· Личное сообщение · #20

Av0id
Вот теперь точно оно )). Так работает. Спасибо

-----
ds





Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 26 августа 2011 10:52
· Личное сообщение · #21

DimitarSerg пишет:
TEST DH,080h //сравниваем DH с 080h
JE @MYPROG_0053F44B // прыгаем, если равно


Тогда это надо реализовывать вот так

if (EDX and $8000 = $8000) then

-----
Yann Tiersen best and do not fuck





Ранг: 748.2 (! !), 390thx
Активность: 0.370
Статус: Участник
bytecode!

Создано: 21 ноября 2011 01:07 · Поправил: 4kusNick
· Личное сообщение · #22

Добралась статья и до хабры

-----
Флэш, ява, дотнет - на завтрак, обед и ужин. Unity3D на закуску.


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

Ранг: 301.4 (мудрец), 194thx
Активность: 0.170.01
Статус: Участник

Создано: 21 ноября 2011 08:52 · Поправил: Veliant
· Личное сообщение · #23

Уже давно не открывал Delphi, но думаю вот такой вариант все же ближе к программисткому, нежели рипнутый код
Code:
  1. for i:=0 to len do
  2. begin
  3.          key := key xor (Name[i] shl 8);
  4.          for j:=8 downto 0 do
  5.          begin
  6.                  key := key shl 1;
  7.                  if (hi(key) and $80 = $80) then key := key xor $1021;
  8.          end;
  9. end;
  10. RandSeed := key & $FFFF;
  11.  
  12. for i:=1 to $13 do
  13. begin
  14.          a := 0
  15.          if i <> $13 then
  16.          begin
  17.                  for j:=$13-i downto 0 do
  18.                  begin
  19.                         a := Random(33) + 1 + (not ord(NameBuffer[i mod len]));
  20.                  end;
  21.          end;
  22.          SerNum := SerNum + KeyStr[a mod 33];
  23. end;

И вообще сдается мне сравнение с $80 это проверка на отрицательное значение

P.S.
Больше всего доставил код
Code:
  1. while a > $21 do
  2. begin
  3. := a - $21;
  4. end;

Это программисты так извратились или компилятор операцию mod так развернул

Да и
Code:
  1. if i > len then
  2. tmp1:=ord(NameBuffer[i mod len])
  3. else
  4. tmp1:=ord(NameBuffer[i]);

Сворачивается до
Code:
  1. tmp1:=ord(NameBuffer[i mod len])



 eXeL@B —› Крэки, обсуждения —› Статья. Простая защита или ломаем TurboLaunch 5.1.3 тремя способами
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


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