2010-05-23 18 views
9

Tôi cần phải phân tích cú pháp Win32 DLL/Exe đơn giản và nhận tất cả nhập và xuất từ ​​nó để hiển thị trên bảng điều khiển hoặc GUI (ví dụ: Win Forms). Có thể phân tích cú pháp Win32 DLL/Exe trong C# .NET bằng cách đọc các bảng xuất/nhập của nó và nhận các loại được quản lý từ nó? Vì nó không được quản lý PE, .NET không cho phép bạn chuyển đổi các tệp PE không được quản lý thành các assembly .NET được quản lý, nó chỉ tạo ra các assembly được quản lý COM.Phân tích cú pháp đồng bằng Win32 PE File (Exe/DLL) trong .NET

Làm cách nào tôi có thể phân tích các bảng này và thực hiện tất cả các phương thức của nó (chữ ký) ở dạng được quản lý. (ví dụ: nếu char * làm đối số, nó sẽ hiển thị dưới dạng IntPtr).

+0

Usman, không có như vậy nghĩ là "C# .NET". –

+0

Tại sao wiki cộng đồng này lại là? –

+0

@John: C# thuộc về .NET ..? Tôi đã nói điều gì đó kỳ lạ ..? – Usman

Trả lời

2

Phân tích các tệp PE có thể sử dụng Microsoft Portable Executable Specification Document. Tuy nhiên, như Logan lưu ý, các chữ ký là không phải được bao gồm trong tệp PE; chỉ bao gồm tên của các hàm được xuất.

CẬP NHẬT: Nếu dll của bạn là một dll C++ được tạo bởi một phiên bản gần đây của trình biên dịch C++ của Microsoft, thì bạn có thể undecorate tên bị xáo trộn để nhận hầu hết chữ ký bằng cách gọi hàm này: UnDecorateSymbolName từ Debugging Tools for Windows. Tuy nhiên, giá trị trả lại không được bao gồm trong tên bị xé.

+0

tên được trang trí. Khi bạn undecorate chúng, bạn nhận được chữ ký chính xác (ngoài tên tham số, chỉ cần loại). SO bằng cách này bạn có gần 90% chữ ký. – Usman

+0

Phần lớn các tệp DLL của Windows có giao diện kiểu C và các tên chưa được sắp xếp không có thông tin tham số. Nếu bạn có một số dll cụ thể trong tâm trí, sau đó như tôi đã nói bạn có thể kiểm tra những người có dumpbin. –

+0

Xem câu trả lời được cập nhật về việc đổi tên các tên C++ bị xé nhỏ. –

2

Liên quan đến phần thứ hai của câu hỏi của bạn, nhận được chữ ký của phương thức, đây là quy tắc chung, không thể. Thông tin đó thường không được lưu trữ trong chính PE. Đối với các hàm C++, nó có thể thực hiện được, bởi vì tên bị xáo trộn sẽ mã hóa thông tin đó, nhưng nhiều DLL không thể hiện các giao diện C++. Đối với các giao diện COM, thông tin này được lưu trữ trong một thư viện kiểu, thường được nhúng như một tài nguyên trong PE. Để xem nếu điều này là có thể cho các dlls cụ thể bạn có trong tâm trí bạn có thể sử dụng dumpbin và undec để xem nếu các chức năng là C++ tên bị xáo trộn. Nếu không, bạn sẽ cần một số nguồn thông tin khác như các tệp tiêu đề để tạo các chữ ký P/Invoke thích hợp (trong trường hợp này bạn có thể không cần phải phân tích cú pháp tệp PE).

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