예제 #1
0
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
예제 #2
0
    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