Default value for print-format command.
(self, _: List[str], **kwargs: Any)
| 4647 | @only_if_gdb_running |
| 4648 | @parse_arguments({"location": "$pc", }, {("--length", "-l"): 256, "--bitlen": 0, "--lang": "py", "--clip": True,}) |
| 4649 | def do_invoke(self, _: List[str], **kwargs: Any) -> None: |
| 4650 | """Default value for print-format command.""" |
| 4651 | args: argparse.Namespace = kwargs["arguments"] |
| 4652 | args.bitlen = args.bitlen or gef.arch.ptrsize * 2 |
| 4653 | |
| 4654 | valid_bitlens = self.format_matrix.keys() |
| 4655 | if args.bitlen not in valid_bitlens: |
| 4656 | err(f"Size of bit must be in: {valid_bitlens!s}") |
| 4657 | return |
| 4658 | |
| 4659 | if args.lang not in self.valid_formats: |
| 4660 | err(f"Language must be in: {self.valid_formats!s}") |
| 4661 | return |
| 4662 | |
| 4663 | start_addr = parse_address(args.location) |
| 4664 | size = int(args.bitlen / 8) |
| 4665 | end_addr = start_addr + args.length * size |
| 4666 | fmt = self.format_matrix[args.bitlen][0] |
| 4667 | data = [] |
| 4668 | |
| 4669 | if args.lang != "bytearray": |
| 4670 | for addr in range(start_addr, end_addr, size): |
| 4671 | value = struct.unpack(fmt, gef.memory.read(addr, size))[0] |
| 4672 | data += [value] |
| 4673 | sdata = ", ".join(map(hex, data)) |
| 4674 | |
| 4675 | if args.lang == "bytearray": |
| 4676 | data = gef.memory.read(start_addr, args.length) |
| 4677 | preview = str(data[0:self["max_size_preview"]]) |
| 4678 | out = f"Saved data {preview}... in '{gef_convenience(data)}'" |
| 4679 | elif args.lang == "py": |
| 4680 | out = f"buf = [{sdata}]" |
| 4681 | elif args.lang == "c": |
| 4682 | c_type = self.format_matrix[args.bitlen][1] |
| 4683 | out = f"unsigned {c_type} buf[{args.length}] = {{{sdata}}};" |
| 4684 | elif args.lang == "js": |
| 4685 | out = f"var buf = [{sdata}]" |
| 4686 | elif args.lang == "asm": |
| 4687 | asm_type = self.format_matrix[args.bitlen][2] |
| 4688 | out = "buf {0} {1}".format(asm_type, sdata) |
| 4689 | elif args.lang == "hex": |
| 4690 | out = binascii.hexlify(gef.memory.read(start_addr, end_addr-start_addr)).decode() |
| 4691 | else: |
| 4692 | raise ValueError(f"Invalid format: {args.lang}") |
| 4693 | |
| 4694 | if args.clip: |
| 4695 | if copy_to_clipboard(gef_pybytes(out)): |
| 4696 | info("Copied to clipboard") |
| 4697 | else: |
| 4698 | warn("There's a problem while copying") |
| 4699 | |
| 4700 | gef_print(out) |
| 4701 | return |
| 4702 | |
| 4703 | |
| 4704 | @register |
nothing calls this directly
no test coverage detected