2009-12-17 71 views
57

Tôi nghĩ rằng tôi hơi bối rối về việc biên dịch mã byte byte thành mã gốc hoặc có thể tôi đã nhầm lẫn về kết quả cuối cùng. Vì vậy, xin vui lòng chịu với tôi khi tôi cố gắng để sắp xếp thông qua những gì tôi nghĩ rằng tôi hiểu để bạn có thể giúp tôi tìm ra những gì tôi đang mất tích.Biên dịch C# thành Gốc?

Điều tôi muốn làm là biên dịch đơn đăng ký bằng C# xuống mã gốc thường dùng như tôi đã nhận được nếu tôi đã viết nó trong C. Lý do của tôi không liên quan gì đến hiệu suất, mà là một số mức độ bảo vệ. Tôi hiểu rằng mục tiêu cuối cùng của tôi không phải là không thể (hoặc thậm chí thực sự khó khăn) để phá vỡ, nhưng tôi chỉ cảm thấy như đảo ngược lắp ráp x86 là khó khăn hơn so với đảo ngược những gì Reflector mang lại cho tôi.

Ngay bây giờ nếu tôi ném ứng dụng C# vào Reflector, về cơ bản tôi sẽ lấy lại mã nguồn của mình. Thông thường khi tôi ném các ứng dụng C/C++ không được quản lý của mình vào IDAPro và sử dụng trình giải mã HexRays, tôi không hoàn toàn có được mức độ giải mã ngược lại và tôi phải sử dụng công cụ tháo gỡ x86 để hiểu luồng logic. Đó là sự hiểu biết của tôi rằng sự giải mã tuyệt vời như vậy đến từ Reflector do ứng dụng đang ở trong MSIL thay vì mã nguồn gốc thô tục hơn mà HexRays cố gắng dịch ngược.

Tôi không có lo ngại về máy khách vẫn cần .NET. Tôi không cố gắng phá vỡ bất kỳ điều nào. Tôi muốn chạy các chương trình obfuscation phần mềm bình thường như upx trên chương trình của tôi, và thực hiện nó dưới dạng nhị phân .NET.

Đó là sự hiểu biết của tôi từ this câu hỏi liên quan mà ngen làm những gì tôi muốn. Tôi đã thử sử dụng ngen. Nhưng sau khi sao chép các tập tin đầu ra từ thư mục C:\Windows\assemblies\...\applicationName.ni.exe đến một nơi nào đó tôi có thể nhấp đúp chuột, và cố gắng để chạy nó tạo ra một lỗi về nó không phải là "một ứng dụng Win32 hợp lệ". Hơn nữa, khi tôi quăng các applicationName.ni.exe vào Reflector, tôi nhận được cùng một đầu ra như tôi đã làm từ chỉ applicationName.exe. Kể từ khi applicationName.ni.exe được coi là mã gốc, tôi dự kiến ​​Reflector sẽ bị lỗi, nhưng không. Nếu đây là cách tôi phải làm điều này, tại sao Reflector vẫn cho tôi một sự giải mã tuyệt vời như vậy?

Vì vậy, chỉ để tóm tắt câu hỏi chính của tôi một lần nữa: Làm thế nào tôi có thể biên dịch chương trình .NET của tôi thành một nhị phân gốc mà Reflector sẽ không dễ dàng dịch ngược? Hoặc một số phương pháp hay nhất để bảo vệ sản phẩm được viết bằng ngôn ngữ .NET từ kỹ sư đảo ngược newbie là gì?

Nếu tôi cần một công cụ khác, tôi muốn một cái gì đó miễn phí và không giống như Codewall.

Cảm ơn!

CẬP NHẬT: Tôi hiểu rằng những gì tôi đang tìm kiếm có thể giới hạn một số tính năng của ngôn ngữ như Reflection, nhưng tôi nghĩ tôi ổn với điều đó. Không có mã nào của tôi thực hiện bất kỳ lệnh gọi nào rõ ràng Assembly.Load hoặc bất kỳ thứ gì sắp xếp. Nhưng không phải những người chỉ được thay thế bằng các cuộc gọi GetProcAddress/LoadLibrary?

+2

