checksum_hash(string tmp) checksum = 0; for each char in tmp checksum += char; checksum = checksum % 9 + 1; do checksum times tmp = string(md5(tmp)); return tmp; Key must be at least 22 chars long AAAAA-AAAAA-AAAAA-BBBB firstpart = the A's without hyphens secondpart = BBBB struct_reg_environment: +008: hKey (for HKEY_CURRENT_USER) +00C: "Software\TopLang\OEBackup\Registration" +138: "A21....." (registry key name) +16C: 3 ;Number of parts in 1st part +170: 5 ;Number of chars / part in 1st part +17C: {9, 2, 6} ;Divisibility constant for the first part +19C: "OEBackup" +1D0: 4 ;Number of hyphens | number of chars in 2nd part +1E0: Encrypted (not-ed) name +244: Encrypted (not-ed) 1st part of key (w/o hyphens) +2A8: Encrypted (not-ed) md5sum +30C: Number of trial days check1: namehash = checksum_hash(name); producthash = checksum_hash("OEBackup") = "A1C4139DAD1DE8597E1F87D8CFBF2AE7"; for(i = 0; i < 4; i++) key[i] = "ABCDEFGHJKLMNPQRSTUVWXY123456789"[(namehash[i] + producthash[i]) % 32]; return checksum_hash(second_part) == checksum_hash(key); /* second_part == key */ check2: divisor = {9, 2, 6}; for(i = 0; i < 3; i++) checksum = 0; for each char in part[i] checksum += char; checksum %= 256; if checksum % divisor[i] != 0 return false; return true;