Сейчас на форуме: UniSoft, _MBK_, laslo (+8 невидимых)

 eXeL@B —› Программирование —› Помогите подправить Delphi(KOL) исходники.
Посл.ответ Сообщение

Ранг: 3.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 21 июня 2011 00:38 · Поправил: phantom2010
· Личное сообщение · #1

Решил попробовать себя в кейгенинге и начал с простого crackme от Fant0m #4.
Компилируется всё норм, но есть 2 проблемы:
1) при выводе информации в editbox2 выдайтся ошибка "Runtime error 216 at 00403018".
2) значение введённое editbox1 равно 0 и после сравнения она прыгает на @@2.

1)вот пошёл туда по адресу и там вот такая картина
00402FF0 $ 85D2 TEST EDX,EDX
00402FF2 . 74 24 JE SHORT Keygen.00403018
00402FF4 . 8B4A F8 MOV ECX,DWORD PTR DS:[EDX-8]
00402FF7 . 41 INC ECX
00402FF8 . 7F 1A JG SHORT Keygen.00403014
00402FFA . 50 PUSH EAX
00402FFB . 52 PUSH EDX
00402FFC . 8B42 FC MOV EAX,DWORD PTR DS:[EDX-4]
00402FFF . E8 30000000 CALL Keygen.00403034
00403004 . 89C2 MOV EDX,EAX
00403006 . 58 POP EAX
00403007 . 52 PUSH EDX
00403008 . 8B48 FC MOV ECX,DWORD PTR DS:[EAX-4]
0040300B . E8 2CF5FFFF CALL Keygen.0040253C
00403010 . 5A POP EDX
00403011 . 58 POP EAX
00403012 . EB 04 JMP SHORT Keygen.00403018
00403014 > F0:FF42 F8 LOCK INC DWORD PTR DS:[EDX-8] ; LOCK prefix
00403018 > 8710 XCHG DWORD PTR DS:[EAX],EDX
0040301A . 85D2 TEST EDX,EDX
0040301C . 74 14 JE SHORT Keygen.00403032

2) Вот сам исходник:
var nam,ser:cardinal;
begin
nam:=str2int(editbox1.text);
asm
PUSH ESI
PUSH EDI
LEA ESI,DWORD PTR DS:[nam]
LEA EDI,DWORD PTR DS:[ser]
XOR EAX,EAX
XOR ECX,ECX
MOV BL,$1A
@@1:
CMP BYTE PTR DS:[ESI],0
JE @@2
MOV AL,BYTE PTR DS:[ESI]
ADD AL,CL
XOR AL,CL
DIV BL
SHR AX,$8
ADD AL,$41
MOV BYTE PTR DS:[EDI],AL
INC EDI
INC ESI
INC ECX
JMP @@1
@@2:
mov ser,EDI
end;
editbox2.Text:=int2str(ser);
windows.beep(2000,80);
end;
Помогите чем можете



Ранг: 38.3 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 21 июня 2011 00:55 · Поправил: 4t
· Личное сообщение · #2

Исходник
--> Link <--



Ранг: 3.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 21 июня 2011 01:01 · Поправил: phantom2010
· Личное сообщение · #3

Да мне не нужен чужой исходник.
Вы лучше скажите в чём у меня проблема




Ранг: 527.7 (!), 381thx
Активность: 0.160.09
Статус: Участник
Победитель турнира 2010

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

Как минимум вызывает вопрос команда

mov ser,EDI

0) как это name преобразовывается к int (вот там 0 и получается)?
1) в EDI - адрес конца буфера (указатель сдвигался в цикле INC EDI)
2) а в ser - должен быть не адрес, а значение глядя на последующее преобразование editbox2.Text:=int2str(ser);
3) и кто сказал, что для ser достаточно типа cardinal?? (длина имени 4 байта??)

-----
127.0.0.1, sweet 127.0.0.1




Ранг: 3.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 21 июня 2011 02:07 · Поправил: phantom2010
· Личное сообщение · #5

OKOB
там в crackme в EDI заносился адрес буфера в котором собирался правильный серийник
LEA EDI,DWORD PTR DS:[403284]

Предложи свой вариант как надо написать, а то я уже просто в осадок упал, что я только не пробовал

Да, в nam если вводшь буквы, то на выходе 0
можно ser и nam сделать стрингами.
Что делать с LEA ESI,DWORD PTR DS:[nam], тут в esi записываеься 7-ми значное число



Ранг: 13.9 (новичок), 1thx
Активность: 0.010
Статус: Участник

Создано: 21 июня 2011 02:12 · Поправил: RusEm
· Личное сообщение · #6

Если правильно понимаю - то как сказал ОКОВ
ser - либо массив байт либо строка (но тогда нулевой байт в конце нужен)



