Отказ от ответственности: Это не спонсируемый пост. Однако мой нынешний работодатель платит мне за поддержание хранилища, поэтому справедливо упомянуть о них.
Я работаю в компании под названием works . Они создают библиотеки для графиков это (имхо) современное состояние, а также веселая компания для работы 🍺
Поскольку эти библиотеки являются сложными, компания очень склонна защищать свою интеллектуальную собственность. В золотой век Java (который был как раз в то время, когда они выпустили это на рынок) было бы крайне важно внедрить некоторые виды защиты, чтобы обеспечить этот IP. Вот почему изначально был разработан guard
(примечание: когда я впервые коснулся хранилища, некоторым активам было всего 11 лет).
Я люблю открытый исходный код – и точка. Зная это, мой технический директор некоторое время назад обратился ко мне, уверенный, что я буду рад сделать этот продукт доступным для более широкой аудитории. Мы провели краткое обсуждение, и я отправился в свое путешествие, чтобы сделать его открытым исходным кодом.
Я составил контрольный список вещей, которые необходимо было решить, прежде чем публиковать его на GitHub:
- лицензировать все, что может быть лицензировано ✅
- замените проприетарный код библиотеками или при необходимости перепишите его ✅
- замените старую систему сборки и зависимости на современные ✅
- настройте тесты и CI, чтобы он оставался в хорошей форме ✅
- добавьте обширную документацию и примеры кода ✅
- добавить рекомендации по внесению вклада ✅
Закончив с этим списком, я рад объявить: мы выпустили guard в дикую природу (некоторое время назад)!
Этот пост, однако, должен быть не только простым объявлением о выпуске, но я собираюсь поместить здесь несколько примеров кода, чтобы стало ясно, что на самом деле делает эта запутанность 💡
Скажем, у нас есть довольно полное Java-приложение, у которого есть точка входа примерно так:
package com.yworks.example; public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World"); } }
Теперь, учитывая, что мы используем Gradle
в качестве нашей системы сборки, мы могли бы использовать очень простую задачу guard
для запутывания результирующего .jar
task obfuscate { dependsOn jar doLast { ant.taskdef( name: 'yguard', classname: 'com.yworks.yguard.YGuardTask', classpath: sourceSets.main.runtimeClasspath.asPath ) def archivePath = jar.archiveFile.get().asFile.path ant.yguard { inoutpair(in: archivePath, out: archivePath.replace(".jar", "_obf.jar")) shrink(logfile: "${buildDir}/yshrink.log.xml") { keep { method(name: "void main(java.lang.String[])", "class": application.mainClassName) } } rename(mainclass: application.mainClassName, logfile: "${buildDir}/yguard.log.xml") { property(name: "error-checking", value: "pedantic") } } } }
Это сообщает системе сборки:
- настройка
Муравьиной
задачи так что мы можем использоватьguard
- выполните задачу
guard
с вводом и выводом.jar
- уменьшите полученный
.jar
, оставляя только классы и методы , загруженные изглавный
- запутать все имена классов, имена функций, имена переменных, … за исключением для
главный
Как только мы вызовем gradle obfuscate
, это создаст запутанный .jar
, не оставляя ничего, кроме странного следа символов в именах файлов и классах.
Вы заметили свойство файл журнала
? Это самая лучшая часть. Мы можем использовать сопоставление, установленное во время запутывания, для расшифровки трассировок стека!
Я мог бы написать довольно длинную статью обо всех возможных конфигурациях, которые вы можете использовать, которая намного превзошла бы простое введение. Может быть, когда-нибудь, где-нибудь я расскажу о том, как все это работает 😎 . Тем временем, пожалуйста, ознакомьтесь с обширной документацией и примеры , который охватывает все эти варианты.
Оригинал: “https://dev.to/fohlen/yguard-is-now-open-source-obfuscation-easy-as-pie-1do5”