2009-07-16 27 views
9

Tôi có một ứng dụng độc quyền tôi muốn giao cho một vài người để thử nghiệm, ngoại trừ chúng tôi không muốn tiết lộ nguồn của họ. Ứng dụng này được viết bằng C++ cho Linux. Nó liên kết với các gói sẵn có trên repos Fedora/Ubuntu.Phân phối một ứng dụng cho công chúng để họ có thể biên dịch, mà không tiết lộ nguồn

Có cách nào để xử lý nguồn tới nội dung trung gian ... sau đó phân phối và có người dùng thực hiện biên dịch cuối cùng thực sự biên dịch và liên kết mã trung gian với nền tảng gốc của họ hay không.

Tôi đang cố gắng xem có cách nào khác để phân phối các tệp nhị phân được biên dịch trước không. Cảm ơn.

+0

Tôi có một câu hỏi rất giống http://stackoverflow.com/questions/1025494/obfuscating-c-c-code – hhafez

+0

động lực là gì? Có lý do cụ thể nào khiến họ không được phép xem nguồn không? Và lý do không muốn phân phối các tệp nhị phân được biên dịch trước là gì? – jalf

Trả lời

4

Bạn có thể xử lý mã nguồn hiện tại để "mangle" nó; về cơ bản điều này bao gồm tước bỏ tất cả các ý kiến, và thay đổi tên biến để được tối thiểu và tước tất cả các định dạng mã nguồn. Vấn đề là, họ có thể tương đối dễ dàng thay đổi tên biến trở lại và thêm định dạng và nhận xét; trong khi họ sẽ không có cùng một mức độ thông tin trong mã nguồn kết quả như bạn làm, họ S have có mã nguồn hoàn toàn chức năng (vì đó là những gì bạn phân phối cho họ). Đây là cách duy nhất để làm điều này.

+1

Điều này được gọi là "nguồn che phủ" và được sử dụng khá phổ biến cho ví dụ: Phần mềm UNIX. – tialaramex

+0

Bạn cũng không thể loại bỏ thông tin gỡ lỗi khỏi nó, hoặc đây là những gì bạn đang đề cập đến? – jkeys

+0

Không, bạn không thể bỏ trước thông tin gỡ lỗi khi bạn đang phân phối mã nguồn (thậm chí mã nguồn bị cắt xén). Thông tin gỡ lỗi không được tạo cho đến khi tệp nhị phân được biên dịch. –

0

Nếu đó là C, bạn có thể sử dụng trình biên dịch clang, sau đó kết xuất đại diện LLVM trung gian. Nếu đó là C++, bạn có thể cần phải chờ một thời gian cho đến khi hỗ trợ C++ của clang phát triển.

+0

Biểu diễn trung gian LLVM đã được biên dịch và do đó bất kỳ thay đổi thời gian xây dựng nào (ví dụ: kích thước khác nhau của cấu trúc trên hệ thống một người từ hệ thống khác) sẽ không được phản ánh trong các tệp nhị phân kết quả. Vì vậy, điều này thường sẽ chỉ hoạt động trong trường hợp phân phối các tệp nhị phân có hiệu quả. – tialaramex

+0

Giả sử mục tiêu duy nhất là làm cho nó di động sang các nền tảng khác, điều đó đủ tốt, phải không? – bdonlan

+1

Hãy lấy một ví dụ dễ dàng. Linux và BSD có một số cấu trúc hệ thống có kích thước khác nhau. Khi bạn biên dịch từ C sang biểu diễn trung gian của LLVM, tệp tiêu đề khai báo các cấu trúc này trên nền tảng nơi bạn biên dịch (nói, OpenBSD) sẽ quyết định trình biên dịch nghĩ cấu trúc đó lớn tới cỡ nào. Khi bạn cố gắng sử dụng đại diện trung gian LLVM để xây dựng một nhị phân đang chạy trên Linux, kích thước cấu trúc sẽ sai và chương trình của bạn sẽ bị lỗi. Vì vậy, không, dường như không đủ tốt với tôi. – tialaramex

5

Đây không phải là câu trả lời kỹ thuật, nhưng bạn có tin tưởng họ đủ để chỉ yêu cầu NDA đã ký không?

+1

Nhà phát triển trò chơi làm điều đó với beta trực tuyến, nhưng đây là rủi ro cao hơn/phần thưởng cao hơn. – jkeys

5

Chỉ cần biên dịch nó cho trình biên dịch. Có thể được thực hiện bằng tùy chọn -S.

helloworld.cpp:

#include <iostream> 

using namespace std; 

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

Và sau đó làm:

[email protected] /home/emil/dev/assemblertest $ g++ -S -o helloworld.s helloworld.cpp 
[email protected] /home/emil/dev/assemblertest $ g++ -o helloworld helloworld.s 
[email protected] /home/emil/dev/assemblertest $ ./helloworld 
Hello World 

Sử dụng phương pháp này, bạn có thể phân phối duy nhất .S-file đó sẽ chứa rất khó đọc lắp ráp.

+1

Điều này không giải quyết được vấn đề "nền tảng gốc", vì nó phụ thuộc vào máy (và có thể phụ thuộc vào distro, tùy thuộc vào tiêu đề nào được bao gồm). –

+2

Điểm công bằng. Tôi vẫn tin rằng nó có thể là một lựa chọn trong một số trường hợp mặc dù, vì vậy tôi sẽ rời khỏi bài chứ không phải là xóa nó. –

+1

Mặc dù nó phụ thuộc vào nền tảng nhưng không có quá nhiều nền tảng ngoài đó - bạn có thể thực hiện điều này một cách riêng biệt cho tất cả các nền tảng quan tâm. – sharptooth

1

Tóm lại, không. Theo định nghĩa, nếu họ có thể biên dịch nó thì họ có nguồn của bạn. Điều tốt nhất bạn có thể làm là tăng nỗi đau của họ cố gắng hiểu nó.

Tôi đồng ý với John. Nếu bạn có một số lượng nhỏ khách hàng và tin tưởng họ, một NDA sẽ là một tuyến đường tốt hơn.

Một điều khác mà tôi vừa nghĩ đến ... điều gì mới chỉ chạy bộ tiền xử lý và trình biên dịch, nhưng không phải là trình biên dịch và trình liên kết? Bạn sẽ cần một bản sao cho mỗi ngôn ngữ lắp ráp của kiến ​​trúc cụ thể, nhưng tôi cho rằng sẽ đủ đau đớn để ngăn cản việc chỉnh sửa trong khi dễ dàng biên dịch.

1

Bạn có thể chia ứng dụng của mình thành hai phần: phần đầu sẽ chứa các thư viện được biên dịch sẵn với chức năng độc lập của HĐH và phần thứ hai sẽ chứa một phần nhỏ nguồn mà người dùng sẽ biên dịch. Theo cách đó, NVIDIA phân phối trình điều khiển của họ.

0

Giải pháp tốt nhất tôi có thể giới hạn số lượng nền tảng bạn hỗ trợ và biên dịch của riêng bạn hoặc biên dịch sang định dạng nhị phân khó trích xuất thông tin. có thể biên dịch nó thành định dạng gốc của chúng.

Cá nhân tôi sẽ đi với tùy chọn 1.

Các vấn đề liên quan