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

 eXeL@B —› Вопросы новичков —› KeyGenMe #3 Zephyrous
Посл.ответ Сообщение

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

Создано: 03 марта 2006 09:57
· Личное сообщение · #1

Короче есть этот keygenme.

так вот помогите плз. разобраться до конца с проверкой кода.

и заодно правильно ли я мыслю:

1. с адресса 00401CC по 00401DF выполняется получение контрольной суммы от введенного имени, после чего она записывается в EBP+14, после 1-ый байт этой суммы делим на 0F и остаток записываем

2. каждую часть сер.нам. из разных окошек приводим к 4 символам, скажем ввели 6 в 1-ом окне и получили 6000, аналогично со всеми другими.

3. потом новое значение из 1-ого окна множим на 1000 (SHL eax,10). и суммируем со значением полученным после всех преобразований (пункт 2) из последнего окна.

потом также делаем: 3 мнодим на 1000 и складнываем со 2-ым.

потом ксорим (xor) полученный значения.

а вот дальше я не очень понял.

происходит постоянное деление на 2(?). и проверка если 1-ый байт равен 1 то прибавляем к ecx 1. и так пока не станет нулю. и потом, если сер.нам. правильный, то остаток от деления из пункта 1. равен ecs.

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

e9f0_kgme3.exe.zip



Ранг: 123.7 (ветеран)
Активность: 0.10
Статус: Участник
1nn0$/100

Создано: 03 марта 2006 16:56
· Личное сообщение · #2

buian_B
Этот крэкми вызывает у меня умиление... Я его не кейгенил и даже не особо понял что там происходит... НО с ПЕРВОЙ ПОПЫТКИ ввода получил свой серийник =)
Name: 1nn0$/100
Code: 1234-2345-3456-4567
Может поможет...

-----
Blame the victim!




Ранг: 50.7 (постоянный)
Активность: 0.060
Статус: Участник

Создано: 03 марта 2006 18:26
· Личное сообщение · #3

Хз, чё там белается из имени, но подбором можно к любому нику за десятов попыток подобрать рег.код

Klajnor
0000-0000-0000-000F

Для ников 1nn0$/100 и buian_B
0000-0000-0000-1FFF

Бла-Бла-Бла
0000-0000-0000-0CFF

Bla-Bla-Bla
0000-0000-0000-00AF

Кажись там вообще достаточно 15 паролей =)



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

Создано: 03 марта 2006 20:55 · Поправил: Mordred
· Личное сообщение · #4

buian_B
Там такой алгоритм:
1) Подсчитывается контрольная сумма имени юзера:
ХOR EAX,EAX
004011CC:
MOV EDX,DWORD PTR SS:[EBP+10]
MOVSX ECX,BYTE PTR DS:[EDX+EAX]
ADD ECX,DWORD PTR SS:[EBP+14]
IMUL ECX,EAX
INC EAX
MOV DWORD PTR SS:[EBP+14],ECX
CMP EAX,ESI
JB SHORT .004011CC
Затем берется младший байт контрольной суммы, делится с учетом знака (div) на 15, берется остаток от этого деления и сохраняется.
2) Введенный серийник обрабатывается следующим образом:
- из исходного вида "abcd-efgh-ijkl-mnop" формируется два двойных слова, которые имеют вид
"abcdmnop" и "ijklefgh" соответственно, и ксорятся
- после ксора результат хранится в еах и обрабатывается так:
4012A0:
SHR EAX,1
TEST AL,1
JE SHORT 4012A7
INC ECX
4012A7:
TEST EAX,EAX
JA SHORT 4012A0

AL здесь проверяется не на равенство 1, а на чётность, т.к. test - это побитовая конъюнкция, то же, что и and, только результат никуда не сохраняется
3) Накопленное в ecx значение сравнивается с найденным ранее остатком от деления контрольной суммы. Если они совпадают - все ок.
Осталось проявить чуть-чуть смекалки - и кейген готов
З.Ы. Если не будет лениво, чуть позже его сделаю



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

Создано: 04 марта 2006 11:32 · Поправил: Mordred
· Личное сообщение · #5

