Решение Fatih54102 - Math Keygenme

Сложность: 1 – Very easy, for newbies
Платформа: Windows
Язык: (Visual) Basic
Дано: Math Keygenme

You must know math to solve this keygenme.
Written in VB.
Not Obfuscated or MD5 hashed.

Решение (автор Kostya)
опубликовано 21.04.2012

Инструменты: VB Decompiler, Ollydbg

Программа написана на Visual Basic, берем декомпилятор – отличный выбор VB Decompiler – и смотрим код. В наличии: одна форма, одно поле ввода данных, одна кнопка – обработчик находится по адресу 00401E30.

image00.jpg

Анализируем код. Что несложно. Вся процедура 00401E30 состоит из одного цикла и итогового сравнения.

Псевдокод функции 00401E30:



Итак, вся математика заключается в сложении и вычитании.
А вот и сама проверка:



Если EBX >= 0x5DC0 (24000) и младший бит EBX равен 0, то показываем goodboy-сообщение – задача решена. Проще некуда. Т.е. достаточно ввести ключ «99» (0x2EE0 + 0x2EE0 = 0x5DC0) и дело сделано.

image01.jpg

Набросаем кейгенчик.

# -*- coding: cp1251 -*-
import random
 
math_value = [-5000, 1000, -2000, 3000, -4000,5000, -6000, 7000, -8000, 12000, 1]
code_value = ["0","1","2","3","4","5","6","7","8","9","("]
serial = ""
 
# флажок бесконечного цикла
inf = 1
# итог вычислений
res = 0
rv = 0
while inf:
   # проверка окончания вычислений
    if (res >= 24000) & ((res & 0x1) == 0):
        break
   # выберем случайное число из диапазона [0..11)
    rv = random.randrange(0,11)
   # тупо складываем с нужным значением
    res += math_value[rv]
   # нужному значению соответствует нужный символ
    serial += code_value[rv]
 
print ("[+]Serial: "+serial)


Примеры:
[+]Serial: (978537(

[+]Serial: 93(9(

[+]Serial: 4628662450486(54404373812611352919261(58143(88657484(727(86(9494712359
53(28(36908315(39858719(81350462146609(47635115(455981083(161(6(49190505(7109557

[+]Serial: 32444669640088(1(788(7068729650(91778073924906373296(78242561753454686
9254(1((685(52285391910433504915278710309(

[+]Serial: 75379

А можно и так указать "blah-blah-blah99" и тоже будет работать (любой символ не из диапазона "0..9(" всего лишь обнуляет итоговое значение, поэтому "blah-blah-blah" пропускаем и считаем "99")

Пока не указано иное, содержимое этой страницы распространяется по лицензии Creative Commons Attribution-ShareAlike 3.0 License