2011-07-06 18 views
6

EDIT:Làm thế nào để phân biệt các hàm do người dùng định nghĩa/thư viện từ một tệp được biên dịch?

Những gì tôi muốn là để phân biệt liên kết tĩnh chức năng thư viện và người dùng tự viết chức năng trong một file biên dịch (ví dụ tập tin PE).

Làm cách nào để đạt được điều đó? (Tôi đang nghĩ đến việc so sánh cơ sở dữ liệu nhưng tôi không biết bất kỳ cơ sở dữ liệu nào.)

Nhân tiện, (Tôi đã biết từ lâu trước khi tôi hỏi câu hỏi này) cho chức năng thư viện được liên kết động, chúng chỉ là một mục nhập bảng (của PE).


Chức năng thư viện, ý tôi là những thư viện được định nghĩa trong thư viện, chẳng hạn như STL (Tôi biết đây là tên xấu).

Do các hàm do người dùng xác định, ý tôi là các hàm được viết bởi các lập trình viên riêng lẻ.

Có cách nào có lập trình để đạt được mục tiêu này không?

Hiện tại tôi đang suy nghĩ về việc so sánh các tệp nhị phân với cơ sở dữ liệu, nhưng tôi không biết bất kỳ cơ sở dữ liệu nào cho đến nay.

Vui lòng giới thiệu cơ sở dữ liệu hoặc cách khác để làm câu trả lời. Cảm ơn bạn.

+0

chỉ bằng cách thông tin: Trình phân tách IDA có tệp "FLIRT signature" mà nó sử dụng để cố gắng xác định loại thông tin này và thành công vừa phải. vì vậy, vì nó đã được lập trình trước đó, có, nó là có thể. Tôi chắc chắn đó là một nỗ lực lớn để làm điều này mặc dù, và bạn sẽ cần phải tạo ra của riêng bạn hoặc sử dụng chữ ký của người khác. Ngoài ra, nó không phải là một tỷ lệ thành công 100%, * đặc biệt là cho các tập tin tối ưu hóa *. nếu tập tin đã được tối ưu hóa, nó gần như không thể (ngay cả bằng tay bằng cách sử dụng một công cụ tốt đẹp như IDA) để tìm ra chính xác những chức năng nào là những gì từ các thư viện. – shelleybutterfly

+0

để gỡ lỗi các bản dựng, có thể khả thi hơn. nhưng tôi sẽ nói nếu một công cụ đã được miễn là IDA vẫn không thể làm điều đó, bạn sẽ có một con đường dài phía trước của bạn nếu bạn cố gắng để cuộn giải pháp của riêng bạn ở đây, và nó có khả năng vẫn còn khá hoàn hảo và thậm chí không đến gần 100% trên các tệp được tối ưu hóa cao. liên kết đến ida nếu bạn muốn kiểm tra xem nó: http://www.hex-rays.com/idapro/ (tôi không chắc chắn bao nhiêu chức năng phiên bản demo có nhưng nó ít nhất sẽ cung cấp cho bạn một ý tưởng, tôi nghĩ rằng, về những gì tôi đang mô tả.) – shelleybutterfly

+0

@shelleybutterfly thực sự, mục đích của câu hỏi này là hỏi IDA đạt được điều này như thế nào ... –

Trả lời

1

Câu trả lời này giả sử bạn muốn phân tích tệp thực thi Windows chuẩn được liên kết động với các thư viện nhập khác (tệp .lib và assoicated .dll không được liên kết tĩnh) và nếu trường hợp này xảy ra, bạn muốn xen kẽ cấu trúc tệp PE (Portable Executable).

Dưới đây là một số good article để giúp bạn bắt đầu, với mã mẫu trên bán phá giá tiêu đề PE.

Bạn sẽ muốn tập trung vào bảng nhập (phần .idata) cho các cuộc gọi thư viện bên ngoài và bảng xuất (phần .edata) cho các cuộc gọi được xác định bên trong tệp thực thi và được đánh dấu là có thể xuất (thường chỉ tồn tại trong .dll. các tập tin). Đối với các thư viện tĩnh, định dạng của chúng được gọi là COFF và có tiện ích DUMPBIN đi kèm với Visual Studio mà bạn có thể sử dụng để nhanh chóng tham gia vào các tệp lib của bạn và thậm chí là tháo gỡ mã nếu bạn muốn.

Tiện ích dumpbin, được cung cấp với các phiên bản 32-bit của Microsoft Visual C++, kết hợp khả năng của LINK, LIB, và tiện ích EXEHDR. Sự kết hợp của những công cụ này có khả năng để cung cấp thông tin về định dạng và biểu tượng được cung cấp trong tệp thi hành, thư viện và tệp DLL.

Để biết thông tin về cấu trúc của tệp COFF, hãy xem điều này article.

Tìm hiểu xem cuộc gọi hàm có từ lib hay không sẽ phức tạp, nhưng từ những gì tôi nhớ, hầu hết lệnh gọi tĩnh trong mã thực sự là cuộc gọi thunk (lệnh jmp đơn giản đến mã đối tượng thực được sao chép từ thư viện) và có kích thước nhỏ (thường là khoảng 5 byte), trong khi "người dùng xác định" không phải là khối, và là bp dựa trên các cuộc gọi khung.

+0

Câu hỏi của tôi là: cách phân biệt chúng? Tiêu chí của bạn dường như không rõ ràng. –

+0

Bạn có thể làm rõ những gì bạn đang tìm kiếm không? Trong phần đầu tiên của câu trả lời của tôi, nếu bạn đang sử dụng một thư viện nhập khẩu được liên kết động, các "hàm thư viện" của bạn sẽ xuất hiện trong bảng Import của tệp PE. – GalacticJello

+0

Cách phân biệt các hàm được liên kết tĩnh với chức năng tự viết của người dùng? –

1

Khi chương trình của bạn được liên kết, các hàm tĩnh và hàm do người dùng xác định là bao gồm tệp theo tệp. Vì vậy, nếu bạn đổ tiêu đề của một tập tin PE, và nhìn vào các biểu tượng bảng (sử dụng objdump -x nếu bạn chạy với mingw32, hoặc bất cứ điều gì khác) bạn sẽ thấy tên của một tập tin và sau đó tất cả các chức năng nhập từ tên này, sau tên tệp khác và chức năng của nó ...
Hoặc nếu bạn có thông tin gỡ lỗi, có thể điều này có thể dễ dàng hơn.

Vì vậy, sau khi bạn liên kết các hàm với một tệp, bạn có thể sắp xếp các hàm bằng cách phân tích tên tệp của chúng. Tìm kiếm extention (.c/.lib/.a) hoặc kiểm tra trong danh sách tệp bạn có ở đâu đó. Hãy cẩn thận để loại bỏ các tệp crt0 ...

Tuy nhiên đây là một giải pháp khôn lanh và tôi không chắc chắn điều này sẽ làm việc cho mọi chương trình.

+0

Điều bạn nói là liên kết động. –

+0

Không, đối với liên kết động bạn chỉ cần đọc cờ và bạn sẽ không có mã cho hàm. Ở đây bạn có một hàm và mã của nó nằm trên phần .text. Vì vậy, không có sự khác biệt với mã xác định người dùng. Nhưng bạn có thể đọc từ tập tin nguồn mà nó đến từ ... – AxFab

+0

Vì vậy, tôi phải duy trì một cơ sở dữ liệu về "nguồn"? –

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