Вчера сетка отказала - выложить не мог Вроде закейгенил
Только одно меня смущает: если после деления на 15 получаем остаток 0, то всегда выводится сообщение
о неправильном серийнике:
MOV EAX,DWORD PTR SS:[EBP+C]
XOR EDX,EDX
MOV ECX,0F
DIV ECX
MOV ESI,EDX
...
TEST ESI,ESI
JBE SHORT e9f0_kgm.004012CE
PUSH 0
PUSH e9f0_kgm.00406098; ASCII "Good Boy!"
PUSH e9f0_kgm.00406054; ASCII "Congratulations... you're good in reversing Please Keygen It"
JMP SHORT e9f0_kgm.004012DA
004012CE:
PUSH 0
PUSH e9f0_kgm.00406048 ; ASCII "Bad Boy!"
PUSH e9f0_kgm.00406030 ; ASCII "Please Try Again!"
004012DA:
PUSH EDI ; |hOwner
CALL DWORD PTR DS:[<&USER32.MessageBoxA>>
....

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

ЗЫ Мой кейген и исходник генерирующей функции - в аттаче
47a4_keygen.rar.zip



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

Создано: 09 марта 2006 16:43
· Личное сообщение · #6

я не заходил долго в инет (денег не было), так вот щас скачал исходник. если честно я не очень понял саму работу генерации
у меня млин проблемы почему-то, я не могу понять как провести эти обратные операции к подчету сколько раз четно и ксору.
может подскажет кто?



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

Создано: 09 марта 2006 16:58 · Поправил: Mordred
· Личное сообщение · #7

buian_B
Идея простая, я правда уже подзабыл, но вроде так: там считается контрольная сумма от имени юзера, берется её младший байт и находится остаток от деления этого байта на 15. Пусть это у нас n.
Теперь нам нужно добиться, чтобы число, полученное в результате операций с серийником, совпало с n. А как оно генерится?.. Из серийника формируются два двойных слова (каким образом - описано выше), ксорятся, а потом с результатом ксора делают следующее: сдвигают вправо и смотрят: если число получилось нечётное, то счётчик увеличивают, иначе ничего. Значит, чего нам надо добиться?.. чтобы результат ксора в n случаях после сдвига давал нечётное число.
Вот я и формирую этот "результат ксора" (xorResult): беру и n раз сдвигаю переменную влево, каждый раз при этом добавляя к ней 1, т.к. сдвиг + увеличение на единицу каждый раз дают нечётное число. А теперь надо задать два числа, которые при ксоре совпадут с xorResult. Первое делаем рандомно (random), второе: second = xorResult ^ random .
Естественно, что random ^ second = xorResult. А дальше из этих двух чисел делаем серийник, думаю, понятно, как



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

Создано: 10 марта 2006 16:52
· Личное сообщение · #8

че-то у меня собственный все же не получается на Delphi



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

Создано: 10 марта 2006 18:26 · Поправил: buian_B
· Личное сообщение · #9

procedure TForm1.Button1Click(Sender: TObject);
var
nam: string;
ser1, ser2: integer;
ch: Byte;
begin
nam:=Edit1.Text;
len:=length(nam);
ch:=0;
for i:=0 to len do
ch:=(Ord(nam[i])+ch)*i;
ch:=Lo(ch);
ch:=ch mod 15;

randomize;
ser1:=(Randomrange(1000,9999)*10000)+randomrange(1000,9999);
ser2:=0;
while ch>0 do
begin
ser2:=ser2*10+1;
ch:=ch-1;
end;
ser2:=ser2 xor ser1;
end;

Вот это правильно? Mordered подскажи плз.



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

Создано: 10 марта 2006 18:44
· Личное сообщение · #10

Хм, не совсем

ser2:=ser2*10+1; - сдвиг - это умножение не на 10, а на 2.

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



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

Создано: 10 марта 2006 19:26
· Личное сообщение · #11

я че-то не понял как в итог по окошкам расиписать, понял что скажем из ser1 первые 4-е символа в 1-ое , а другие 4 - в последнее.
но вот как форматнуть в символы?




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

Создано: 10 марта 2006 20:16
· Личное сообщение · #12

buian_B пишет:
я че-то не понял как в итог по окошкам расиписать, понял что скажем из ser1 первые 4-е символа в 1-ое , а другие 4 - в последнее.
но вот как форматнуть в символы?


эм... мэй би
var
s:string;
...
s:=IntToStr(ser1)

а потом юзаешь или copy или delete и распихиваешь по окожкам! =)

-----
[nice coder and reverser]




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

Создано: 11 марта 2006 05:55
· Личное сообщение · #13

