R0 CREW

3. Уроки реального взлома MiniTool Photo Recovery 3.0

⁠в этом уроке продолжаем ломать MiniTool Photo Recovery, в прошлый раз нашли валидный сериный номер и остановились тут

дебажим дальше и видим функцию которая принимает на вход три параметра

LicenseCode (serial number)=123456-78A8E7-04D461-0D7679
activation_code=activation_code1
MachineCode=1ae6c86a10b1210fd3f1aa6942cf41b6

идем далее

функция subStr берет первую часть длинной 48 символов от activation_code

вычисляется хеш md5
code1=md5(activation_code[:0x30])

далее идет функция

на вход принимает LicenseCode и MachineCode и что то с ними делает, посмотрим ее подробнее

выполняются преобразования с MachineCode считается md5, hex, нижний регистр и первые 8 символов
key=lower(hex(md5(MachineCode)))[:8]

тут выполняется шифрование des ecb encode с ключом key и LicenseCode без “-” в верхнем регистре

далее

вычисляется от шифрованного значения md5(enc)

и сравнение результатов, мы можем на основе этих данных написать код

def get_activation_code(serialCode,machineCode):
    sn=serialCode.replace('-','').upper()
    h=hashlib.new('MD5')
    h.update(machineCode)
    h1=h.digest()
    h1=h1.encode('hex')
    k1=h1[:8]
    des=DES.new(k1)
    c1=des.encrypt(sn).encode('hex')
    return c1.upper()

if __name__=="__main__":
    codes=['8e957302','c8e84503','5abfebbb','49d5b5dd']
    code='49d5b5dd'
    
    machineCode='ваш сгенерированный код'
    serial=get_serial(code,'12345678')
    print serial
    ac=get_activation_code(serial, machineCode)
    print ac
    
    
    activation_code={'activation_code':aс,
                     'date':'',
                     'keyHash':'keyHash1',
                     'codeHash':'codeHash1',
                     'error':0}
    
    activation_code=encodeRSA(priv,activation_code)
    print activation_code 

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

проверку прошли но не прошли длину activation_code, она должна быть 0x41 символ а у нас 0x30, добавляем еще 0x11

if __name__=="__main__":
    codes=['8e957302','c8e84503','5abfebbb','49d5b5dd']
    code='49d5b5dd'
    
    machineCode='ваш сгенерированный код'
    serial=get_serial(code,'12345678')
    print serial
    ac=get_activation_code(serial, machineCode)
    print ac
    
    
    activation_code={'activation_code':aс+'12345678901234567',
                     'date':'',
                     'keyHash':'keyHash1',
                     'codeHash':'codeHash1',
                     'error':0}
    
    activation_code=encodeRSA(priv,activation_code)
    print activation_code 

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

далее от activation_code берется 16 символов с конца ‘2345678901234567’

и выполняется функция

она аналогична get_activation_code, только вместо шифрования используется des ecb decode

напишем код для формирования и этой части

def get_activation_code_extra(machineCode,data):
    h=hashlib.new('MD5')
    h.update(machineCode)
    h1=h.digest()
    h1=h1.encode('hex')
    k1=h1[:8]
    
    des=DES.new(k1)
    m1=des.encrypt(data)
    return m1.encode('hex').upper()


    codes=['8e957302','c8e84503','5abfebbb','49d5b5dd']
    code='49d5b5dd'
    
    machineCode='6ae7c86a12b1210fd3f1aa6949cf41b6'
    serial=get_serial(code,'12345678')
    print serial
    ac=get_activation_code(serial, machineCode)
    v=get_activation_code_extra(machineCode, '12345678')
    print ac
    
    
    activation_code={'activation_code':ac+'-'+v,
                     'date':'',
                     'keyHash':'keyHash1',
                     'codeHash':'codeHash1',
                     'error':0}
    
    activation_code=encodeRSA(priv,activation_code)
    print activation_code 

‘activation_code’:ac+’-’+v
я поставил ‘-’, но может быть любой печатный символ, мы пока не знаем чему он равен и где проверяется.

генерируем новые регистрационные данные и отлаживаем дальше

видим наши расшифрованные данные 12345678 которые из строки превращаются в число и выполняется сравнение, отформатировав число в ида (оно отрицательное и десятичное)

видим дату 20160101, подставим ее в наш скрипт, и сгенерируем регистрацию вновь

вот и прошли эту проверку

далее видим в отладчике сохранение наших регистрационных данных

создался файл MiniToolPhotoRecovery.exe.key

радуемся регистрации, но не долго)))

на следующем уроке разберем что же помешало успешной регистрации…