def parseInteger(self, text): # Remove spaces and convert to lower case text = text.strip() if " " in text: raise ValueError("Space are forbidden: %r" % text) text = text.lower() # Replace registers by their value orig_text = text text = REGISTER_REGEX.sub(self.readRegister, text) # Replace hexadecimal numbers by decimal numbers def readHexadecimal(regs): text = regs.group(0) if text.startswith("0x"): text = text[2:] elif not re.search("[a-f]", text): return text value = int(text, 16) return str(value) text = re.sub(r"(?:0x)?[0-9a-f]+", readHexadecimal, text) # Reject invalid characters if not re.match(r"^[()<>+*/&0-9-]+$", text): raise ValueError("Invalid expression: %r" % orig_text) # Use integer division (a//b) instead of float division (a/b) text = text.replace("/", "//") # Finally, evaluate the expression is_pointer = text.startswith("*") if is_pointer: text = text[1:] try: value = eval(text) value = truncateWord(value) except SyntaxError: raise ValueError("Invalid expression: %r" % orig_text) if is_pointer: value = self.process.readWord(value) return value
def parseInteger(text, procWrap=None): global ptraceProc_g ptraceProc_g = procWrap.ptraceProcess if procWrap else None # Remove spaces and convert to lower case text = text.strip() if " " in text: raise ValueError("Space are forbidden: %r" % text) text = text.lower() orig_text = text # replace symbols by their value def readSymbols(symbol): text = symbol.group(0) if procWrap is None: return text else: try: return str(procWrap.programinfo.getAddrOf(text)) except ValueError as e: debug(e) return text # Replace hexadecimal numbers by decimal numbers def readHexadecimal(regs): text = regs.group(0) if text.startswith("0x"): text = text[2:] elif not re.search("[a-f]", text): return text value = int(text, 16) return str(value) # (first_char)(rest)* if your symbol contains other characters, include them here symbol_regex = r"(?<!0x)[a-zA-Z_][a-zA-Z0-9_.]*" symbol_regex_with_library = symbol_regex + r"(:" + symbol_regex + ")?" text = re.sub(r"(?:0x)[0-9a-f]+", readHexadecimal, text) text = re.sub(symbol_regex_with_library, readSymbols, text) # Replace registers by their value text = REGISTER_REGEX.sub(readRegister, text) # Reject invalid characters if not re.match(r"^[()<>+*/&0-9-]+$", text): raise ValueError("Invalid expression: %r" % orig_text) # Use integer division (a//b) instead of float division (a/b) text = text.replace("/", "//") # Finally, evaluate the expression is_pointer = text.startswith("*") if is_pointer: text = text[1:] try: value = eval(text) value = truncateWord(value) except SyntaxError: raise ValueError("Invalid expression: %r" % orig_text) if is_pointer: assert isinstance(ptraceProc_g, PtraceProcess) # value = ptraceProc_g.readWord(value) try: value = ptraceProc_g.readBytes(value, 8) value = bytes2word(value) except PtraceError as e: warning(str(e)) value = 0 return value