Распределите приложение общественности, таким образом, они могут скомпилировать, не показывая источник

Можно использовать java.lang.instrument пакет

Компиляция и поместить этот класс в JAR:

import java.lang.instrument.Instrumentation;

public class ObjectSizeFetcher {
    private static Instrumentation instrumentation;

    public static void premain(String args, Instrumentation inst) {
        instrumentation = inst;
    }

    public static long getObjectSize(Object o) {
        return instrumentation.getObjectSize(o);
    }
}

Добавляют следующее к Вашему MANIFEST.MF:

Premain-Class: ObjectSizeFetcher

Использование getObjectSize:

public class C {
    private int x;
    private int y;

    public static void main(String [] args) {
        System.out.println(ObjectSizeFetcher.getObjectSize(new C()));
    }
}

Вызывают с:

java -javaagent:ObjectSizeFetcherAgent.jar C

9
задан hhafez 16 July 2009 в 04:29
поделиться

8 ответов

Вы можете обработать существующий исходный код, чтобы "исказить" его; в основном это состоит из удаления всех комментариев, изменения имен переменных до минимума и удаления всего форматирования исходного кода. Проблема в том, что они могут относительно легко изменить имена переменных и добавить форматирование и комментарии; хотя у них не будет такого же уровня информации в результирующем исходном коде, как у вас, они БУДУТ иметь полностью функциональный исходный код (потому что это то, что вы им распространили). Это почти единственный способ делать подобные вещи.

4
ответ дан 4 December 2019 в 12:20
поделиться

Вы можете разделить ваше приложение на две части: первая часть будет содержать предварительно скомпилированные библиотеки с независимой от ОС функциональностью, а вторая будет содержать небольшие части исходных текстов, которые пользователи будут компилировать. Таким образом NVIDIA распространяет свои драйверы.

1
ответ дан 4 December 2019 в 12:20
поделиться

Вы можете запутать ваш код C / C ++. См. Мой вопрос о инструментах обфускации C / C ++

1
ответ дан 4 December 2019 в 12:20
поделиться

Это не технический ответ, но достаточно ли вы им доверяете, чтобы просто попросить подписанное соглашение о неразглашении?

5
ответ дан 4 December 2019 в 12:20
поделиться

Просто скомпилируйте его на ассемблер. Это можно сделать с помощью параметра -S.

helloworld.cpp:

#include <iostream>

using namespace std;

int main(void)
{
    cout << "Hello World" << endl;
    return 0;
}

А затем выполните:

emil@lanfear /home/emil/dev/assemblertest $ g++ -S -o helloworld.s helloworld.cpp
emil@lanfear /home/emil/dev/assemblertest $ g++ -o helloworld helloworld.s
emil@lanfear /home/emil/dev/assemblertest $ ./helloworld
Hello World

Используя этот метод, вы можете распространять только файлы.

5
ответ дан 4 December 2019 в 12:20
поделиться

Короче говоря, нет. По определению, если они могут его скомпилировать, то у них есть ваш источник. Лучшее, что вы можете сделать, - это усилить боль их попыток понять это.

Я согласен с Джоном. Если у вас небольшое количество клиентов и вы доверяете им, NDA будет лучшим путем.

Еще одна вещь, о которой я только что подумал ... как насчет простого запуска препроцессора и компилятора, но не ассемблера и компоновщика? Вам понадобится копия для каждого языка ассемблера конкретной архитектуры, но я предполагаю, что это будет достаточно болезненно, чтобы отговорить редактирование, но достаточно легко для компиляции.

1
ответ дан 4 December 2019 в 12:20
поделиться

Если это C, вы можно использовать компилятор clang , а затем выгрузить промежуточное представление LLVM. Если это C ++,

0
ответ дан 4 December 2019 в 12:20
поделиться

Лучшее решение, которое я могу придумать, - это либо ограничить количество поддерживаемых вами платформ и выполнить свои собственные компиляции, либо выполнить компиляцию в двоичный формат, из которого трудно извлечь информацию, но пользователь может скомпилировать это в свой собственный формат.

Лично я бы выбрал вариант 1.

0
ответ дан 4 December 2019 в 12:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: