На днях таки решил разобрать новый алгоритм шифрования паролей, используемый в последних версиях QIP Infium (начиная с 9042?), там оказалось все очень просто – обычный Rijndael. Но вот что удивило, я, конечно, не такой уж профи в программировании, но вот скажите, зачем так извращаться? Профиль (ххх.qip) имеет определенную структуру, первые 25 байт хранят сигнатуру, размер и md5 хэш этого профиля. MD5 хэш хранится в бинарном виде (16 байт), при открытии профиля, он проверяется на валидность путем подсчета md5 суммы, которая потом сравнивается с эталонной (записанной в первых 25 байтах). Вот листинг сего кода, правда, без комментариев, извиняйте:
0076AA7F MOV EDX,10 0076AA84 CALL GetHash_1_from_pMapProfile 0076AA89 MOV EAX,DWORD PTR SS:[EBP-24] 0076AA8C LEA ECX,[EBP-14] 0076AA8F XOR EDX,EDX 0076AA91 CALL Get_string_md5_Hash_1 0076AA96 LEA ECX,[EBP-38] 0076AA99 MOV EDX,DWORD PTR SS:[EBP-4] 0076AA9C MOV EAX,DWORD PTR SS:[EBP-8] 0076AA9F CALL Get_validate_md5_Profile 0076AAA4 LEA EAX,[EBP-38] 0076AAA7 LEA EDX,[EBP-28] 0076AAAA CALL BinToHex 0076AAAF MOV EAX,DWORD PTR SS:[EBP-28] 0076AAB2 LEA EDX,[EBP-18] 0076AAB5 CALL UpperCase 0076AABA MOV EAX,DWORD PTR SS:[EBP-14] 0076AABD MOV EDX,DWORD PTR SS:[EBP-18] 0076AAC0 CALL LStrCmp
А вот теперь объясните, зачем сохраненный md5 извлекать, потом переводить в текстовый вид (32 символа), подсчитать для профиля его действительный md5, опять таки перевести его в строку, перевести символы в верхний регистр, и кульминация сиих действий – сравнить две этих строчки не сходятся ли они? Нельзя что ли просто сравнить 16 байт данных простой функцией:
CompareMem(hash1, hash2, 16);
В общем, как-то печально стало после увиденного…
— Летучая Мышшшь · 19 Апрель 2011, 13:26 · #
а ты напиши разработчикам то))))
— Владимир · 8 Май 2011, 13:54 · #
Пока не собираетесь выкладывать софтинку под qip infium 9042?
— alexey-m · 8 Май 2011, 17:56 · #
Владимир, возможно в скором будующем выпущу апдейт, сейчас нет пока времени…