eXeL@B —› Программирование —› Помогите подправить Delphi(KOL) исходники. |
Посл.ответ | Сообщение |
|
Создано: 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; Помогите чем можете |
|
Создано: 21 июня 2011 00:55 · Поправил: 4t · Личное сообщение · #2 |
|
Создано: 21 июня 2011 01:01 · Поправил: phantom2010 · Личное сообщение · #3 |
|
Создано: 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 |
|
Создано: 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-ми значное число |
|
Создано: 21 июня 2011 02:12 · Поправил: RusEm · Личное сообщение · #6 |
|
Создано: 21 июня 2011 02:47 · Личное сообщение · #7 |
|
Создано: 21 июня 2011 08:55 · Личное сообщение · #8 1.Vovan666 +1 имеем налицо нескомпенсированный стэк. в этом случае может и не сильно страшно если 1 раз вызывать процедуру, может и обойдеца и делфя память потом сама освободит, но не правильно, это факт 2. чет я не пойму MOV BYTE PTR DS:[EDI],AL тут ты EDI испльзуеш как указатель на память INC EDI тут индекс масива подымаеш mov ser,EDI а тут АДРЕС конда масива передаеш как серийный номер.... ----- Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме.... |
|
Создано: 21 июня 2011 11:02 · Личное сообщение · #9 |
|
Создано: 21 июня 2011 11:31 · Личное сообщение · #10 |
|
Создано: 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 |
|
Создано: 21 июня 2011 12:40 · Личное сообщение · #12 Не дельфист и не пасквилянт, но попробую подытожить Code:
не бить и ноги не тереть ----- 127.0.0.1, sweet 127.0.0.1 | Сообщение посчитали полезным: phantom2010 |
|
Создано: 21 июня 2011 13:23 · Поправил: phantom2010 · Личное сообщение · #13 СПАСИБ Ребята за помощь. OKOB Не думаю что такой кейген напишет начинающий. И всё равно ошибка Runtime error. А можно как-нить без той функции BinToStr? Я наляпал мини ерунду такого типа Code:
Первые 6 символов нормально,а потом ошибка всё та же. Мож эт у меня проблемы? FrenFolio Только не бей, но несовсем всё понял из твоих рассуждений.Как выбрать буфер достаточной длины? Понял что EDI адрес,но где тогда name держать? Ведь от него генерируется пароль |
|
Создано: 21 июня 2011 13:35 · Личное сообщение · #14 |
|
Создано: 21 июня 2011 14:04 · Поправил: ClockMan · Личное сообщение · #15 Code:
----- Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли. | Сообщение посчитали полезным: phantom2010, DimitarSerg |
|
Создано: 21 июня 2011 14:13 · Поправил: Isaev · Личное сообщение · #16 phantom2010 Если изучаете ассемблер - пишите на чистом ассемблере. Если Delphi KOL - делайте без асм вставок и будет вам счастье. т.к. большинство ошибок из-за не знания асма когда переводишь не надо тупо копипастить, особенно в Delphi вникни в логику и напиши без асма ----- z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh |
|
Создано: 21 июня 2011 15:21 · Поправил: ajax · Личное сообщение · #17 Code:
----- От многой мудрости много скорби, и умножающий знание умножает печаль | Сообщение посчитали полезным: phantom2010 |
|
Создано: 21 июня 2011 16:48 · Личное сообщение · #18 |
eXeL@B —› Программирование —› Помогите подправить Delphi(KOL) исходники. |