1*4f1223e8SApple OSS Distributionsfrom ioreg import * 2*4f1223e8SApple OSS Distributions 3*4f1223e8SApple OSS Distributions@lldb_command("shownvram") 4*4f1223e8SApple OSS Distributionsdef PrintNvramVars(cmd_args=[]): 5*4f1223e8SApple OSS Distributions """ 6*4f1223e8SApple OSS Distributions Print NVRAM variables. 7*4f1223e8SApple OSS Distributions """ 8*4f1223e8SApple OSS Distributions dt_plane = GetRegistryPlane("IODeviceTree") 9*4f1223e8SApple OSS Distributions if dt_plane is None: 10*4f1223e8SApple OSS Distributions raise ValueError("Couldn't obtain a pointer to IODeviceTree") 11*4f1223e8SApple OSS Distributions 12*4f1223e8SApple OSS Distributions # Registry API functions operate on "plane" global variable 13*4f1223e8SApple OSS Distributions global plane 14*4f1223e8SApple OSS Distributions prev_plane = plane 15*4f1223e8SApple OSS Distributions plane = dt_plane 16*4f1223e8SApple OSS Distributions options = FindRegistryObjectRecurse(kern.globals.gRegistryRoot, "options") 17*4f1223e8SApple OSS Distributions # Restore original plane after getting options 18*4f1223e8SApple OSS Distributions plane = prev_plane 19*4f1223e8SApple OSS Distributions if options is None: 20*4f1223e8SApple OSS Distributions print("Couldn't obtain options IORegistryEntry") 21*4f1223e8SApple OSS Distributions return 22*4f1223e8SApple OSS Distributions 23*4f1223e8SApple OSS Distributions var_dict = kern.GetValueFromAddress('((IODTNVRAM*)' + hex(options) + ')->_varDict', 'OSDictionary *') 24*4f1223e8SApple OSS Distributions if var_dict is None: 25*4f1223e8SApple OSS Distributions print("Couldn't obtain varDict") 26*4f1223e8SApple OSS Distributions return 27*4f1223e8SApple OSS Distributions 28*4f1223e8SApple OSS Distributions for x in range(var_dict.count): 29*4f1223e8SApple OSS Distributions name = var_dict.dictionary[x].key.string 30*4f1223e8SApple OSS Distributions value = var_dict.dictionary[x].value 31*4f1223e8SApple OSS Distributions 32*4f1223e8SApple OSS Distributions # get value type 33*4f1223e8SApple OSS Distributions value_info = GetObjectTypeStr(value) 34*4f1223e8SApple OSS Distributions if value_info is None: 35*4f1223e8SApple OSS Distributions print("Couldn't obtain object type for name:", name, "value:", value) 36*4f1223e8SApple OSS Distributions continue 37*4f1223e8SApple OSS Distributions srch = re.search(r'vtable for ([A-Za-z].*)', value_info) 38*4f1223e8SApple OSS Distributions if not srch: 39*4f1223e8SApple OSS Distributions print("Couldn't find type in value_info:", value_info) 40*4f1223e8SApple OSS Distributions continue 41*4f1223e8SApple OSS Distributions value_type = srch.group(1) 42*4f1223e8SApple OSS Distributions 43*4f1223e8SApple OSS Distributions if (value_type == 'OSString'): 44*4f1223e8SApple OSS Distributions print(name, '=', GetString(value)) 45*4f1223e8SApple OSS Distributions elif (value_type == 'OSData'): 46*4f1223e8SApple OSS Distributions data_ptr = Cast(value.data, 'uint8_t *') 47*4f1223e8SApple OSS Distributions print (name, '= ', end ='') 48*4f1223e8SApple OSS Distributions data_buffer = "" 49*4f1223e8SApple OSS Distributions for i in range(value.length): 50*4f1223e8SApple OSS Distributions if ((data_ptr[i] >= 0x20 and data_ptr[i] <= 0x7e) and chr(data_ptr[i]) != '%'): 51*4f1223e8SApple OSS Distributions data_buffer += chr(data_ptr[i]) 52*4f1223e8SApple OSS Distributions else: 53*4f1223e8SApple OSS Distributions data_buffer += "%%%02x" % data_ptr[i] 54*4f1223e8SApple OSS Distributions print (data_buffer) 55*4f1223e8SApple OSS Distributions elif (value_type == 'OSNumber'): 56*4f1223e8SApple OSS Distributions print(name, '=', GetNumber(value)) 57*4f1223e8SApple OSS Distributions elif (value_type == 'OSBoolean'): 58*4f1223e8SApple OSS Distributions print(name, '=', GetBoolean(value)) 59*4f1223e8SApple OSS Distributions else: 60*4f1223e8SApple OSS Distributions print("Invalid type:", value_type)