Ранг: 617.3 (!), 677thx
Активность: 0.540
Статус: Участник

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

А для чего там
PUSH ESI
PUSH EDI
если нету pop-ав?



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

Создано: 21 июня 2011 08:55
· Личное сообщение · #8

1.Vovan666 +1 имеем налицо нескомпенсированный стэк. в этом случае может и не сильно страшно если 1 раз вызывать процедуру, может и обойдеца и делфя память потом сама освободит, но не правильно, это факт
2. чет я не пойму
MOV BYTE PTR DS:[EDI],AL тут ты EDI испльзуеш как указатель на память
INC EDI тут индекс масива подымаеш
mov ser,EDI а тут АДРЕС конда масива передаеш как серийный номер....

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....





Ранг: 105.6 (ветеран), 36thx
Активность: 0.10
Статус: Участник

Создано: 21 июня 2011 11:02
· Личное сообщение · #9

мб удалить метку @@2? ну хотя бы сделай её пустой. без кода. и кстате, ты должене в конце
inc edi
mov byte ptr ds:[edi],$00
а переменную ser в конце не трогай!




Ранг: 568.2 (!), 465thx
Активность: 0.550.57
Статус: Участник
оптимист

Создано: 21 июня 2011 11:31
· Личное сообщение · #10

Vovan666 пишет:
А для чего там PUSH ESIPUSH EDIесли нету pop-ав?

+1
не восстановил адреса, и при чтении с EDI происходит експишен так как читается ноль, после @@2: вписать комманды pop edi,pop esi и всё заработает.

-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.





Ранг: 340.0 (мудрец), 22thx
Активность: 0.120
Статус: Участник
THETA

Создано: 21 июня 2011 12:37 · Поправил: FrenFolio
· Личное сообщение · #11

phantom2010
1) Буферы должны быть достаточной длины, для имени, и для сгенерированного ключа (см. п. 4);
2) Не нужно преобразовывать вводимое имя в целое число -> здесь должен быть указатель на строку nam;
3) Ты рипнул код, захватив 2 лишние инструкции PUSH ESI и PUSH EDI. Поэтому либо восстанавливай их -> POP EDI и POP ESI, либо замени на PUSHAD и POPAD, либо вообще убери это;
4) В инструкции mov ser,EDI передается указатель, а не число. К тому же, здесь нужно уменьшить адрес на длину ключа = длине имени (в этом алгоритме длина ключа будет всегда равна длине введенного имени, и длина имени должна быть > 1 символа):
mov ser,EDI -> SUB EDI, Entered_name_length (отнять длину введенного имени) - в EDI будет указатель на сгенерированный ключ;
5) Ты рассматриваешь ключ как число и преобразовываешь через int2str в строку, и соответственно, получишь восстановленный из hex в строку адрес последней ячейки памяти, после самого ключа. И это значение будет фиксировано, для всех имен одной длины. Однако тут нужно просто вернуть в указателе, полученном в EDI -> вывод в едит бокс -> там уже будет адрес начала записанного в буфер ключа.

Примеры ключей: FrenFolio | SKXKAJMPX; phantom2010 | IATKUJNKWZW.

-----
Программист SkyNet





Ранг: 527.7 (!), 381thx
Активность: 0.160.09
Статус: Участник
Победитель турнира 2010

Создано: 21 июня 2011 12:40
· Личное сообщение · #12

Не дельфист и не пасквилянт, но попробую подытожить

Code:
  1. type
  2. TByteArray = array[0..100] of Byte;
  3.  
  4. var
  5.  i,len:  Integer;
  6.  name:   TByteArray;
  7.  serial: TByteArray;
  8.  
  9. function BinToStr(const bin: TByteArray, len: Integer): string;
  10. const HexSymbols = '0123456789ABCDEF';
  11. var i: Integer;
  12. begin
  13.   SetLength(Result, 2*len);
  14.   for i :=  0 to len do 
  15.   begin
  16.     Result[1 + 2*+ 0] := HexSymbols[1 + bin[i] shr 4];
  17.     Result[1 + 2*+ 1] := HexSymbols[1 + bin[i] and $0F];
  18.   end;
  19. end;
  20.  
  21. begin
  22. for i := 1 to Length(editbox1.text) - 1 do
  23.    name[i] := Ord(editbox1.text[i]);
  24. name[i] := 0;
  25.  
  26. asm
  27. PUSH ESI
  28. PUSH EDI
  29. LEA ESI,DWORD PTR DS:[name]
  30. LEA EDI,DWORD PTR DS:[serial]
  31. XOR EAX,EAX
  32. XOR ECX,ECX
  33. MOV BL,$1A
  34. @@1:
  35. CMP BYTE PTR DS:[ESI],0
  36. JE @@2
  37. MOV AL,BYTE PTR DS:[ESI]
  38. ADD AL,CL
  39. XOR AL,CL
  40. DIV BL
  41. SHR AX,$8
  42. ADD AL,$41
  43. MOV BYTE PTR DS:[EDI],AL
  44. INC EDI
  45. INC ESI
  46. INC ECX
  47. JMP @@1
  48. @@2:
  49. MOV DS:[len],ECX
  50. POP EDI
  51. POP ESI
  52. end;
  53. editbox2.Text := BinToStr(serial, len);
  54. windows.beep(2000,80);
  55. end;

