mel_checksum_cracker.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. #!/usr/bin/env python3
  2. """
  3. MEL Checksum Cracker - Final comprehensive tool
  4. Based on analysis showing sum-sequence is constant but checksum follows different pattern
  5. """
  6. import sys
  7. import struct
  8. def parse_hex(hex_str):
  9. """Parse hex string to bytes"""
  10. return [int(hex_str[i:i+2], 16) for i in range(0, len(hex_str), 2)]
  11. def calculate_mel_checksum(payload_bytes, sequence=None):
  12. """
  13. Calculate MEL checksum based on discovered patterns
  14. This function will be updated as we discover the actual algorithm
  15. """
  16. if sequence is None:
  17. # Try to extract sequence from payload if it's a full packet
  18. if len(payload_bytes) >= 8:
  19. sequence = payload_bytes[7]
  20. else:
  21. sequence = 0
  22. # Calculate payload sum (excluding checksum bytes)
  23. if len(payload_bytes) > 31: # Full packet
  24. payload_sum = sum(payload_bytes[:-2])
  25. else: # Just payload
  26. payload_sum = sum(payload_bytes)
  27. # Test various algorithms based on our analysis
  28. algorithms = {
  29. 'simple_sum': payload_sum & 0xFFFF,
  30. 'sum_minus_seq': (payload_sum - sequence) & 0xFFFF,
  31. 'sum_plus_seq': (payload_sum + sequence) & 0xFFFF,
  32. 'twos_complement': (~payload_sum + 1) & 0xFFFF,
  33. 'ones_complement': (~payload_sum) & 0xFFFF,
  34. 'constant_minus_sum': (0x10000 - payload_sum) & 0xFFFF,
  35. 'sum_with_carry': payload_sum + (payload_sum >> 16),
  36. }
  37. return algorithms
  38. def analyze_pattern_discovery(filename):
  39. """Discover the actual checksum pattern"""
  40. print(f"Pattern Discovery Analysis for {filename}")
  41. print("=" * 60)
  42. with open(filename, 'r') as f:
  43. lines = [line.strip() for line in f if line.strip()]
  44. # Analyze first 20 entries to find the pattern
  45. entries = []
  46. for i, line in enumerate(lines[:20]):
  47. bytes_data = parse_hex(line)
  48. payload = bytes_data[:-2]
  49. checksum = bytes_data[-2] | (bytes_data[-1] << 8) # Little endian
  50. sequence = bytes_data[7] if len(bytes_data) > 7 else 0
  51. payload_sum = sum(payload)
  52. entries.append({
  53. 'index': i,
  54. 'sequence': sequence,
  55. 'checksum': checksum,
  56. 'payload_sum': payload_sum,
  57. 'payload': payload,
  58. 'hex': line
  59. })
  60. # Print analysis table
  61. print("Entry | Seq | Checksum | PayloadSum | Sum-Seq | Patterns")
  62. print("------|-----|----------|------------|---------|----------")
  63. base_constant = None
  64. for entry in entries:
  65. seq = entry['sequence']
  66. check = entry['checksum']
  67. psum = entry['payload_sum']
  68. sum_minus_seq = psum - seq
  69. if base_constant is None:
  70. base_constant = sum_minus_seq
  71. # Test various patterns
  72. pattern_tests = []
  73. if sum_minus_seq == base_constant:
  74. pattern_tests.append("SUM-SEQ=CONST")
  75. # Test if checksum relates to a base value
  76. if entry['index'] == 0:
  77. base_checksum = check
  78. checksum_base = check
  79. else:
  80. checksum_diff = check - base_checksum
  81. pattern_tests.append(f"ΔCHK={checksum_diff:+d}")
  82. patterns = " ".join(pattern_tests) if pattern_tests else "-"
  83. print(f"{entry['index']:5d} | {seq:3d} | 0x{check:04x} | {psum:10d} | {sum_minus_seq:7d} | {patterns}")
  84. # Test for mathematical relationships
  85. print(f"\nMathematical Relationship Analysis:")
  86. print(f"Base constant (sum - sequence): {base_constant}")
  87. # Look for checksum calculation pattern
  88. print(f"\nChecksum Pattern Analysis:")
  89. # Test if there's a consistent transformation from payload_sum to checksum
  90. transformations = {}
  91. for entry in entries:
  92. psum = entry['payload_sum']
  93. check = entry['checksum']
  94. seq = entry['sequence']
  95. # Test various transformations
  96. transforms = {
  97. 'sum_low8': psum & 0xFF,
  98. 'sum_high8': (psum >> 8) & 0xFF,
  99. 'sum_mod256': psum % 256,
  100. 'sum_mod255': psum % 255,
  101. 'sum_rotated': ((psum << 8) | (psum >> 8)) & 0xFFFF,
  102. 'sum_xor_seq': (psum ^ seq) & 0xFFFF,
  103. 'sum_add_magic': (psum + 0x5555) & 0xFFFF,
  104. 'sum_sub_magic': (psum - 0x5555) & 0xFFFF,
  105. }
  106. for name, value in transforms.items():
  107. if value == check:
  108. if name not in transformations:
  109. transformations[name] = []
  110. transformations[name].append(entry['index'])
  111. if transformations:
  112. print("Found consistent transformations:")
  113. for transform, indices in transformations.items():
  114. if len(indices) > 1:
  115. print(f" {transform}: matches at entries {indices}")
  116. else:
  117. print("No simple mathematical transformation found")
  118. # Advanced pattern detection
  119. print(f"\nAdvanced Pattern Detection:")
  120. # Check if it's a lookup table or formula with sequence
  121. checksum_by_seq = {}
  122. for entry in entries:
  123. seq = entry['sequence']
  124. check = entry['checksum']
  125. if seq not in checksum_by_seq:
  126. checksum_by_seq[seq] = []
  127. checksum_by_seq[seq].append(check)
  128. # Look for sequence-based pattern
  129. if len(checksum_by_seq) > 1:
  130. print("Checksum vs Sequence relationship:")
  131. for seq in sorted(checksum_by_seq.keys())[:10]:
  132. checksums = checksum_by_seq[seq]
  133. print(f" Sequence {seq:3d}: checksums {[f'0x{c:04x}' for c in checksums]}")
  134. return entries
  135. def brute_force_checksum_algorithm(entries):
  136. """Brute force the checksum algorithm using known good data"""
  137. print("\nBrute Force Algorithm Discovery:")
  138. print("=" * 40)
  139. # Get the first entry as reference
  140. ref_entry = entries[0]
  141. ref_sum = ref_entry['payload_sum']
  142. ref_checksum = ref_entry['checksum']
  143. print(f"Reference: sum={ref_sum}, checksum=0x{ref_checksum:04x}")
  144. # Try to find the magic constant or operation
  145. # Test if checksum = (payload_sum + magic) & 0xFFFF
  146. for magic in range(-1000, 1000):
  147. predicted = (ref_sum + magic) & 0xFFFF
  148. if predicted == ref_checksum:
  149. print(f"Possible algorithm: checksum = (payload_sum + {magic}) & 0xFFFF")
  150. # Verify with other entries
  151. matches = 0
  152. for entry in entries[1:6]: # Test next 5 entries
  153. test_predicted = (entry['payload_sum'] + magic) & 0xFFFF
  154. if test_predicted == entry['checksum']:
  155. matches += 1
  156. print(f" Verification: {matches}/5 additional entries match")
  157. if matches >= 4:
  158. print(f" 🎉 LIKELY ALGORITHM FOUND!")
  159. return f"(payload_sum + {magic}) & 0xFFFF"
  160. # Test multiplicative factors
  161. for factor in [1, 2, 3, 4, 5, 7, 8, 15, 16, 31, 32, 63, 64, 127, 128, 255, 256]:
  162. for offset in range(-100, 101, 10):
  163. predicted = (ref_sum * factor + offset) & 0xFFFF
  164. if predicted == ref_checksum:
  165. # Verify with next entry
  166. next_entry = entries[1]
  167. next_predicted = (next_entry['payload_sum'] * factor + offset) & 0xFFFF
  168. if next_predicted == next_entry['checksum']:
  169. print(f"Possible algorithm: checksum = (payload_sum * {factor} + {offset}) & 0xFFFF")
  170. print("No simple algorithm found in brute force range")
  171. return None
  172. def generate_implementation(algorithm_desc):
  173. """Generate C/Python implementation of discovered algorithm"""
  174. if not algorithm_desc:
  175. return
  176. print(f"\nGenerated Implementation:")
  177. print("=" * 30)
  178. print("Python:")
  179. print(f"def calculate_mel_checksum(payload_bytes):")
  180. print(f" payload_sum = sum(payload_bytes)")
  181. print(f" return {algorithm_desc}")
  182. print("\nC:")
  183. print(f"uint16_t calculate_mel_checksum(uint8_t* payload, size_t length) {{")
  184. print(f" uint32_t payload_sum = 0;")
  185. print(f" for (size_t i = 0; i < length; i++) {{")
  186. print(f" payload_sum += payload[i];")
  187. print(f" }}")
  188. print(f" return {algorithm_desc.replace('payload_sum', 'payload_sum')};")
  189. print(f"}}")
  190. def validate_algorithm(filename, algorithm_func):
  191. """Validate the discovered algorithm against all entries in file"""
  192. print(f"\nValidating algorithm against all entries in {filename}")
  193. print("=" * 50)
  194. with open(filename, 'r') as f:
  195. lines = [line.strip() for line in f if line.strip()]
  196. matches = 0
  197. total = 0
  198. mismatches = []
  199. for i, line in enumerate(lines):
  200. bytes_data = parse_hex(line)
  201. payload = bytes_data[:-2]
  202. expected_checksum = bytes_data[-2] | (bytes_data[-1] << 8)
  203. calculated_checksum = algorithm_func(payload)
  204. if calculated_checksum == expected_checksum:
  205. matches += 1
  206. else:
  207. mismatches.append((i, expected_checksum, calculated_checksum))
  208. total += 1
  209. # Show first few results
  210. if i < 10:
  211. status = "✓" if calculated_checksum == expected_checksum else "✗"
  212. print(f" Entry {i:3d}: expected=0x{expected_checksum:04x}, calculated=0x{calculated_checksum:04x} {status}")
  213. success_rate = (matches / total) * 100
  214. print(f"\nValidation Results:")
  215. print(f" Matches: {matches}/{total} ({success_rate:.1f}%)")
  216. if success_rate == 100:
  217. print(" 🎉 PERFECT MATCH! Algorithm verified!")
  218. elif success_rate > 95:
  219. print(" ⚠️ Very high success rate - likely correct with minor issues")
  220. else:
  221. print(" ❌ Low success rate - algorithm needs refinement")
  222. if mismatches[:3]:
  223. print(" First few mismatches:")
  224. for entry_idx, expected, calculated in mismatches[:3]:
  225. print(f" Entry {entry_idx}: expected=0x{expected:04x}, got=0x{calculated:04x}")
  226. def main():
  227. if len(sys.argv) < 2:
  228. print("MEL Checksum Cracker - Comprehensive Analysis Tool")
  229. print("=" * 50)
  230. print("Usage: python mel_checksum_cracker.py <hex_file>")
  231. print("\nThis tool will:")
  232. print(" 1. Discover checksum patterns")
  233. print(" 2. Brute force the algorithm")
  234. print(" 3. Generate implementations")
  235. print(" 4. Validate against all data")
  236. sys.exit(1)
  237. filename = sys.argv[1]
  238. try:
  239. # Step 1: Pattern discovery
  240. entries = analyze_pattern_discovery(filename)
  241. # Step 2: Brute force algorithm
  242. algorithm = brute_force_checksum_algorithm(entries)
  243. # Step 3: Generate implementation
  244. generate_implementation(algorithm)
  245. # Step 4: Validation (if algorithm found)
  246. if algorithm:
  247. # Create a lambda function for validation
  248. def test_algorithm(payload):
  249. payload_sum = sum(payload)
  250. # This would be replaced with the actual discovered algorithm
  251. # For now, using a placeholder
  252. return payload_sum & 0xFFFF
  253. validate_algorithm(filename, test_algorithm)
  254. except FileNotFoundError:
  255. print(f"Error: File '{filename}' not found")
  256. except Exception as e:
  257. print(f"Error: {e}")
  258. import traceback
  259. traceback.print_exc()
  260. if __name__ == "__main__":
  261. main()