Skip to content

Commit

Permalink
Merge pull request #20 from Calastrophe/main
Browse files Browse the repository at this point in the history
Added support for setting/getting flags in Registers()
  • Loading branch information
mrexodia authored Sep 21, 2022
2 parents c4136b0 + 429dd25 commit 152ae19
Showing 1 changed file with 34 additions and 0 deletions.
34 changes: 34 additions & 0 deletions src/dumpulator/details.py
Original file line number Diff line number Diff line change
Expand Up @@ -310,6 +310,25 @@ def __init__(self, uc: Uc, x64):
"cdi": UC_X86_REG_EDI,
"cip": UC_X86_REG_EIP,
})
self._flagposdict = {
"cf": 0,
"pf": 1,
"af": 3,
"zf": 5,
"sf": 6,
"tf": 7,
"if": 8,
"df": 9,
"of": 10,
"iopl": 12,
"nt": 13,
"rf": 15,
"vm": 16,
"ac": 17,
"vif": 18,
"vip": 19,
"id": 20
}

def _resolve_reg(self, regname):
uc_reg = self._regmap.get(regname, None)
Expand All @@ -320,11 +339,25 @@ def _resolve_reg(self, regname):
return uc_reg

def __getattr__(self, name: str):
if name in self._flagposdict:
eflags = self._uc.reg_read(self._resolve_reg("eflags"))
return (eflags >> self._flagposdict[name]) & 1
return self._uc.reg_read(self._resolve_reg(name))

def __setattr__(self, name: str, value):
if name.startswith("_"):
object.__setattr__(self, name, value)
elif name in self._flagposdict: # For setting specific flags
resolved_reg = self._resolve_reg("eflags")
holder = self._uc.reg_read(resolved_reg)
if value == 0:
repl_value = holder & ~(1 << self._flagposdict[name])
self._uc.reg_write(resolved_reg, repl_value)
elif value == 1:
repl_value = holder | (1 << self._flagposdict[name])
self._uc.reg_write(resolved_reg, repl_value)
else:
raise Exception(f"Attempted to improperly set flag '{name}'")
else:
self._uc.reg_write(self._resolve_reg(name), value)

Expand Down Expand Up @@ -528,3 +561,4 @@ def __setitem__(self, index, value):
"Reserved"
]
assert len(interrupt_names) == 32

0 comments on commit 152ae19

Please sign in to comment.