Mở mã bảo vệ/obstufactors nhất trong số đó là thương mại và vừa tốn kém nếu bạn không phải là một công ty phát triển phần mềm tuy nhiên ngay cả những tầng trên cùng những người thương mại có thể có tấn vấn đề với mã của bạn thực sự làm việc ngay sau khi nó làm điều đó. –

Trả lời

19

Tôi chỉ xác nhậnNet Native trên VS2015 & Windows 8.1 (khi cấu hình một cách chính xác, kiểm tra .proj để xác nhận) và xây dựng cho một kiến ​​trúc đặc biệt (có thể quá mức cần thiết, chưa xác nhận) , sẽ tạo ra một tệp gốc sẽ cung cấp cho bạn "khó hơn để đảo ngược kỹ sư" mã bạn đang tìm kiếm cho tôi đã không được kích hoạt để đọc .dll qua DotPeek (miễn phí .Net decompiler từ JetBrains).

+12

Tuyệt vời! Sáu năm sau và giấc mơ của tôi cuối cùng đã trở thành hiện thực. ;) – mrduclaw

+8

Lưu ý rằng đây là ứng dụng phổ biến cho Windows 10, không phải WPF hoặc WinForms. Tức là, Windows 8.1 trở lên. –

+2

@EricEskildsen, vì vậy bạn không thể biên dịch thành native cho WPF/WinForms? –

16

Nếu bạn muốn bảo vệ mã của bạn, một obfuscator là cách tiếp cận điển hình. Dotfuscator đã tham gia cuộc đua vũ trang với phản xạ trong một thời gian và chúng tôi sử dụng nó trên các sản phẩm của mình. Tuy nhiên, trong thực tế, một con người có kỹ năng có thể dễ dàng đọc được mã bị xáo trộn.

Biên dịch thành mã gốc sẽ đánh bại mục đích của việc có ngôn ngữ được quản lý. Lợi ích chính là để cho phép thời gian chạy đích để JIT IL thành một cái gì đó có khả năng tối ưu nhất cho CPU mục tiêu. Nếu bạn muốn khác, bạn sẽ sử dụng một cái gì đó giống như ahead-of-time option in mono.

+0

Không Dotfuscator chỉ obfuscate tên biến để nó khó đọc hơn? Và tôi nhận được rằng tôi sẽ không nhận được tối ưu hóa thời gian chạy, và tôi đồng ý với điều đó. Mục đích chính của tôi trong việc sử dụng C# là sự dễ dàng và vẻ đẹp của cú pháp và thư viện của ngôn ngữ, các tối ưu hóa tiện lợi đến thứ hai. – mrduclaw

+18

"Biên dịch thành mã gốc đánh bại mục đích của việc có một ngôn ngữ được quản lý" --Đây không phải là sự thật. – zezba9000

+0

Một tính năng của các ngôn ngữ .NET được quản lý là chúng có thể ** an toàn một cách đáng tin cậy **.Việc biên dịch IL an toàn một cách đáng tin cậy thành mã gốc không mất tính năng cụ thể này. Ngoài ra, những gì bạn mô tả là "lợi ích chính" * thậm chí không tồn tại trong thực tế (thậm chí không 5 năm sau khi bạn viết câu trả lời này): Trong khi có thể về lý thuyết, trình biên dịch JIT của .NET cực kỳ bảo thủ và tối ưu hóa đáng chú ý điều đó đã xảy ra kể từ khi thành lập được cải thiện thông lượng ** mã **. Không có công việc nào được thực hiện để tối ưu hóa mã nguồn gốc được phát ra. – IInspectable

7

NGEN thêm mã gốc nhưng không loại bỏ MSIL. Do đó, bất kỳ công cụ nào hoạt động trên MSIL vẫn có thể hoạt động. Bạn cũng cần điều này cho sự phản chiếu, cái gì đó sẽ rất khó cho một trình biên dịch gốc thực sự.

+0

Không có mã của tôi sử dụng rõ ràng Reflection, và tôi OK mà không có nó. Chặn một số hạn chế về ngôn ngữ, điều này có khả thi không? – mrduclaw

+0

Bạn biết điều đó, nhưng trình biên dịch C# -to-native giả định không thể thực sự giả định nó. – MSalters

