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

时间:2018-11-28 03:37:30

标签: python pycparser

我一直在寻找一种方法,可以从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 个答案:

答案 0 :(得分:0)

您似乎完成了3个步骤:

  1. 使用pycparser解析代码-您拥有
  2. 查找所有常量(仅是整数常量?浮点数如何?)并反转其字节顺序
  3. 对结果做些事情

对于(2),您可以使用类似建议in this answer的方法,但可以根据实际需要进行调整。

对于(3)来说,您不清楚要做什么。您是否正在尝试将常量写回到原始C文件? pycparser并不是最好的工具。您可能想改用Clang的Python绑定,因为Clang工具旨在修改现有的代码。