Разборка с python - нелегкое решение? - PullRequest
7 голосов
/ 07 февраля 2010

Я пытаюсь создать скрипт на python, который будет разбирать двоичный файл (точнее, исполняемый файл Windows) и анализировать его код. Мне нужна возможность взять определенный буфер и извлечь некоторую структуру, содержащую информацию об инструкциях в нем.

Я работал с libdisasm в C раньше, и я нашел его интерфейс довольно интуитивно понятным и удобным. Проблема в том, что его интерфейс Python доступен только через SWIG, и я не могу заставить его правильно скомпилироваться в Windows.

В аспекте доступности diStorm предоставляет приятный готовый интерфейс, но он предоставляет только мнемонику каждой инструкции, а не двоичную структуру с перечислениями, определяющими тип инструкции, а что нет. Это довольно неудобно для моей цели и потребует много того, что я считаю потраченным на завершение интерфейса, чтобы он соответствовал моим потребностям.

Я также посмотрел на BeaEngine, который на самом деле обеспечивает нужный мне вывод, структуру с двоичной информацией, касающейся каждой инструкции, но ее интерфейс действительно странный и нелогичный, и он почти мгновенно завершает работу при наличии неправильные аргументы. Вид CTypes типа предельной смерти для вашего питона.

Итак, я был бы рад услышать о других решениях, которые занимают немного меньше времени, чем возиться с djgcc или mingw для создания SWIGed libdisasm, или писать оболочку OOP для diStorm. Если у кого-то есть какое-то руководство относительно того, как скомпилировать SWIGed libdisasm, или, что еще лучше, скомпилированный двоичный файл (pyd или dll + py), я бы хотел услышать / получить его. :)

Спасибо, вперед.

Ответы [ 4 ]

2 голосов
/ 07 февраля 2010

Вы можете попробовать использовать ctypes для непосредственного взаимодействия с libdisasm вместо прохождения через слой SWIG. Это может занять больше времени на разработку, но, AFAIK, вы сможете получить доступ к базовым функциям с помощью ctypes.

2 голосов
/ 11 мая 2010

Я рекомендую вам взглянуть на библиотеку дизассемблирования Pym , которая также является основой для онлайн-дизассемблера Pym .

2 голосов
/ 07 февраля 2010

Что ж, после долгих раздумий мне удалось скомпилировать SWIGed libdisasm! К сожалению, кажется, что происходит сбой Python при неправильном (а иногда и правильном) использовании. Как я это сделал:

  1. Я скомпилировал libdisasm.lib с использованием Visual Studio 6, единственное, что вам для этого нужно, - это исходный код в любом используемом вами выпуске libdisasm, а также stdint.h и inttypes.h (версия, совместимая с Visual C ++, Google google)
  2. Я SWIGED данный файл libdisasm_oop.i с помощью следующей командной строки

    swig -python -shadow -o x86disasm_wrap.c -outdir. libdisasm_oop.i

  3. Использовал Cygwin для запуска ./configure в корневом каталоге libdisasm. Единственное, что вы получаете от этого - это config.h

  4. Затем я создал новый проект DLL, добавил к нему x86disasm_wrap.c, добавил папки c: \ PythonXX \ libs и c: \ PythonXX \ Include в соответствующие переменные, установив конфигурацию выпуска (важно, либо это или сделать #undef _DEBUG перед включением python.h). Также есть шанс, что вам нужно исправить путь к config.h.

  5. Скомпилировал проект DLL и назвал выходной файл _x86disasm.dll. Поместите это в ту же папку, где генерируется SWIG x86disasm.py, и все готово.

Какие-нибудь предложения для других, менее крутых библиотек disasm для python?

1 голос
/ 08 апреля 2012

Вы можете использовать библиотеку distorm: https://code.google.com/p/distorm/

Вот еще одна сборка: http://breakingcode.wordpress.com/2009/08/31/using-distorm-with-python-2-6-and-python-3-x-revisited/

Также есть BeaEngine: http://www.beaengine.org/

Вот установщик Windows для BeaEngine: http://breakingcode.wordpress.com/2012/04/08/quickpost-installer-for-beaenginepython/

...