Skip to content

Commit 86d6860

Browse files
committed
CMD: add command to save function/gvar names in userdata format
1 parent eaed5a5 commit 86d6860

File tree

3 files changed

+55
-0
lines changed

3 files changed

+55
-0
lines changed

chb/cmdline/chkx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -579,6 +579,13 @@ def parse() -> argparse.Namespace:
579579
ddatagvars.add_argument("xname", help="name of executable")
580580
ddatagvars.set_defaults(func=UCC.ddata_gvars)
581581

582+
# -- ddata userdata --
583+
ddatauserdata = ddataparsers.add_parser("userdata")
584+
ddatauserdata.add_argument("xname", help="name of executable")
585+
ddatauserdata.add_argument(
586+
"--output", "-o", required=True, help="name of file to save results")
587+
ddatauserdata.set_defaults(func=UCC.ddata_userdata)
588+
582589
# -- ddata md5s --
583590
ddatamd5s = ddataparsers.add_parser("md5s")
584591
ddatamd5s.add_argument("xname", help="name of executable")

chb/cmdline/commandutil.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2530,6 +2530,52 @@ def ddata_gvars(args: argparse.Namespace) -> NoReturn:
25302530
exit(0)
25312531

25322532

2533+
def ddata_userdata(args: argparse.Namespace) -> NoReturn:
2534+
2535+
# arguments
2536+
xname: str = str(args.xname)
2537+
xoutput: str = str(args.output)
2538+
2539+
try:
2540+
(path, xfile) = get_path_filename(xname)
2541+
except UF.CHBError as e:
2542+
print(str(e.wrap()))
2543+
exit(1)
2544+
2545+
xinfo = XI.XInfo()
2546+
xinfo.load(path, xfile)
2547+
2548+
app = get_app(path, xfile, xinfo)
2549+
2550+
result: Dict[str, Dict[str, Dict[str, str]]] = {}
2551+
userdata = result["userdata"] = {}
2552+
fnnames = userdata["function-names"] = {}
2553+
symaddrs = userdata["symbolic-addresses"] = {}
2554+
2555+
functionsdata = app.systeminfo.functionsdata.functions
2556+
for (faddr, fdata) in sorted(functionsdata.items(), key=lambda t: int(t[0], 16)):
2557+
if fdata.has_name():
2558+
fnnames[faddr] = fdata.name
2559+
2560+
memmap = app.globalmemorymap
2561+
glocs = memmap.locations
2562+
for gaddr in sorted(glocs, key=lambda g: int(g, 16)):
2563+
gloc = glocs[gaddr]
2564+
if gloc.gtype is not None:
2565+
symaddrs[gaddr] = gloc.name
2566+
2567+
with open(xoutput, "w") as fp:
2568+
json.dump(result, fp, indent=4)
2569+
2570+
print("\nSaved userdata with "
2571+
+ str(len(fnnames))
2572+
+ " function names and "
2573+
+ str(len(symaddrs))
2574+
+ " symbolic addresses")
2575+
2576+
exit(0)
2577+
2578+
25332579
def ddata_md5s(args: argparse.Namespace) -> NoReturn:
25342580

25352581
# arguments

chb/invariants/XXpr.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1035,6 +1035,8 @@ def __str__(self) -> str:
10351035
if self.operator in xpr_operator_strings:
10361036
return (
10371037
"(" + xpr_operator_strings[self.operator] + str(args[0]) + ")")
1038+
elif self.operator == "xf_addressofvar":
1039+
return "&(" + str(args[0]) + ")"
10381040
else:
10391041
return "(" + self.operator + " " + str(args[0]) + ")"
10401042
elif len(args) == 2:

0 commit comments

Comments
 (0)