26

Đó không phải là cách ngen.exe hoạt động. Nó chỉ chạy trình biên dịch JIT phía trước để tạo ra mô-đun .ni.exe hoặc .ni.dll. Tệp nhị phân đó không chứa siêu dữ liệu, chỉ có mã máy được tạo từ IL cho các thân phương thức. CLR vẫn phải tìm bản gốc. Chỉ sau đó nó có thể xác định rằng có một hình ảnh ngen-ed có sẵn để nó có thể sử dụng mã máy từ nó hơn là tạo ra nó từ IL của hội đồng.

Ngen.exe tăng tốc thời gian khởi động ấm cho ứng dụng của bạn, vậy thôi.

Lời khuyên thông thường của tôi cho bất kỳ ai có thể quan tâm đến việc tháo rời các hội đồng của tôi là chỉ cho họ tới sourceforge.net. Nó có terabyte mã nguồn, được viết và duy trì bởi các lập trình viên thường tốt hơn tôi. Đôi khi ngay cả với ý kiến ​​tốt. Nếu obfuscator của bạn không hoạt động tốt sau đó cửa hàng xung quanh cho một tốt hơn. Có nhiều.

+2

Cảm ơn bạn! Đó chính là lời giải thích mà tôi đang tìm kiếm về những gì 'ngen' đang làm. Bạn có bất cứ đề nghị về một, obfuscator tốt, miễn phí? – mrduclaw

+1

Tôi chỉ biết những người tháo rời tốt và miễn phí. Một disassembler phải được miễn phí, yêu cầu tiền cho nó đánh bại mục đích sử dụng một. Obfuscators tốt chi phí tiền bạc. Visual Studio đi kèm với một, Dotfuscator. Tôi chưa bao giờ nghe nói đến một công ty bán sản phẩm dựa trên mã nguồn bị nứt được bảo vệ bởi Dotfuscator. Điều đó cho thấy nó hoạt động tốt. –

8

Muỗng (trước đây là Xenocode) có a product that might fit your needs. Chúng tôi sử dụng nó cho một giao diện người dùng cài đặt dựa trên WPF vì vậy chúng tôi không phải bootstrap .net để tải chương trình thiết lập chính nó.

+0

Điều này có vẻ tuyệt vời, nó chỉ đắt hơn một chút so với tôi vì tôi chỉ là một nhà phát triển đơn độc và không làm điều này cho một công ty. – mrduclaw

+0

Thực tế giá có thể hơi cấm. Nó hoạt động tốt mặc dù. Không chắc chắn nếu có bất kỳ nguồn mở hoặc lựa chọn thay thế khác ra khỏi đó. Một nhược điểm khác là nó có kết quả thực thi rất lớn nhưng ảo hóa môi trường khá trơn tru. – dkackman

4

Tôi có thể quay lại và hỏi tại sao bạn đang tìm loại bảo vệ này. Tôi không cố gắng để tranh luận rằng bạn không cần sự bảo vệ, nhưng tôi nghĩ rằng nó là giá trị hiểu được động lực. Ví dụ, nếu bạn muốn bảo vệ bởi vì bạn có một thuật toán trong hệ thống của bạn, nơi nó sẽ tàn phá an ninh nếu ai đó thiết kế ngược nó, thì bạn có thể cần phải xem xét một cách tiếp cận khác. Nó có nghĩa là có một lỗ hổng trong thuật toán và không có số lượng obfuscation hoặc bản dịch gốc sẽ giúp bạn ở đó.

Nếu là vấn đề của IP, thì tôi nghĩ obfuscation có lẽ là cách tiếp cận tốt nhất của bạn ở đây. Nó giống như đặt một khóa trên cửa của bạn. Ai đó có thể phá khóa và vào trong, nhưng họ cố tình làm điều đó trái ngược với việc chỉ bước vào cửa.

+0

Ồ không, thuật toán của tôi không làm gì lạ mắt. Đó là một nơi nào đó giữa sự tò mò về học thuật và các mối quan tâm về IP. Tôi nghĩ rằng một obfuscator phong nha (nhưng miễn phí) có lẽ sẽ phù hợp với tôi tốt cho mối quan tâm IP của tôi, nhưng tôi có một gói mã tùy chỉnh mà tôi đã viết trước đó mà tôi muốn sử dụng trên các ứng dụng NET của tôi là tốt. Bất kỳ đề xuất cho một obfuscator? – mrduclaw

