2013-04-03 2 views
0

В поисках парсера C++ Я недавно наткнулся на проект ниже. Внутри него есть синтаксический анализатор, который, как представляется, очень хорошо подходит для моих нужд, однако я считаю, что автор (ы) сознательно запутывал некоторые из основных частей кода, что затрудняет изучение кода.Deobfuscating C++ исходный код

https://github.com/ArashPartow/math-parser-benchmark-project/blob/master/fparser/fpoptimizer.cc

Существует описание в файле и на сайте автора о там быть простой deobfuscated версия, однако указанный сайт, кажется, только у dead-link и попытки связаться с автором оказались бесплодными.

Мне было интересно узнать, сможет ли соратник SOers быстро и просто изменить обфускацию в вышеупомянутом файле.

Теперь я не уверен, потому что я не эксперт на C++, но может быть, что есть законные причины для того, чтобы код был таким, каким он есть, предположительно, поскольку имя файла предполагает, что это может быть по соображениям производительности.

+8

ПРИМЕЧАНИЕ: Этот файл содержит сгенерированный код (из источников оптимизатора) и не предназначен для модификации вручную. Если вы хотите изменить optimizer, скачать версию для разработки библиотеки ". – Mysticial

+6

@Mysticial: 'Однако на указанном сайте есть только мертвая ссылка, и попытки связаться с автором были бесплодными. –

+0

Я бы начал с избавления от макросов, попробуйте это: http://stackoverflow.com/questions/277258/cc-source-file-after-preprocessing # Я думаю, что этот код был намеренно запутан, кажется, что ничего не улучшило бы производительность этого кода. – Kupto

ответ

6

В этом конкретном случае вы можете просто попробовать эту ссылку для project page, with the latest devel files - я только что разработал, что версия была неправильной - ссылка говорит 4.5, а текущая версия - 4.5.2 на эту ревизию. Они, похоже, не хранят старые версии, поэтому хватайте последние данные

4

Большинство компиляторов имеют возможность просто запускать препроцессор по коду & сгенерировать выходной сигнал препроцессора. Это приведет к удалению какой-либо обфускации, сделанной с использованием #defines.

См., Например, в MSVC вы можете запустить cl /P fpoptimizer.cc. Это создаст файл с именем fpoptimizer.i, который будет содержать предварительно обработанный файл.

Вы можете удалить #includes в программу, прежде чем делать это - так, чтобы в программе были предварительно обработаны только #define с, а не другие.

gcc предоставляет опцию -E, чтобы сделать что-то подобное.

+1

Я дал это, он выпустил файл размером 1,8 МБ, в который были включены всевозможные другие вещи. Есть ли способ включать только материал, который находится в самом файле? btw это производит такие вещи, есть ли способ сделать его немного более форматированным с помощью этой опции команды? TailCall_cLessOrEq; Ljh: this-> ByteCode.pop_back(); ByteCodePtr- = 1; opcode = cLess ;; goto TailCall_cLess; Lji: this-> ByteCode.pop_back(); ByteCodePtr- = 1; opcode = cGreaterOrEq ;; goto TailCall_cGreaterOrEq; Ljj: this-> ByteCode.pop_back(); ByteCodePtr- = 1; opcode = cGreater ;; goto TailCall_cGreater; Ljk: this-> ByteCode.pop_back(); – Gerdiner

+0

@ Gerdiner - Как я уже сказал, удалять #includes из файла перед этим - это гарантирует, что предварительная обработка выполняется только для '# define' из файла. – user93353