How do I reverse the byte order of a list of constants in Python?

149 views Asked by At

I have been looking for a way to extract constants from C source files and reverse their byte order in one automated process (no manual input). So far, I've managed to utilize pycparser to do most of the heavy lifting for me and created a script that will print out all of the constants of a C file to the console. The format it prints is like this: Constant: int, 0x243F6A88

My question is does anyone know of an intuitive way to automate this conversion process in Python? I know how to reverse the byte order with join() but I am struggling to think of a way to do this in which I can minimize the amount of manual input. Ideally, my script would print out the constants (done already) and then use some sort of regex(maybe?) to convert any constant that starts with a 0x (there are a lot of random numbers that get printed that I don't want). I hope this makes sense, thanks!

what I have so far:

class ConstantVisitor(c_ast.NodeVisitor):
def __init__(self):
    self.values = []
def visit_Constant(self, node):
    self.values.append(node.value)
    node.show(showcoord=True)

def show_tree(filename):
# Note that cpp is used. Provide a path to your own cpp or
# make sure one exists in PATH.
    ast = parse_file(filename, use_cpp=True,cpp_args=['-E', r'-Iutils/fake_libc_include'])
    cv = ConstantVisitor()
    cv.visit(ast)

if __name__ == "__main__":
    if len(sys.argv) > 1:
        filename  = sys.argv[1]
    else:
        filename = 'xmrig-master/src/crypto/c_blake256.c'

    show_tree(filename)
1

There are 1 answers

0
Eli Bendersky On BEST ANSWER

You seem to have 3 steps in the task:

  1. Parse the code with pycparser - you have that
  2. Find all constants (just integer constants? how about floats?) and reverse their byte order
  3. Do something with the results

For (2) you can use something like the suggestions in this answer, but adjust it to the actual types you need.

For (3) it's not clear what you're trying to do; are you trying to write the constants back to the original C file? pycparser is not the best tool for that, then. You may want to use the Python bindings to Clang instead, because Clang tools are designed to modify existing code in place.