Демонтаж Capstone из двоичного файла в Python
У меня есть университетский проект, в котором я должен разбирать двоичные файлы. Поэтому я попробовал Capstone. Я пробовал недели с Java, но это не сработало, так как со вчерашнего дня я научил себя немного Python. Чтобы прочитать двоичный файл, я попытался:
file = open('binary_file')
content = file.readlines()
по этой ссылке: чтение двоичного файла (.out) в Python и разборка с Capstone и инструкции по разборке из capstone http://www.capstone-engine.org/lang_python.html
У меня есть решения от онлайн-дизассемблера, и в результате получается более 13000 строк. Когда я начинаю свою, я получаю только одну (0x1000: sc 0x2b). Я не могу найти ошибку, потому что в моих глазах все в порядке, но у меня нет никакого плана Python или Capstone.
Кстати, тестовый код со страницы Capstone работает нормально, так что я думаю, что нет ничего плохого в установке.
Код:
from capstone import *
file = open('C:/...sth', 'rb')
content = file.read()
ergebnism = open("C:/.../ergebnis.txt", "w")
mi = Cs(CS_ARCH_MIPS, CS_MODE_MIPS32)
for i in mi.disasm(content, 0x1000):
print("0x%x:\t%s\t%s" %(i.address, i.mnemonic, i.op_str))
#for (address, size, mnemonic, op_str) in mi.disasm_lite(content,0x1000):
# print("0x%x:\t%s\t%s" %(address, mnemonic, op_str))
ergebnism.write("0x%x:\t%s\t%s" %(i.address, i.mnemonic, i.op_str))
ergebnism.write("\n")
ergebnism.close()
file2 = open('C:/...erdb', 'rb')
content2 = file2.read()
ergebnisp = open("C:/.../ergebnisp.txt", "w")
pp = Cs(CS_ARCH_PPC, CS_MODE_64)
for i in pp.disasm(content, 0x1000):
print("0x%x:\t%s\t%s" %(i.address, i.mnemonic, i.op_str))
#for (address, size, mnemonic, op_str) in pp.disasm_lite(content2, 0x1000):
#print("0x%x:\t%s\t%s" %(address, mnemonic, op_str))
ergebnisp.write("0x%x:\t%s\t%s" %(i.address, i.mnemonic, i.op_str))
ergebnisp.write("\n")
ergebnisp.close()
1 ответ
Библиотеки дизассемблера, такие как Capstone, обрабатывают все, что вы им передаёте, как байты инструкций, но обычные двоичные файлы, как правило, содержат много других вещей, помимо инструкций. Большинство из них начинаются с какого-то заголовка, а не с кода.
Следовательно, необходим некоторый анализ, чтобы определить, какие части двоичного кода являются кодом, данными, ресурсами, таблицами перемещения и тому подобным, и передать только фактический код (т. Е. Байты инструкций) в механизм дизассемблера. Этот анализ также необходим для определения определенных параметров среды для кода, подлежащего разборке, например адреса, по которому он будет загружен операционной системой, адреса точки входа или перемещений, которые необходимо применить.
Этот анализ автоматически выполняется такими программами, как IDA (из которых есть бесплатная версия); их часто называют "дизассемблерами", но на самом деле логика дизассемблирования необработанных команд составляет лишь малую часть их возможностей анализа. Для получения дополнительной информации посмотрите раздел Disassembler для пакетной / автоматической обработки в Reverse Engineering.
Конечно, все это спорно, если ваши двоичные файлы содержат только сырая инструкцию потоки...