def parse_script( script, log_script=False ): off = 0 entry_type = 0 s3_boot_script_entries = [] len_s = len(script) if log_script: logger().log( '[uefi] +++ S3 Resume Boot-Script +++\n' ) script_type,script_header_length = uefi_platform.id_s3bootscript_type( script, log_script ) off += script_header_length while (off < len_s) and (entry_type != S3BootScriptOpcode.EFI_BOOT_SCRIPT_TERMINATE_OPCODE): entry_type,s3script_entry = uefi_platform.parse_s3bootscript_entry( script_type, script, off, log_script ) # couldn't parse the next entry - return what has been parsed so far if s3script_entry is None: return s3_boot_script_entries s3_boot_script_entries.append( s3script_entry ) off += s3script_entry.length if log_script: logger().log( '[uefi] +++ End of S3 Resume Boot-Script +++' ) if logger().HAL: logger().log( '[uefi] S3 Resume Boot-Script size: 0x%X' % off ) if logger().VERBOSE: logger().log( '\n[uefi] [++++++++++ S3 Resume Boot-Script Buffer ++++++++++]' ) print_buffer( script[ : off ] ) return s3_boot_script_entries
def modify_s3_add(self, new_opcode): e_index = None (bootscript_PAs, parsed_scripts) = self.get_bootscript() if parsed_scripts is None: self.logger.log_bad("Did not find boot script.") return False for bootscript_pa in bootscript_PAs: if (bootscript_pa == 0): continue script_buffer = self.cs.mem.read_physical_mem(bootscript_pa, 4) script_type, hdr_len = id_s3bootscript_type(script_buffer, False) self.logger.log( "[*] S3 boot script type: 0x{:0X}".format(script_type)) self.logger.log( "[*] Looking for TERMINATE opcode in the script at 0x{:016X}.." .format(bootscript_pa)) for e in parsed_scripts[bootscript_pa]: if e.index is not None and e.index != -1: e_index = e.index + 1 if e.decoded_opcode is not None and S3BootScriptOpcode.EFI_BOOT_SCRIPT_TERMINATE_OPCODE == e.decoded_opcode.opcode: self.logger.log_good( "Found TERMINATE opcode at offset 0x{:X}".format( e.offset_in_script)) self.logger.log(e) pa = bootscript_pa + e.offset_in_script orig_entry_buf = self.cs.mem.read_physical_mem( pa, e.length) #print_buffer( orig_entry_buf ) self.logger.log("[*] New S3 boot script opcode:") self.logger.log(new_opcode) self.logger.log( "[*] Adding new opcode entry at address 0x{:016X}..". format(pa)) new_entry = create_s3bootscript_entry_buffer( script_type, new_opcode, e_index) print_buffer(new_entry) self.cs.mem.write_physical_mem(pa, len(new_entry), new_entry) last_entry_pa = pa + len(new_entry) self.logger.log( "[*] Moving TERMINATE opcode to the last entry at 0x{:016X}.." .format(last_entry_pa)) self.cs.mem.write_physical_mem(last_entry_pa, len(orig_entry_buf), orig_entry_buf) return True self.logger.log_bad("Did not find TERMINATE opcode") return False