Как изменить порядок байтов списка констант в Python? - PullRequest
0 голосов
/ 28 ноября 2018

Я искал способ извлечь константы из исходных файлов 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 голосов
/ 16 февраля 2019

У вас, кажется, есть 3 шага в задаче:

  1. Разобрать код с pycparser - у вас есть это
  2. Найти все константы (только целочисленные константы? Как насчет float??) и поменять их порядок следования байтов
  3. Сделайте что-нибудь с результатами

Для (2) вы можете использовать что-то вроде предложений в этом ответе , но настроитьэто к фактическим типам, которые вам нужны.

Для (3) не ясно, что вы пытаетесь сделать;Вы пытаетесь записать константы обратно в исходный файл C?Тогда pycparser - не лучший инструмент для этого.Вы можете вместо этого использовать привязки Python к Clang, поскольку инструменты Clang предназначены для изменения существующего кода на месте.

...