R0 CREW

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

На прошлом уроке мы видели сообщение об успешной регистрации, но после этого все стало как было, программа не зарегистрирована.

Продолжаем исследование, у нас остались не исследованные поля
keyHash, codeHash, date

поищем строку keyHash shift+F12, Ctrl+F “keyHash”

имеет две перекрестные ссылки, одну функцию мы уже разобрали, а вот вторую еще нет

ставим бряк и начинаем отладку

пролистав функцию видим что она работает с ранее сохраненным ключевым файлом

проверяет корректность licensecode и activation_code

ну и читает keyHash из json activation code

тут же читается codeHash

от keyHash считается md4

от codeHash sha1 и hex

далее когда ключ прочитан выход из функции

еще один выход и мы покинули pas2.dll и видим получение интерфейса и вызов метода из pas2.dl

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

загружается кофигурация MiniToolPhotoRecovery.exe.ini в которой хранится licenseCode и activation_code

Далее подходим к функции

в ней видим что расшифровывается публичный ключ

далее удаляются переносы и считается md5 от ключа

далее от полученного значения считается еще и sha256

далее от полученного значения считается md4

и сравнивается хеши md4 рассчитанного значения и нашего полученного

напишем код для рассчета keyHash

def get_key_hash(data):
    rsa=CryptoRSA.importKey(data)
    pub=rsa.publickey()
    p=pub.exportKey()
    txt=p.replace('\n','')
    h=hashlib.new('MD5')
    h.update(txt)
    h2=h.digest().encode('hex').lower()

    h=hashlib.new('SHA256')
    h.update(h2)
    h2=h.digest()
    h2=h2.encode('hex')
    return h2

if __name__=="__main__":
    codes=['8e957302','c8e84503','5abfebbb','49d5b5dd']
    code='49d5b5dd'
    
    machineCode='insert machine code'

    serial=get_serial(code,'12345678')
    print serial
    ac=get_activation_code(serial, machineCode)
    v=get_activation_code_extra(machineCode, '20160101')
    print ac
    
    keyHash=get_key_hash(pub)
    print keyHash
    
    activation_code={'activation_code':ac+'-'+v,
                     'date':'',
                     'keyHash':keyHash,
                     'codeHash':'codeHash1',
                     'error':0}
    
    activation_code=encodeRSA(priv,activation_code)
    print activation_code 

сгенерируем регистрационные данные и введем в программу

видим сравнение прошло успешно

и программа сообщает об успешной лицензии Deluxe

пробуем восстановить файлы, и видим сообщение о плохой лицензии

Не расстраиваемся, в следующем уроке посмотрим что же помешало регистрации…