eflags: Add toggle option

This commit is contained in:
Grazfather 2016-08-25 15:47:04 +00:00
parent 133e875ab3
commit c3e2105662
1 changed files with 17 additions and 11 deletions

28
peda.py
View File

@ -1186,9 +1186,9 @@ class PEDA(object):
return flags return flags
def set_eflags(self, flagname, value=True): def set_eflags(self, flagname, value):
""" """
Set/clear value of a flag register Set/clear/toggle value of a flag register
Returns: Returns:
- True if success (Bool) - True if success (Bool)
@ -1208,6 +1208,8 @@ class PEDA(object):
flags = {"carry": "CF", "parity": "PF", "adjust": "AF", "zero": "ZF", "sign": "SF", flags = {"carry": "CF", "parity": "PF", "adjust": "AF", "zero": "ZF", "sign": "SF",
"trap": "TF", "interrupt": "IF", "direction": "DF", "overflow": "OF"} "trap": "TF", "interrupt": "IF", "direction": "DF", "overflow": "OF"}
flagname = flagname.lower()
if flagname not in flags: if flagname not in flags:
return False return False
@ -1215,7 +1217,8 @@ class PEDA(object):
if not eflags: if not eflags:
return False return False
if eflags[flags[flagname]] != value: # switch value # If value doesn't match the current, or we want to toggle, toggle
if value is None or eflags[flags[flagname]] != value:
reg_eflags = self.getreg("eflags") reg_eflags = self.getreg("eflags")
reg_eflags ^= eval("EFLAGS_%s" % flags[flagname]) reg_eflags ^= eval("EFLAGS_%s" % flags[flagname])
result = self.execute("set $eflags = 0x%x" % reg_eflags) result = self.execute("set $eflags = 0x%x" % reg_eflags)
@ -4764,10 +4767,10 @@ class PEDACmd(object):
def eflags(self, *arg): def eflags(self, *arg):
""" """
Display/set/clear value of eflags register Display/set/clear/toggle value of eflags register
Usage: Usage:
MYNAME MYNAME
MYNAME [set|clear] flagname MYNAME [set|clear|toggle] flagname
""" """
FLAGS = ["CF", "PF", "AF", "ZF", "SF", "TF", "IF", "DF", "OF"] FLAGS = ["CF", "PF", "AF", "ZF", "SF", "TF", "IF", "DF", "OF"]
FLAGS_TEXT = ["Carry", "Parity", "Adjust", "Zero", "Sign", "Trap", FLAGS_TEXT = ["Carry", "Parity", "Adjust", "Zero", "Sign", "Trap",
@ -4777,10 +4780,10 @@ class PEDACmd(object):
if not self._is_running(): if not self._is_running():
return return
if option and not flagname: elif option and not flagname:
self._missing_argument() self._missing_argument()
if option is None: # display eflags elif option is None: # display eflags
flags = peda.get_eflags() flags = peda.get_eflags()
text = "" text = ""
for (i, f) in enumerate(FLAGS): for (i, f) in enumerate(FLAGS):
@ -4792,14 +4795,17 @@ class PEDACmd(object):
eflags = peda.getreg("eflags") eflags = peda.getreg("eflags")
msg("%s: 0x%x (%s)" % (green("EFLAGS"), eflags, text.strip())) msg("%s: 0x%x (%s)" % (green("EFLAGS"), eflags, text.strip()))
if option == "set": elif option == "set":
peda.set_eflags(flagname.lower()) peda.set_eflags(flagname, True)
if option == "clear": elif option == "clear":
peda.set_eflags(flagname, False) peda.set_eflags(flagname, False)
elif option == "toggle":
peda.set_eflags(flagname, None)
return return
eflags.options = ["set", "clear"] eflags.options = ["set", "clear", "toggle"]
def xinfo(self, *arg): def xinfo(self, *arg):
""" """