Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from ghidra.program.model.data import PointerDataType, TerminatedStringDataType
- # traversable addresses
- addrs = []
- # bad address
- baddrs = [0x004C095C, 0x0966DDBC]
- # misaligned address
- maddrs = [0x05474C15, 0x0549184C, 0x0544C560]
- # filter commands
- fcmds = ['community-list', 'community-filter']
- def createPointerEx(addr):
- data = getDataAt(addr)
- if data is not None:
- if data.isPointer():
- return data
- else:
- removeData(data)
- else:
- data = getDataContaining(addr)
- if data is not None:
- removeData(data)
- else:
- while True:
- data = getDataAfter(addr)
- if data is not None and (addr <= data.minAddress <= addr.add(4)):
- removeData(data)
- else:
- break
- return createData(addr, PointerDataType.dataType)
- def createAsciiStringEx(addr):
- dat = getDataAt(addr)
- if dat is None:
- dat = getDataContaining(addr)
- if dat is not None:
- if isinstance(dat.baseDataType, TerminatedStringDataType):
- return dat
- else:
- removeData(dat)
- dat = None
- while dat is not None:
- try:
- dat = createAsciiString(addr)
- except:
- dat = getDataAfter(addr)
- if dat is not None:
- removeData(dat)
- dat = None
- return dat
- def traverseCommandAt(addr, lcmd, depth):
- global addrs
- if addr.offset == 0 or addr.offset in baddrs or depth > 15:
- return
- iaddr = addr
- leaf = bool(getByte(iaddr) & 0x80)
- hide = bool(getByte(iaddr) & 0x20)
- iaddr = iaddr.add(4)
- # Pointer to command string
- try:
- dat = createPointerEx(iaddr)
- except:
- print(addr)
- raise
- paddr = dat.value
- cmd = None
- try:
- dat = createAsciiStringEx(paddr)
- except:
- print(addr)
- else:
- cmd = dat.value[(paddr.offset - dat.address.offset) * paddr.compareTo(dat.address):]
- finally:
- if not cmd:
- cmd = '<>'
- else:
- if hide:
- cmd = '*' + cmd + '*'
- iaddr = iaddr.add(4)
- # Pointer to command help string
- dat = createPointerEx(iaddr)
- paddr = dat.value
- try:
- dat = createAsciiStringEx(paddr)
- except:
- pass
- iaddr = iaddr.add(4)
- # Pointer to sub command structure
- dat = createPointerEx(iaddr)
- if dat.value.offset != 0 and \
- dat.value.offset != addr.offset and \
- cmd == '<>' or \
- lcmd.find(cmd) == -1 and \
- not cmd in fcmds:
- addrs.append([dat.value, lcmd + cmd + ' ', depth + 1])
- iaddr = iaddr.add(4)
- # Pointer to command function
- dat = createPointerEx(iaddr)
- if not leaf:
- iaddr = iaddr.add(9)
- if addr.offset in maddrs:
- iaddr = iaddr.add(4 - (iaddr.offset % 4) % 4)
- addrs.append([iaddr, lcmd, depth])
- if dat.value.offset != 0:
- return lcmd + cmd
- # User
- #addrs.append([toAddr(0x05444E78), '', 0])
- # Privilege
- #addrs.append([toAddr(0x054443e4), '', 0])
- # Configure
- #addrs.append([toAddr(0x0543b580), '', 0])
- # Ask
- addrs.append([askAddress("Command Address", "Enter command address"), '', 0])
- # unique commands
- cmds = []
- monitor.initialize(100)
- monitor.setIndeterminate(True)
- while addrs and not monitor.isCancelled():
- args = addrs.pop()
- monitor.setMessage(args[1])
- cmd = traverseCommandAt(*args)
- if cmd is not None:
- i = cmd.rfind('*')
- if i >= 0:
- cmd = cmd[0:i+1]
- if cmd not in cmds:
- cmds.append(cmd)
- print(cmd)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement