import z3 import struct from more_itertools import chunked # Create license # license is 20 bytes # we do not model the given - of XXXXX-XXXXX-XXXXX-XXXXX # This will be consistent for all comments license = [ for i in range(20)] s = z3.Solver() # General license format constraints: # Each character is either 0-9 or A-Z ## TODO ## bin1 constraints # after performing sort on the license key # it will be: 067889BBCKKMOPPUVWYY # I.e. the license key is made up out of exactly these characters ## bin2 # sums of numbers and capital chars # For each set of 5 characters in the XXXXX-XXXXX-XXXXX-XXXXX license code, # the numbers are summed together and compared # same for the characters A-Z, where A represents 0, B represents 1, # ... and Z represents 25 # The arrays below already have the correct sums number_sums = [ 0, 7, 0xE, 0x11 ] char_sums = [ 61, 36, 44, 0x32 ] ## bin3 # bin3 will for each byte at license [i] in the license code # get the index with strchr and then license[i+1] is allowed # to only contain values that are in the 0x18 4-byte ints # in the array starting at idx * 0x60 (note: 0x18*4 = 60) # strchr of ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 # Please keep in mind: this was a binary with a big-endian architecture # the given u32 will unpack a 4-byte big-endian value if given 4 bytes allowed_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" bin3_allow_array = b'\x00\x00\x00H\x00\x00\x00O\x00\x00\x00W\x00\x00\x00F\x00\x00\x00M\x00\x00\x002\x00\x00\x00A\x00\x00\x001\x00\x00\x00T\x00\x00\x00E\x00\x00\x00S\x00\x00\x00X\x00\x00\x000\x00\x00\x00K\x00\x00\x00C\x00\x00\x00Q\x00\x00\x005\x00\x00\x00B\x00\x00\x00Y\x00\x00\x00D\x00\x00\x00J\x00\x00\x007\x00\x00\x00P\x00\x00\x008\x00\x00\x003\x00\x00\x00D\x00\x00\x00Z\x00\x00\x00J\x00\x00\x00H\x00\x00\x00B\x00\x00\x002\x00\x00\x00U\x00\x00\x00O\x00\x00\x00S\x00\x00\x009\x00\x00\x00M\x00\x00\x00T\x00\x00\x008\x00\x00\x00L\x00\x00\x00N\x00\x00\x00W\x00\x00\x00K\x00\x00\x00E\x00\x00\x00F\x00\x00\x00V\x00\x00\x006\x00\x00\x00I\x00\x00\x007\x00\x00\x00N\x00\x00\x00A\x00\x00\x00K\x00\x00\x001\x00\x00\x00L\x00\x00\x00Q\x00\x00\x00H\x00\x00\x00X\x00\x00\x00U\x00\x00\x00O\x00\x00\x00W\x00\x00\x00Z\x00\x00\x006\x00\x00\x00E\x00\x00\x00D\x00\x00\x009\x00\x00\x00R\x00\x00\x00S\x00\x00\x000\x00\x00\x00B\x00\x00\x00J\x00\x00\x007\x00\x00\x00T\x00\x00\x005\x00\x00\x00H\x00\x00\x009\x00\x00\x00O\x00\x00\x00J\x00\x00\x00V\x00\x00\x006\x00\x00\x00M\x00\x00\x001\x00\x00\x00S\x00\x00\x00A\x00\x00\x00P\x00\x00\x00C\x00\x00\x005\x00\x00\x00G\x00\x00\x00W\x00\x00\x000\x00\x00\x00U\x00\x00\x00E\x00\x00\x008\x00\x00\x00I\x00\x00\x00Z\x00\x00\x00Y\x00\x00\x00Q\x00\x00\x00N\x00\x00\x00W\x00\x00\x009\x00\x00\x00V\x00\x00\x00U\x00\x00\x004\x00\x00\x006\x00\x00\x00I\x00\x00\x00F\x00\x00\x00Y\x00\x00\x00P\x00\x00\x00N\x00\x00\x00J\x00\x00\x00X\x00\x00\x00O\x00\x00\x002\x00\x00\x00C\x00\x00\x00A\x00\x00\x001\x00\x00\x007\x00\x00\x00K\x00\x00\x00G\x00\x00\x000\x00\x00\x00D\x00\x00\x00M\x00\x00\x00H\x00\x00\x009\x00\x00\x00M\x00\x00\x00Q\x00\x00\x00F\x00\x00\x001\x00\x00\x00W\x00\x00\x00G\x00\x00\x00V\x00\x00\x000\x00\x00\x00C\x00\x00\x00N\x00\x00\x00I\x00\x00\x008\x00\x00\x00B\x00\x00\x00A\x00\x00\x00L\x00\x00\x00U\x00\x00\x00X\x00\x00\x00S\x00\x00\x00D\x00\x00\x00R\x00\x00\x00Z\x00\x00\x003\x00\x00\x007\x00\x00\x001\x00\x00\x003\x00\x00\x008\x00\x00\x00U\x00\x00\x00S\x00\x00\x005\x00\x00\x00D\x00\x00\x00J\x00\x00\x00M\x00\x00\x00N\x00\x00\x00L\x00\x00\x00X\x00\x00\x00I\x00\x00\x00G\x00\x00\x00T\x00\x00\x00Y\x00\x00\x006\x00\x00\x000\x00\x00\x00W\x00\x00\x00Z\x00\x00\x00P\x00\x00\x004\x00\x00\x009\x00\x00\x001\x00\x00\x004\x00\x00\x003\x00\x00\x006\x00\x00\x008\x00\x00\x00M\x00\x00\x00D\x00\x00\x00V\x00\x00\x00J\x00\x00\x00N\x00\x00\x00R\x00\x00\x00I\x00\x00\x005\x00\x00\x00O\x00\x00\x002\x00\x00\x00S\x00\x00\x00L\x00\x00\x00H\x00\x00\x00U\x00\x00\x00X\x00\x00\x00B\x00\x00\x00Z\x00\x00\x000\x00\x00\x00C\x00\x00\x00H\x00\x00\x001\x00\x00\x00I\x00\x00\x004\x00\x00\x00Y\x00\x00\x00L\x00\x00\x00Z\x00\x00\x00A\x00\x00\x002\x00\x00\x00U\x00\x00\x005\x00\x00\x00D\x00\x00\x009\x00\x00\x00C\x00\x00\x00G\x00\x00\x007\x00\x00\x00J\x00\x00\x00F\x00\x00\x00M\x00\x00\x00X\x00\x00\x00B\x00\x00\x00Q\x00\x00\x00S\x00\x00\x000\x00\x00\x009\x00\x00\x00H\x00\x00\x00G\x00\x00\x00Y\x00\x00\x00O\x00\x00\x006\x00\x00\x001\x00\x00\x007\x00\x00\x00Z\x00\x00\x000\x00\x00\x00F\x00\x00\x00U\x00\x00\x00L\x00\x00\x00V\x00\x00\x00E\x00\x00\x00P\x00\x00\x00S\x00\x00\x00J\x00\x00\x00A\x00\x00\x00X\x00\x00\x00R\x00\x00\x00B\x00\x00\x00W\x00\x00\x00Q\x00\x00\x005\x00\x00\x00T\x00\x00\x00W\x00\x00\x001\x00\x00\x00A\x00\x00\x00P\x00\x00\x008\x00\x00\x00M\x00\x00\x00F\x00\x00\x00D\x00\x00\x006\x00\x00\x00O\x00\x00\x00K\x00\x00\x00J\x00\x00\x00C\x00\x00\x000\x00\x00\x00Q\x00\x00\x00B\x00\x00\x00H\x00\x00\x00I\x00\x00\x002\x00\x00\x00E\x00\x00\x009\x00\x00\x004\x00\x00\x00J\x00\x00\x00D\x00\x00\x00Z\x00\x00\x00R\x00\x00\x006\x00\x00\x00O\x00\x00\x00A\x00\x00\x00W\x00\x00\x003\x00\x00\x001\x00\x00\x00B\x00\x00\x009\x00\x00\x00H\x00\x00\x00G\x00\x00\x002\x00\x00\x007\x00\x00\x00X\x00\x00\x00Y\x00\x00\x00V\x00\x00\x00N\x00\x00\x00E\x00\x00\x00U\x00\x00\x008\x00\x00\x00F\x00\x00\x000\x00\x00\x00E\x00\x00\x00V\x00\x00\x009\x00\x00\x00Y\x00\x00\x00D\x00\x00\x008\x00\x00\x00Q\x00\x00\x005\x00\x00\x00P\x00\x00\x00Z\x00\x00\x00N\x00\x00\x00B\x00\x00\x00G\x00\x00\x00U\x00\x00\x001\x00\x00\x00M\x00\x00\x00X\x00\x00\x00T\x00\x00\x003\x00\x00\x00I\x00\x00\x00A\x00\x00\x00C\x00\x00\x00W\x00\x00\x00G\x00\x00\x00H\x00\x00\x00V\x00\x00\x008\x00\x00\x00T\x00\x00\x00Y\x00\x00\x005\x00\x00\x00I\x00\x00\x00A\x00\x00\x00J\x00\x00\x00C\x00\x00\x00X\x00\x00\x00N\x00\x00\x00U\x00\x00\x00O\x00\x00\x003\x00\x00\x004\x00\x00\x001\x00\x00\x00R\x00\x00\x00P\x00\x00\x00K\x00\x00\x002\x00\x00\x00L\x00\x00\x00M\x00\x00\x00B\x00\x00\x00O\x00\x00\x00W\x00\x00\x00M\x00\x00\x007\x00\x00\x008\x00\x00\x004\x00\x00\x00K\x00\x00\x000\x00\x00\x00U\x00\x00\x00R\x00\x00\x002\x00\x00\x00L\x00\x00\x00J\x00\x00\x001\x00\x00\x00Y\x00\x00\x00P\x00\x00\x00E\x00\x00\x00I\x00\x00\x00V\x00\x00\x00A\x00\x00\x00S\x00\x00\x006\x00\x00\x009\x00\x00\x00F\x00\x00\x004\x00\x00\x000\x00\x00\x007\x00\x00\x008\x00\x00\x00G\x00\x00\x00N\x00\x00\x00B\x00\x00\x00Z\x00\x00\x00E\x00\x00\x00M\x00\x00\x005\x00\x00\x00C\x00\x00\x009\x00\x00\x00D\x00\x00\x00H\x00\x00\x001\x00\x00\x00P\x00\x00\x00U\x00\x00\x00L\x00\x00\x00I\x00\x00\x00T\x00\x00\x00A\x00\x00\x00V\x00\x00\x00T\x00\x00\x00I\x00\x00\x00X\x00\x00\x00P\x00\x00\x00V\x00\x00\x008\x00\x00\x00R\x00\x00\x001\x00\x00\x005\x00\x00\x007\x00\x00\x00N\x00\x00\x00J\x00\x00\x00L\x00\x00\x006\x00\x00\x00E\x00\x00\x00Y\x00\x00\x00B\x00\x00\x00D\x00\x00\x00U\x00\x00\x00F\x00\x00\x00O\x00\x00\x00W\x00\x00\x00M\x00\x00\x00G\x00\x00\x00B\x00\x00\x00H\x00\x00\x00S\x00\x00\x00O\x00\x00\x000\x00\x00\x00F\x00\x00\x00V\x00\x00\x00Z\x00\x00\x00E\x00\x00\x005\x00\x00\x004\x00\x00\x00Y\x00\x00\x006\x00\x00\x009\x00\x00\x00Q\x00\x00\x00R\x00\x00\x001\x00\x00\x00D\x00\x00\x00I\x00\x00\x003\x00\x00\x00M\x00\x00\x00P\x00\x00\x00G\x00\x00\x00U\x00\x00\x00Q\x00\x00\x008\x00\x00\x002\x00\x00\x00J\x00\x00\x00X\x00\x00\x00T\x00\x00\x00V\x00\x00\x000\x00\x00\x00W\x00\x00\x007\x00\x00\x004\x00\x00\x00A\x00\x00\x00S\x00\x00\x00Y\x00\x00\x003\x00\x00\x00U\x00\x00\x00R\x00\x00\x00O\x00\x00\x00G\x00\x00\x00Z\x00\x00\x00F\x00\x00\x00B\x00\x00\x005\x00\x00\x00E\x00\x00\x00O\x00\x00\x00E\x00\x00\x007\x00\x00\x00Z\x00\x00\x00K\x00\x00\x003\x00\x00\x00G\x00\x00\x00U\x00\x00\x00P\x00\x00\x00Y\x00\x00\x00T\x00\x00\x00W\x00\x00\x00A\x00\x00\x00F\x00\x00\x00J\x00\x00\x00X\x00\x00\x004\x00\x00\x00I\x00\x00\x002\x00\x00\x00R\x00\x00\x00Q\x00\x00\x00L\x00\x00\x00N\x00\x00\x009\x00\x00\x00N\x00\x00\x00E\x00\x00\x00J\x00\x00\x00H\x00\x00\x00C\x00\x00\x001\x00\x00\x00O\x00\x00\x00F\x00\x00\x00S\x00\x00\x00B\x00\x00\x00M\x00\x00\x00I\x00\x00\x00D\x00\x00\x00U\x00\x00\x003\x00\x00\x00P\x00\x00\x00V\x00\x00\x002\x00\x00\x007\x00\x00\x00Q\x00\x00\x009\x00\x00\x006\x00\x00\x00Y\x00\x00\x00W\x00\x00\x00T\x00\x00\x00M\x00\x00\x00B\x00\x00\x00J\x00\x00\x009\x00\x00\x005\x00\x00\x00Z\x00\x00\x00I\x00\x00\x00S\x00\x00\x00Q\x00\x00\x000\x00\x00\x00L\x00\x00\x004\x00\x00\x00Y\x00\x00\x00W\x00\x00\x00K\x00\x00\x00V\x00\x00\x00N\x00\x00\x007\x00\x00\x00U\x00\x00\x00C\x00\x00\x002\x00\x00\x00F\x00\x00\x006\x00\x00\x00S\x00\x00\x006\x00\x00\x00Z\x00\x00\x00H\x00\x00\x00Q\x00\x00\x004\x00\x00\x00C\x00\x00\x00Y\x00\x00\x00M\x00\x00\x00D\x00\x00\x003\x00\x00\x009\x00\x00\x000\x00\x00\x00E\x00\x00\x008\x00\x00\x00B\x00\x00\x00A\x00\x00\x00O\x00\x00\x00K\x00\x00\x00N\x00\x00\x00V\x00\x00\x00F\x00\x00\x007\x00\x00\x00J\x00\x00\x00X\x00\x00\x006\x00\x00\x005\x00\x00\x009\x00\x00\x00Z\x00\x00\x007\x00\x00\x003\x00\x00\x00M\x00\x00\x00C\x00\x00\x00D\x00\x00\x00I\x00\x00\x00N\x00\x00\x00O\x00\x00\x00K\x00\x00\x004\x00\x00\x00T\x00\x00\x00J\x00\x00\x00F\x00\x00\x001\x00\x00\x00G\x00\x00\x00S\x00\x00\x00W\x00\x00\x00H\x00\x00\x00E\x00\x00\x00L\x00\x00\x00G\x00\x00\x004\x00\x00\x00E\x00\x00\x002\x00\x00\x006\x00\x00\x005\x00\x00\x00F\x00\x00\x00X\x00\x00\x008\x00\x00\x00N\x00\x00\x00V\x00\x00\x00Z\x00\x00\x00I\x00\x00\x009\x00\x00\x00T\x00\x00\x00S\x00\x00\x00C\x00\x00\x003\x00\x00\x00K\x00\x00\x00P\x00\x00\x007\x00\x00\x00H\x00\x00\x00D\x00\x00\x004\x00\x00\x00R\x00\x00\x00D\x00\x00\x002\x00\x00\x00S\x00\x00\x00N\x00\x00\x00J\x00\x00\x00A\x00\x00\x008\x00\x00\x005\x00\x00\x00O\x00\x00\x00I\x00\x00\x006\x00\x00\x009\x00\x00\x00L\x00\x00\x00X\x00\x00\x00C\x00\x00\x00T\x00\x00\x00E\x00\x00\x00P\x00\x00\x007\x00\x00\x00W\x00\x00\x00M\x00\x00\x001\x00\x00\x00M\x00\x00\x00T\x00\x00\x00G\x00\x00\x00K\x00\x00\x000\x00\x00\x00Q\x00\x00\x003\x00\x00\x005\x00\x00\x00Z\x00\x00\x00W\x00\x00\x00R\x00\x00\x00A\x00\x00\x00E\x00\x00\x00P\x00\x00\x00V\x00\x00\x00F\x00\x00\x00J\x00\x00\x00H\x00\x00\x00Y\x00\x00\x002\x00\x00\x00S\x00\x00\x00X\x00\x00\x00L\x00\x00\x00D\x00\x00\x00D\x00\x00\x00Z\x00\x00\x00C\x00\x00\x00I\x00\x00\x00T\x00\x00\x007\x00\x00\x00W\x00\x00\x00M\x00\x00\x00K\x00\x00\x00N\x00\x00\x002\x00\x00\x00F\x00\x00\x000\x00\x00\x00R\x00\x00\x003\x00\x00\x00P\x00\x00\x00Y\x00\x00\x00Q\x00\x00\x00O\x00\x00\x00S\x00\x00\x00E\x00\x00\x001\x00\x00\x006\x00\x00\x009\x00\x00\x00U\x00\x00\x00T\x00\x00\x00C\x00\x00\x00O\x00\x00\x006\x00\x00\x00V\x00\x00\x00W\x00\x00\x00X\x00\x00\x00G\x00\x00\x00Y\x00\x00\x000\x00\x00\x008\x00\x00\x002\x00\x00\x00J\x00\x00\x00A\x00\x00\x00M\x00\x00\x00Z\x00\x00\x00K\x00\x00\x005\x00\x00\x001\x00\x00\x003\x00\x00\x00F\x00\x00\x00B\x00\x00\x00E\x00\x00\x000\x00\x00\x00A\x00\x00\x00G\x00\x00\x00E\x00\x00\x00D\x00\x00\x006\x00\x00\x00I\x00\x00\x00R\x00\x00\x00Z\x00\x00\x00H\x00\x00\x00O\x00\x00\x00V\x00\x00\x00T\x00\x00\x00W\x00\x00\x001\x00\x00\x00N\x00\x00\x00Q\x00\x00\x00J\x00\x00\x00S\x00\x00\x00M\x00\x00\x00P\x00\x00\x00X\x00\x00\x002\x00\x00\x00F\x00\x00\x00N\x00\x00\x00H\x00\x00\x00J\x00\x00\x009\x00\x00\x00G\x00\x00\x002\x00\x00\x00V\x00\x00\x007\x00\x00\x00L\x00\x00\x00K\x00\x00\x00Y\x00\x00\x00I\x00\x00\x003\x00\x00\x00D\x00\x00\x00M\x00\x00\x00R\x00\x00\x00P\x00\x00\x00C\x00\x00\x00T\x00\x00\x004\x00\x00\x00X\x00\x00\x008\x00\x00\x00A\x00\x00\x005\x00\x00\x005\x00\x00\x002\x00\x00\x00Q\x00\x00\x003\x00\x00\x00Y\x00\x00\x007\x00\x00\x00J\x00\x00\x00Z\x00\x00\x00P\x00\x00\x00X\x00\x00\x00D\x00\x00\x00L\x00\x00\x00F\x00\x00\x00B\x00\x00\x008\x00\x00\x009\x00\x00\x00U\x00\x00\x00K\x00\x00\x00G\x00\x00\x00E\x00\x00\x00O\x00\x00\x00V\x00\x00\x00H\x00\x00\x000\x00\x00\x007\x00\x00\x00S\x00\x00\x000\x00\x00\x00B\x00\x00\x00A\x00\x00\x00D\x00\x00\x00P\x00\x00\x00J\x00\x00\x003\x00\x00\x00U\x00\x00\x00F\x00\x00\x00I\x00\x00\x00X\x00\x00\x004\x00\x00\x00H\x00\x00\x009\x00\x00\x00T\x00\x00\x005\x00\x00\x00O\x00\x00\x00Y\x00\x00\x00E\x00\x00\x00G\x00\x00\x00K\x00\x00\x00R\x00\x00\x00V\x00\x00\x00R\x00\x00\x00L\x00\x00\x00F\x00\x00\x00U\x00\x00\x00H\x00\x00\x005\x00\x00\x00J\x00\x00\x00K\x00\x00\x00S\x00\x00\x00N\x00\x00\x00B\x00\x00\x00E\x00\x00\x00W\x00\x00\x006\x00\x00\x00I\x00\x00\x00X\x00\x00\x00C\x00\x00\x00A\x00\x00\x007\x00\x00\x00T\x00\x00\x004\x00\x00\x00Z\x00\x00\x00P\x00\x00\x00Y\x00\x00\x00Z\x00\x00\x00S\x00\x00\x004\x00\x00\x006\x00\x00\x00W\x00\x00\x00K\x00\x00\x00V\x00\x00\x003\x00\x00\x00O\x00\x00\x00U\x00\x00\x005\x00\x00\x00R\x00\x00\x008\x00\x00\x00T\x00\x00\x00I\x00\x00\x00H\x00\x00\x00C\x00\x00\x001\x00\x00\x00D\x00\x00\x00A\x00\x00\x002\x00\x00\x00L\x00\x00\x000\x00\x00\x00G\x00\x00\x009\x00\x00\x00X\x00\x00\x00Z\x00\x00\x00I\x00\x00\x005\x00\x00\x00T\x00\x00\x00E\x00\x00\x00D\x00\x00\x003\x00\x00\x00J\x00\x00\x00C\x00\x00\x00U\x00\x00\x00S\x00\x00\x001\x00\x00\x00F\x00\x00\x00A\x00\x00\x00M\x00\x00\x007\x00\x00\x00R\x00\x00\x00V\x00\x00\x00B\x00\x00\x006\x00\x00\x00P' u32 = lambda x: struct.unpack(">I", x)[0] ## bin4 # Please keep in mind: this was a binary with a little-endian architecture # the given u32 will unpack a 4-byte little-endian value if given 4 bytes u32 = lambda x: struct.unpack("