Конкретный пример, который я имею в виду, касается текущей альфа-игры Minecraft, но это общий вопрос, который, я думаю, заслуживает некоторого разговора.
Minecraft написан на Java, и трассировки стека обычно выглядят так (реальный пример):
java.lang.NullPointerException
at d.a(SourceFile:247)
at gi.b(SourceFile:92)
at bd.a(SourceFile:33)
at bn.a(SourceFile:69)
at bn.e(SourceFile:115)
at bn.d(SourceFile:103)
at net.minecraft.client.Minecraft.i(SourceFile:1007)
at net.minecraft.client.Minecraft.run(SourceFile:596)
at java.lang.Thread.run(Unknown Source)
Очевидно, что это не настоящие имена пакетов и методов, которые разработчик использует, когда пишет. Поскольку он находится в стадии альфа, кажется, что разработчик хотел бы иметь возможность разобраться в его трассировках стека, особенно если кто-то может предоставить его для отчета об ошибках. Поскольку это стоит, это в основном бессмысленно.
Какое преимущество можно было бы надеяться получить, запутав свой код таким образом, чтобы преодолеть недостатки более сложной идентификации ошибок?
obfuscation
StrixVaria
источник
источник
Ответы:
Мы также запутываем наш Java-код ....
Преимущество состоит в том, что это усложняет реинжиниринг (если вы беспокоитесь о том, что кто-то может украсть вашу кодовую базу и использовать ее в качестве основы для создания аналогичного конкурирующего продукта, например, и т. Д.).
Вы можете получить исходную трассировку стека: существуют инструменты запутывания, которые создают специальные справочные файлы, которые вы можете использовать для запуска обфусцированных трассировок стека, и он выходит с исходной трассировкой стека. Они генерируются самим процессом запутывания, так что вы не сможете получить исходную трассировку стека, если не будете иметь в руках эталонный файл, который вы использовали для обфускации кода.
Это не имеет недостатков на самом деле. :)
источник
Большинство obfuscator также оптимизируют ваш код , удаляют ненужные метаданные или неиспользуемый код, сжатие, удаление мертвого кода или удаление дубликатов.
источник