Сейчас на форуме: bartolomeo (+3 невидимых) |
eXeL@B —› Вопросы новичков —› KeyGenMe #3 Zephyrous |
Посл.ответ | Сообщение |
|
Создано: 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 |
|
Создано: 03 марта 2006 16:56 · Личное сообщение · #2 |
|
Создано: 03 марта 2006 18:26 · Личное сообщение · #3 |
|
Создано: 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 значение сравнивается с найденным ранее остатком от деления контрольной суммы. Если они совпадают - все ок. Осталось проявить чуть-чуть смекалки - и кейген готов З.Ы. Если не будет лениво, чуть позже его сделаю |
|
Создано: 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 |
|
Создано: 09 марта 2006 16:43 · Личное сообщение · #6 |
|
Создано: 09 марта 2006 16:58 · Поправил: Mordred · Личное сообщение · #7 buian_B Идея простая, я правда уже подзабыл, но вроде так: там считается контрольная сумма от имени юзера, берется её младший байт и находится остаток от деления этого байта на 15. Пусть это у нас n. Теперь нам нужно добиться, чтобы число, полученное в результате операций с серийником, совпало с n. А как оно генерится?.. Из серийника формируются два двойных слова (каким образом - описано выше), ксорятся, а потом с результатом ксора делают следующее: сдвигают вправо и смотрят: если число получилось нечётное, то счётчик увеличивают, иначе ничего. Значит, чего нам надо добиться?.. чтобы результат ксора в n случаях после сдвига давал нечётное число. Вот я и формирую этот "результат ксора" (xorResult): беру и n раз сдвигаю переменную влево, каждый раз при этом добавляя к ней 1, т.к. сдвиг + увеличение на единицу каждый раз дают нечётное число. А теперь надо задать два числа, которые при ксоре совпадут с xorResult. Первое делаем рандомно (random), второе: second = xorResult ^ random . Естественно, что random ^ second = xorResult. А дальше из этих двух чисел делаем серийник, думаю, понятно, как |
|
Создано: 10 марта 2006 16:52 · Личное сообщение · #8 |
|
Создано: 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 подскажи плз. |
|
Создано: 10 марта 2006 18:44 · Личное сообщение · #10 |
|
Создано: 10 марта 2006 19:26 · Личное сообщение · #11 |
|
Создано: 10 марта 2006 20:16 · Личное сообщение · #12 buian_B пишет: я че-то не понял как в итог по окошкам расиписать, понял что скажем из ser1 первые 4-е символа в 1-ое , а другие 4 - в последнее. но вот как форматнуть в символы? эм... мэй би var
а потом юзаешь или copy или delete и распихиваешь по окожкам! =) ----- [nice coder and reverser] |
|
Создано: 11 марта 2006 05:55 · Личное сообщение · #13 |
|
Создано: 11 марта 2006 19:18 · Личное сообщение · #14 |
|
Создано: 11 марта 2006 19:19 · Личное сообщение · #15 |
|
Создано: 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] |
|
Создано: 11 марта 2006 19:56 · Личное сообщение · #17 дык, сэнкс конечно, но вот делаю я так: c:=Copy(inttostr(ser1), 1, 4); Edit2.Text:=IntToHex(strtoint(c),4); таким образом для каждого из 4 окон. но теперь ошибка видно где-то в алгоритме так как: 1. не всегда срабатывает ключ и срабатывает только если ввести имя из чисел, и то не всегда 2. при вводе имени из разных символов(букв ...) получается что он ser1 и ser2 одинаковы |
|
Создано: 11 марта 2006 21:57 · Личное сообщение · #18 |
|
Создано: 12 марта 2006 14:53 · Поправил: buian_B · Личное сообщение · #19 |
|
Создано: 12 марта 2006 17:58 · Личное сообщение · #20 |
|
Создано: 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; |
|
Создано: 12 марта 2006 19:05 · Личное сообщение · #22 exe - ник как и просил, дык в архиве, т.к. так весит больше 200 к зы а писать все через WinAPI неохото, да и опыта немного у меня d8da_Project1.rar.zip |
eXeL@B —› Вопросы новичков —› KeyGenMe #3 Zephyrous |