Như tôi đã đề cập trong nhận xét, điều này có thể bằng .NET bằng cách sử dụng không gian tên huyền diệu System.Reflection.Emit. Bạn chỉ cần tạo một DynamicMethod mới và phát ra bất kỳ [hợp lệ] opcodes vào nó, và sau đó gọi Invoke.
Tôi đã dành vài giờ cuối cùng để xây dựng một bản trình diễn đơn giản cho chương trình "sạch" sẽ tạo bản sao mới của chính nó bằng mã il đã mã hóa. Cách tiếp cận tôi đã đi là có một phương pháp Exec, lấy các il-byte (sử dụng MethodBase.GetMethodBody), mã hóa chúng và phát ra một hội đồng mới có khóa iv + và các byte được mã hóa. Phương pháp chính sau đó sẽ giải mã, tạo một DynamicMethod mới, gọi DynamicILInfo.SetCode và hy vọng làm việc. Nó không.
Máy mã hóa/giải mã hoạt động và mã được phát của tôi là chính xác. Tuy nhiên, có vẻ như bạn không thể lấy các byte thô từ một assembly và chỉ thực hiện chúng trong một assembly khác.
Dữ liệu (từ BitConverter.ToString) từ chạy A và chạy B.
A: 28-01-00-00-0A ...
B: 28-11-00-00-0A ...
Trừ khi bạn biết giá trị byte cho mọi mã vạch, hãy mở ILDAsm, chọn Xem> Hiển thị byte. Ngoài ra còn có giá trị Xem> Hiển thị mã thông báo cũng giúp gỡ lỗi. Nhấn ctrl-m cho Chế độ xem> Siêu dữ liệu> Hiển thị! để giải quyết các thẻ và các sinh vật huyền bí khác.
"28 01 00 00 0A" -> CALL 0A000001 -> [Theo ctrl-m] MethodBase.GetCurrentMethod
Những giá trị thẻ khác nhau được tạo ra liên tục bởi trình biên dịch. Điều này có nghĩa là không thể đảm bảo rằng mọi thứ sẽ hoạt động bằng cách sử dụng byte thô. Chỉ cần nghĩ về trường hợp phổ biến mà trình biên dịch chỉ tạo ra các thẻ cho mỗi cuộc gọi phương thức yêu cầu giải mã mảng byte của bạn, và bạn gọi Console.WriteLine trong mã được mã hóa của bạn. Không có mã thông báo như vậy được viết và bạn sẽ kết thúc bằng "Chữ ký nhị phân BadImageFormatException: Bad" khi gọi phương thức động của bạn.
Tôi để nó làm nhiệm vụ đọc (hoặc cho đến khi tôi lại chán) để chuyển mảng byte, trong quá trình phát, sang định dạng mà bộ giải mã có thể đọc và phát ra thành il byte thực. Quá trình phát sẽ tạo ra tất cả các thẻ cần thiết, vì vậy nó sẽ hoạt động.
Nếu bạn muốn gà ra khỏi tất cả các awesomeness phát ra opcodes, làm một số biên dịch năng động từ mã được lưu trữ như chuỗi (mà tất nhiên có thể được mã hóa). Điều này, tuy nhiên, mất cả thông minh, mát mẻ và mọi thứ khác có thể được sử dụng để đo lường sự khiếp sợ tinh khiết của nhà phát triển (BẠN!). Kiểm tra this tutorial để hiển thị nhanh việc biên dịch động và thực thi C# trong chuỗi.
Động cơ đa hình là gì? – OscarRyz
Đoán của tôi là động cơ đa hình có liên quan đến câu lệnh chạy trên? :) –
Bạn có dự định mã hóa các vi-rút được quản lý không? :) –