2011-09-10 36 views
12

Nếu tôi NGen một hội đồng, nó là bình thường mà ildasm vẫn disassembles nó?Chúng ta có thể tháo rời (sử dụng ILDasm) một hội đồng NGen-ed không?

Ok. Tôi đã viết một thư viện lớp HelloWorld và dll tiếp theo được đặt tên là NGenILDasmTest.dll. -> mục tiêu cho fw Net 4.

Từ Vs 2010 dấu nhắc lệnh, tôi đã làm

gacutil -i NGenILDasmTest.dll 

tôi có thể thấy việc lắp ráp cài đặt trong GAC. Và tôi chạy ildasm vì vậy tôi có thể xem IL. Cho đến nay rất tốt.

Sau đó, tôi chạy

ngen NGenILDasmTest.dll 

(tôi không chỉ định bất kỳ tùy chọn cho ngen). Và hội đồng này đã được biên soạn thành công. Tôi nằm đó với một tên NGenILDasmTest.ni.dll trong thư mục

C:\Windows\Assembly\NativeImages_v4.0.30319_32\NGenILDasmTest\81d49dd4c7df22fb3df530402b58ffc9 

Bây giờ, khi tôi chạy ildasm như dưới đây

ildasm "C:\Windows\Assembly\NativeImages_v4.0.30319_32\NGenILDasmTest\81d49dd4c7df22fb3df530402b58ffc9\NGenILDasmTest.ni.dll" 

tôi có thể xem nội dung của hội Ngen-ed. Điều này có bình thường không ?.

Về mặt kỹ thuật, Ngen tạo ra các nguyên tắc CPU gốc cho IL (và dường như đặt nó dưới C: \ windows \ Assembly \ NAtiveImages_V4. ##### _ 32 - trong trường hợp của tôi). Nếu đúng như vậy, tôi vẫn có thể thấy hội đồng NGen-ed như IL bằng ILDasm như thế nào?

Hãy giúp tôi hiểu rằng 'điều gì đó' mà tôi thiếu ở đây.

Trả lời

14

Hội đồng NGEN'ed là mã IL cộng với mã gốc. IL không bị tước bỏ. Thường có sự nhầm lẫn rằng các cụm NGen chỉ chứa chỉ hình ảnh gốc. Thông tin ban đầu vẫn cần cho siêu dữ liệu.

Microsoft dường như không có thông tin rất cụ thể về nội bộ của hội đồng NGen. Hầu hết thông tin mà chúng tôi biết là từ kỹ thuật đảo ngược.

EDIT:

Sau khi cài đặt .NET Framework 1.1 (yay ..) - có vẻ như NET 1.1 NGen không dải ra IL. Nó trông giống như bắt đầu trong v2 - IL được lưu giữ. Điều này có vẻ là lý do tại sao có mâu thuẫn thông tin nằm xung quanh. Lý do chính xác thay đổi này đã được thực hiện dường như không được biết đến.

Có một bài viết tốt trên một số internals ngen (và làm thế nào nó là một ý tưởng vô cùng xấu cho obfuscation) ở đây: http://www.woodmann.com/forum/entry.php?68-Rebuilding-native-.NET-exes-into-managed-.NET-exes-by-Exploiting-lefotver-IL ...

Bây giờ, điều thú vị về Ngen là nó không loại bỏ IL hoặc siêu dữ liệu, bởi vì trong khi mã IL không cần thiết để thực thi, siêu dữ liệu là do tất cả các chuỗi và dữ liệu có liên quan khác mà nhu cầu của chương trình được chứa trong siêu dữ liệu. Vì vậy, Ngen sao chép tất cả các siêu dữ liệu vào.Phần IL của bản gốc exe, và sao chép mã IL như một sự suy nghĩ

+0

+1, điều này có vẻ chính xác. –

+0

@vcsjones Tôi đồng ý! Liên kết đó trong câu trả lời của bạn giải thích tất cả. Kỹ thuật đảo ngược thực sự. Trong khi đó tôi đã thử xây dựng bởi NGenILDasmTest.dll trong cả hai/phát hành và/chế độ gỡ lỗi tách biệt. Điều đó dường như không tạo ra bất kỳ sự khác biệt nào. Một điều nữa được quan sát là hội đồng gốc NGenILDasmTest.dll có kích thước 5KB như Explorer cho thấy nó, và cụm lắp ráp Ngen-ed NGenILDasmTest.ni.dll là 10KB. Nếu không có suy nghĩ thứ hai, điều đó làm cho tôi tin rằng tuyên bố "Hội An NGEN'ed là IL cộng với mã nguồn gốc". – gmaran23

4

Nếu bạn nhìn vào chế độ hỗn hợp nhanh/dễ dàng, hãy viết bộ nạp khởi động cho hội đồng của bạn sẽ tải di sản .NET FW 4.0 thông qua COM trong mã nguồn gốc, và sử dụng một giao diện công khai được khai báo từ phần được quản lý, trt .tlb được tạo ra cho assembly được quản lý của bạn) được lưu trữ như một tài nguyên được mã hóa (sử dụng RSA) và mã hóa mã C + + gốc. cả hai hội đồng. Điều đó sẽ ngăn chặn ILDASM lắp ráp của bạn vẫn cho phép bạn gỡ lỗi và xây dựng dự án (sử dụng các sự kiện xây dựng)

+0

Thx. Tôi đoán tôi sẽ phải cho nó một shot. – gmaran23

+0

Bạn có cần dự án mẫu để bắt đầu không? Tôi có thể cung cấp cho bạn một mẫu, nếu bạn muốn. –

+0

@Artur, tôi muốn xem mẫu của bạn ... – gap

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