Сейчас для первичного анализа используется IDA. В будущем вероятно перееду на Ghidra. IDA находит переменные и дает им названия. Эмулятор libdosbox собирает потерянную информацию в процессе выполнения: значения сегментных регистров, размеры и расположение переменных, самомодифицирующийся код. А так же самое главное - эмулятор запускает каждую инструкцию под интерпретатором и сравнивает ее с С-шным кодом, чтобы обнаружить неточности трансляции. Это компенсирует кривизну того что выдает IDA и транслятор. Это основная фишка проекта, дает точность трансляции и за пару дней. А еще IDA не декомпилирует 16 битный код. Я сейчас планирую переделать транслятор чтобы он выдавал более высокоуровневый код. Например используя SMT. Можно странслированный код компилировать в 32/64 бита x86 либо .NET и потом декомпилировать, чтобы удалить лишний код (работу с флагами) и получить высокоуровневый код. Так что мы получаем тоже самое что дает IDA + проверку исполнением. А еще сгенерированный код можно исполнять, отлаживать в gdb, вставлять трассировки, легко заменять код IDA используется чтобы получить .lst файл masm2c - транслятор из .lst в .cpp (транслировать 32битный код не проблема). Т.е. тулкит - что-то среднее между дизассемблером и декомпилятором. libdosbox - эмулятор, пока не умеет проверять транслированный 32 битный код, если надо - присоединяйтесь и добавьте. Зато под 32 бита много готовых декомпиляторов. Классы и структуры - это мечта пока. Есть идеи как их связать? По идее поможет сбор run-time информации эмулятором… |