| 3750 | return |
| 3751 | |
| 3752 | class InspectionShell(cmd.Cmd): |
| 3753 | def __init__(self, reader, heap): |
| 3754 | cmd.Cmd.__init__(self) |
| 3755 | self.reader = reader |
| 3756 | self.heap = heap |
| 3757 | self.padawan = InspectionPadawan(reader, heap) |
| 3758 | self.prompt = "(grok) " |
| 3759 | |
| 3760 | self.dd_start = 0 |
| 3761 | self.dd_num = 0x10 |
| 3762 | self.u_start = 0 |
| 3763 | self.u_num = 0 |
| 3764 | |
| 3765 | def EvalExpression(self, expr): |
| 3766 | # Auto convert hex numbers to a python compatible format |
| 3767 | if expr[:2] == "00": |
| 3768 | expr = "0x"+expr |
| 3769 | result = None |
| 3770 | try: |
| 3771 | # Ugly hack to patch in register values. |
| 3772 | registers = [register |
| 3773 | for register,value in self.reader.ContextDescriptor().fields] |
| 3774 | registers.sort(key=lambda r: len(r)) |
| 3775 | registers.reverse() |
| 3776 | for register in registers: |
| 3777 | expr = expr.replace("$"+register, str(self.reader.Register(register))) |
| 3778 | result = eval(expr) |
| 3779 | except Exception as e: |
| 3780 | print("**** Could not evaluate '%s': %s" % (expr, e)) |
| 3781 | raise e |
| 3782 | return result |
| 3783 | |
| 3784 | def ParseAddressExpr(self, expr): |
| 3785 | address = 0; |
| 3786 | try: |
| 3787 | result = self.EvalExpression(expr) |
| 3788 | except: |
| 3789 | return 0 |
| 3790 | try: |
| 3791 | address = int(result) |
| 3792 | except Exception as e: |
| 3793 | print("**** Could not convert '%s' => %s to valid address: %s" % ( |
| 3794 | expr, result , e)) |
| 3795 | return address |
| 3796 | |
| 3797 | def do_help(self, cmd=None): |
| 3798 | if len(cmd) == 0: |
| 3799 | print("Available commands") |
| 3800 | print("=" * 79) |
| 3801 | prefix = "do_" |
| 3802 | methods = inspect.getmembers(InspectionShell, predicate=inspect.ismethod) |
| 3803 | for name,method in methods: |
| 3804 | if not name.startswith(prefix): continue |
| 3805 | doc = inspect.getdoc(method) |
| 3806 | if not doc: continue |
| 3807 | name = prefix.join(name.split(prefix)[1:]) |
| 3808 | description = doc.splitlines()[0] |
| 3809 | print((name + ": ").ljust(16) + description) |