не бить и ноги не тереть

-----
127.0.0.1, sweet 127.0.0.1


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

Ранг: 3.0 (гость)
Активность: 0=0
Статус: Участник

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

СПАСИБ Ребята за помощь.
OKOB
Не думаю что такой кейген напишет начинающий.
И всё равно ошибка Runtime error.
А можно как-нить без той функции BinToStr?

Я наляпал мини ерунду такого типа
Code:
  1. var
  2. name:   String;
  3. serial: String;
  4.  begin
  5.  name:=editbox1.text;
  6. asm
  7. mov EAX,name
  8. mov serial,EAX
  9. end;
  10. editbox2.Text := STRING(serial);
  11. windows.beep(2000,80);
  12. end;

Первые 6 символов нормально,а потом ошибка всё та же. Мож эт у меня проблемы?

FrenFolio
Только не бей, но несовсем всё понял из твоих рассуждений.Как выбрать буфер достаточной длины? Понял что EDI адрес,но где тогда name держать? Ведь от него генерируется пароль




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

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

А try/except религия не позволяет использовать?

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





Ранг: 568.2 (!), 465thx
Активность: 0.550.57
Статус: Участник
оптимист

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

Code:
  1.   Form1: TForm1;
  2.   Name,Serial: string;
  3.   C:byte;
  4.   D:dword;
  5.   A:char;
  6.   B:^byte;
  7.   Leng: integer;
  8.  
  9. implementation
  10.  
  11. {$*.dfm}
  12.  
  13. procedure TForm1.Button1Click(Sender: TObject);
  14. begin
  15.   if Edit1.Text = '' then exit;
  16.   Serial:='';
  17.   C:=0;
  18.   B:=@A;
  19.   for Leng := 1 to Length(Edit1.Text) do
  20.     begin
  21.     A:= Char(Edit1.Text[Leng]);
  22.     D:=B^;
  23.       asm
  24.       mov eax,[D]
  25.       add al,[C]
  26.       xor al,[C]
  27.       mov ecx,1Ah
  28.       div cl
  29.       shr ax,8h
  30.       add al,41h
  31.       mov byte[D],al
  32.       end;
  33.     C := C + 1;
  34.     Serial:=Serial+Char(D);
  35.   end;
  36.   Edit2.Text:=Serial;
  37.  
  38. end;
  39.  
  40. end.


-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.


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


Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

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

phantom2010 Если изучаете ассемблер - пишите на чистом ассемблере.
Если Delphi KOL - делайте без асм вставок и будет вам счастье.
т.к. большинство ошибок из-за не знания асма
когда переводишь не надо тупо копипастить, особенно в Delphi
вникни в логику и напиши без асма

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh





Ранг: 337.6 (мудрец), 224thx
Активность: 0.210.1
Статус: Участник
born to be evil

Создано: 21 июня 2011 15:21 · Поправил: ajax
· Личное сообщение · #17

Code:
  1. {$APPTYPE CONSOLE}
  2. var
  3.   name,serial : AnsiString;
  4. begin
  5. name:='FrenFolio';
  6. setlength(serial,length(name));
  7.  
  8. asm
  9.   pushad
  10.   LEA    eax,name
  11.   mov    ESI,[eax]
  12.   LEA    eax,serial
  13.   mov    EDI,[eax]
  14.  
  15.   xor    eax,eax
  16.   XOR    ECX,ECX
  17.   MOV    BL,1Ah
  18. @@1:
  19.   lodsb
  20.   or     al,al
  21.   JZ     @@2
  22.  
  23.   ADD    AL,CL
  24.   XOR    AL,CL
  25.   DIV    BL
  26.   SHR    AX,8
  27.   ADD    AL,41h
  28.   stosb
  29.   INC    ECX
  30.   JMP    @@1
  31. @@2:
  32.   popad
  33. end;
  34.  
  35. write(serial);
  36. readln;
  37. end.


-----
От многой мудрости много скорби, и умножающий знание умножает печаль


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

Ранг: 3.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 21 июня 2011 16:48
· Личное сообщение · #18

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


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


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