如何在Python中反转常量列表的字节顺序



我一直在寻找一种方法,从C源文件中提取常量,并在一个自动化过程中反转其字节顺序(无需手动输入(。到目前为止,我已经设法利用pycparser为我完成了大部分繁重的工作,并创建了一个脚本,将C文件的所有常量打印到控制台。它打印的格式如下:常数:int,0x243F6A88

我的问题是,有人知道在Python中自动化这个转换过程的直观方法吗?我知道如何用join((反转字节顺序,但我很难想出一种方法来做到这一点,即最大限度地减少手动输入量。理想情况下,我的脚本会打印出常量(已经完成(,然后使用某种正则表达式(可能是?(来转换任何以0x开头的常量(有很多随机数是我不想要的(。我希望这是合理的,谢谢!

到目前为止:

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. pycparser解析代码-您已经得到了
  2. 查找所有常量(只有整数常量?浮点值如何?(并反转它们的字节顺序
  3. 用结果做点什么

对于(2(,你可以使用类似于这个答案中的建议,但要根据你需要的实际类型进行调整。

因为(3(不清楚你想做什么;你想把常量写回原来的C文件吗?pycparser并不是最好的工具。您可能需要使用Clang的Python绑定,因为Clang工具是用来修改现有代码的。

最新更新