5

đây là một obfuscator miễn phí, đó là yên tĩnh tốt: eazfuscator

+4

Miễn phí trong 30 ngày sử dụng. * –

3

Điều này có thể sử dụng trình biên dịch IL2CPU. IL2CPU được phát triển bởi cùng những người tạo ra COSMOS (Hệ điều hành được quản lý nguồn mở C#) và chỉ có sẵn bằng cách tải vũ trụ. IL2CPU tạo ra các tệp ASM có thể được biên dịch thông qua Nasm (một số trình assembler khác có thể hoạt động nhưng tốt nhất là sử dụng nasm). vấn đề duy nhất với IL2CPU là nó được xây dựng trong Dự án Cosmos và rất khó để có được nó chạy một mình.

+0

Điều này có vẻ như hoạt động dựa trên IL2C tại https://csnative.codeplex.com/ (liên kết đó có thể biến mất ngay sau khi tắt mã hóa) –

17

Hôm qua, tại , Microsoft đã thông báo .NET Native. Theo số FAQ, "... Ban đầu, chúng tôi đang tập trung vào các ứng dụng Windows Store với .NET Native. Về lâu dài, chúng tôi sẽ tiếp tục cải thiện việc biên dịch gốc cho tất cả các ứng dụng .NET."

+0

Nhưng làm cách nào để sử dụng trong VS2013? Tôi không có giấy phép VS2015 vì vậy tôi muốn sử dụng .Net Native trong VS2013 –

+1

@EldarZeynalov Có lẽ bạn nên xem VS2015 Community Edition? – Redacted

4

Đây là cuối cùng có thể sử dụng Microsoft .NET Native biên dịch

Nó tự động biên dịch các phiên bản phát hành của ứng dụng được viết bằng mã số quản lý (C# hoặc Visual Basic) và mục tiêu mà .NET Framework và Windows 10 thành mã gốc.

..

• ứng dụng của bạn sẽ cung cấp hiệu suất vượt trội của mã nguồn gốc.

• Bạn có thể tiếp tục chương trình trong C# hoặc Visual Basic.

• Bạn có thể tiếp tục tận dụng các tài nguyên do .NET Framework cung cấp, bao gồm thư viện lớp học, quản lý bộ nhớ tự động và thu gom rác thải và xử lý ngoại lệ.

Đối với người dùng của ứng dụng của bạn, NET Native cung cấp các ưu điểm:

• Thời gian thi công nhanh

• khởi động lần Kiên nhanh chóng

• triển khai và cập nhật chi phí thấp

• Tối ưu hóa sử dụng bộ nhớ ứng dụng

Nhưng .NET Native liên quan đến nhiều hơn một trình biên dịch thành mã gốc. Nó biến đổi cách mà các ứng dụng .NET Framework được xây dựng và thực hiện. Cụ thể:

• Trong quá trình biên dịch trước, các phần bắt buộc của Khuôn khổ .NET được liên kết tĩnh vào ứng dụng của bạn. Điều này cho phép ứng dụng chạy với các thư viện ứng dụng cục bộ của .NET Framework và trình biên dịch để thực hiện phân tích toàn cầu để cung cấp các chiến thắng hiệu suất. Kết quả là, các ứng dụng sẽ khởi chạy nhanh hơn ngay cả sau khi cập nhật .NET Framework.

• Thời gian chạy .NET Native được tối ưu hóa cho việc biên dịch tĩnh và do đó có thể cung cấp hiệu năng vượt trội. Đồng thời, nó vẫn giữ lại các tính năng phản chiếu cốt lõi mà các nhà phát triển thấy rất hiệu quả.

• .NET Native sử dụng cùng một đầu cuối như trình biên dịch C++, được tối ưu hóa cho các tình huống biên dịch tĩnh.

https://msdn.microsoft.com/en-us/library/dn584397(v=vs.110).aspx

này chỉ có sẵn với VS.NET 2015.

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