дык так именно я делал ну происходила генерация якобы, пробовал только ни один сер нам не подошел



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

Создано: 11 марта 2006 19:18
· Личное сообщение · #14

buian_B пишет:
но вот как форматнуть в символы?

Я в Паскале ни силен но в Си например я юзал функцию sprintf, которая пишет в строку по заданному формату. Причем выводишь именно как представление числа в хексах, а не в десятично



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

Создано: 11 марта 2006 19:19
· Личное сообщение · #15

buian_B пишет:
но вот как форматнуть в символы?

Я в Паскале не силён а в Си юзал стандартную функцию sprintf, которая пишет в строку по заданному формату. Уверен, и в Паскале что-то подобное есть. Причем учти, что нужно выводить представление числа в хексах, а не в десятичной системе.




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

Создано: 11 марта 2006 19:42
· Личное сообщение · #16

Mordred пишет:
Я в Паскале не силён а в Си юзал стандартную функцию sprintf, которая пишет в строку по заданному формату. Уверен, и в Паскале что-то подобное есть. Причем учти, что нужно выводить представление числа в хексах, а не в десятичной системе.


ну если так, тогда s:=IntToHex(ser1,4), 4 - количество символов (т.е. 2 байта).
выведет в 16-ом представлении =) н-р:
ser1:=$558BEC;
s:=IntToHex(ser1,6);
тогда будет s='558BEC' =)

-----
[nice coder and reverser]




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

Создано: 11 марта 2006 19:56
· Личное сообщение · #17

дык, сэнкс конечно, но вот делаю я так:

c:=Copy(inttostr(ser1), 1, 4);
Edit2.Text:=IntToHex(strtoint(c),4);

таким образом для каждого из 4 окон. но теперь ошибка видно где-то в алгоритме так как:

1. не всегда срабатывает ключ и срабатывает только если ввести имя из чисел, и то не всегда
2. при вводе имени из разных символов(букв ...) получается что он ser1 и ser2 одинаковы



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

Создано: 11 марта 2006 21:57
· Личное сообщение · #18

ser2:=0; -- вот где у тебя похоже ошибка.
сделай ser2:=1; (у меня так и сделано), а то у тебя получается на последнем сдвиге чётное число...



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

Создано: 12 марта 2006 14:53 · Поправил: buian_B
· Личное сообщение · #19

странно, короче ошибка была у меня небольшая, дело в том что в дельфи 1-ый символ строки не [0] а [1] поэтому цикл:

for i:=1 to len+1 do
ch:=(Ord(nam[i])+ch)*i;

но все равно, правильные ключи тока для имени из цифр, а имена из букв грит что не верны



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

Создано: 12 марта 2006 17:58
· Личное сообщение · #20

buian_B
Ты пробовал сделать ser2:=1 ? Не дало эффекта?..



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

Создано: 12 марта 2006 18:00
· Личное сообщение · #21

дык сразу так и сделал.

вот щас как выглядит вся процедура:

procedure TForm1.Button1Click(Sender: TObject);
var
nam, c: string;
i, len: integer;
ser1, ser2: integer;
begin
nam:=Edit1.Text;
len:=length(nam);
ch:=0;
for i:=1 to len+1 do
ch:=(Ord(nam[i])+ch)*i;
ch:=ch and $ff;
ch:=ch mod 15;
randomize;
ser1:=(Randomrange(1000,9999)*10000)+randomrange(1000,9999);
ser2:=1;
while ch>0 do
begin
ser2:=ser2*2+1;
ch:=ch-1;
end;
ser2:=ser2 xor ser1;

c:=Copy(inttostr(ser1), 1, 4);
Edit2.Text:=IntToHex(strtoint(c),4);

c:=Copy(inttostr(ser1), 5, 4);
Edit5.Text:=IntToHex(strtoint(c),4);

c:=Copy(inttostr(ser2), 1, 4);
Edit4.Text:=IntToHex(strtoint(c),4);

c:=Copy(inttostr(ser2), 5, 4);
Edit3.Text:=IntToHex(strtoint(c),4);
end;



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

Создано: 12 марта 2006 19:05
· Личное сообщение · #22

exe - ник как и просил, дык в архиве, т.к. так весит больше 200 к зы а писать все через WinAPI неохото, да и опыта немного у меня


d8da_Project1.rar.zip


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


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