Add some verbose debugging to psmap to aid in tracking values inside DLLs.
This commit is contained in:
parent
5941a98b66
commit
bcfd4fcf24
@ -1,5 +1,7 @@
|
|||||||
import argparse
|
import argparse
|
||||||
|
import os
|
||||||
import struct
|
import struct
|
||||||
|
import sys
|
||||||
from typing import List
|
from typing import List
|
||||||
|
|
||||||
from bemani.common import PEFile
|
from bemani.common import PEFile
|
||||||
@ -7,7 +9,7 @@ from bemani.protocol import Node
|
|||||||
from bemani.utils.responsegen import generate_lines
|
from bemani.utils.responsegen import generate_lines
|
||||||
|
|
||||||
|
|
||||||
def parse_psmap(data: bytes, offset: str, rootname: str) -> Node:
|
def parse_psmap(data: bytes, offset: str, rootname: str, *, verbose: bool = False) -> Node:
|
||||||
pe = PEFile(data=data)
|
pe = PEFile(data=data)
|
||||||
root = Node.void(rootname)
|
root = Node.void(rootname)
|
||||||
base = int(offset, 16)
|
base = int(offset, 16)
|
||||||
@ -34,6 +36,7 @@ def parse_psmap(data: bytes, offset: str, rootname: str) -> Node:
|
|||||||
saved_loc: List[int] = []
|
saved_loc: List[int] = []
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
|
readbase = base
|
||||||
if pe.is_64bit(): # 64 bit
|
if pe.is_64bit(): # 64 bit
|
||||||
chunk = data[base:(base + 24)]
|
chunk = data[base:(base + 24)]
|
||||||
base = base + 24
|
base = base + 24
|
||||||
@ -64,6 +67,23 @@ def parse_psmap(data: bytes, offset: str, rootname: str) -> Node:
|
|||||||
except ValueError:
|
except ValueError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
# Grab the default
|
||||||
|
if defaultptr != 0:
|
||||||
|
defaultptr = pe.virtual_to_physical(defaultptr)
|
||||||
|
|
||||||
|
if verbose:
|
||||||
|
space = " " * len(saved_root)
|
||||||
|
print(
|
||||||
|
f"{space}Node offset: {hex(readbase)}{os.linesep}"
|
||||||
|
f"{space} Type: {hex(nodetype)}{os.linesep}"
|
||||||
|
f"{space} Mandatory: {'yes' if mandatory != 0 else 'no'}{os.linesep}"
|
||||||
|
f"{space} Name: {name}{os.linesep}"
|
||||||
|
f"{space} Parse Offset: {outoffset}{os.linesep}"
|
||||||
|
f"{space} Data Width: {width}{os.linesep}"
|
||||||
|
f"{space} Default Pointer: {'null' if defaultptr == 0 else hex(defaultptr)}",
|
||||||
|
file=sys.stderr,
|
||||||
|
)
|
||||||
|
|
||||||
if nodetype == 0x01:
|
if nodetype == 0x01:
|
||||||
# This is a void node, so we should handle by recursing
|
# This is a void node, so we should handle by recursing
|
||||||
node = Node.void(name)
|
node = Node.void(name)
|
||||||
@ -74,7 +94,7 @@ def parse_psmap(data: bytes, offset: str, rootname: str) -> Node:
|
|||||||
|
|
||||||
if defaultptr != 0:
|
if defaultptr != 0:
|
||||||
saved_loc.append(base)
|
saved_loc.append(base)
|
||||||
base = pe.virtual_to_physical(defaultptr)
|
base = defaultptr
|
||||||
else:
|
else:
|
||||||
saved_loc.append(None)
|
saved_loc.append(None)
|
||||||
|
|
||||||
@ -210,13 +230,19 @@ def main() -> None:
|
|||||||
type=str,
|
type=str,
|
||||||
default="root",
|
default="root",
|
||||||
)
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"--verbose",
|
||||||
|
help="Display verbose parsing info.",
|
||||||
|
action="store_true",
|
||||||
|
default=False,
|
||||||
|
)
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
fp = open(args.file, 'rb')
|
fp = open(args.file, 'rb')
|
||||||
data = fp.read()
|
data = fp.read()
|
||||||
fp.close()
|
fp.close()
|
||||||
|
|
||||||
layout = parse_psmap(data, args.offset, args.root)
|
layout = parse_psmap(data, args.offset, args.root, verbose=args.verbose)
|
||||||
# Walk through, outputting each node and attaching it to its parent
|
# Walk through, outputting each node and attaching it to its parent
|
||||||
code = '\n'.join(generate_lines(layout, {}))
|
code = '\n'.join(generate_lines(layout, {}))
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user