Trao đổi với tôi

http://www.buidao.com

12/6/09

[PE File] Cấu trúc PE Header.

Chuẩn PE (Portable executable) là một chuẩn của file chương trình dành cho hệ điều hành Windows NT, Windows 95 và các hệ Win32 khác. Nó cũng còn được sử dụng cho các file đối tượng và các file thư viện.

Chuẩn này được Microsoft thiết kế vào năm 1993 dựa theo tiêu chuẩn của tổ chức TIS (Tool interface standard). Tổ chức này bao gồm các công ty lớn như Microsofl, Intel, Borland, Watcom, IBM và các tổ chức khác. Ban đầu chuẩn này được sử dụng trong các hệ thống UNIX và VMS.

Như chúng ta đã biết hiện nay chuẩn PE được sử dụng rất rộng rãi trên Windows. Chính vì thế việc tìm hiểu cấu trúc của file PE là một việc vô cùng quan trọng đối với lập trình viên hệ thống, và là kiến thức cơ bản không thể thiếu khi nghiên cứu virus.

Trong bài viết này chúng ta cùng tìm hiểu một cách cơ bản về file PE.

Overview
Về cơ bản một file PE có cấu trúc như sau :




Phần đầu mỗi file PE ta luôn thấy một đoạn chương trình tương thích MS-DOS (“DOS stub”). Đoạn chương trình này có chức năng gần như là một đoạn chương trình thông báo trong môi trường DOS. Các thông báo này đại loại như “This program can not be run in MS-DOS mode“ hoặc “This program requires Windows”.[/font][font=&quot] Sau đoạn DOS stub là PE header. Đây là một phần rất quan trọng của một file PE, nó chứa đựng đầy đủ những thông tin cần thiết cho việc nạp và thực thi chương trình.

PE Header

Địa chỉ đầu của PE Header là một DWORD nằm tại offset 0x3C của File. Như vậy để biết PE Header nằm ở đâu chúng ta đọc một DWORD tại vị chí 0x3C đó chính là điểm đầu của PE Header. Sau đây chúng ta sẽ tìm hiểu các trường trong PE Header



Ghi chú: RVA (Địa chỉ ảo tương đối ) là ký hiệu dùng để mô tả địa chỉ của một trường tương ứng với một địa chỉ đã xác định khi file được nạp vào bộ nhớ

Mô tả các trường:

- Signature Stamp : Kích thước 4 byte. Có giá trị tương ứng là “PE00”
- CPU Type : Kích thước 1 WORD. Biểu diễn kiểu CPU tương thích để chạy file này. Các giá trị tương ứng là :
Quote:
Giá Trị Kiểu CPU
0x0000 Unknow
0x01C4 80386
0x014D 80486
0x014E PentiumTM
0x0162 MISP Mark I (R2000,R3000)
0x0163 MISP Mark II (R6000)
0x0166 MISP Mark III(R4000)
- #Objects : Kích thước 1 WORD. Số lượng các Object (Section) có trong File. Trường này cũng xác định số đầu vào của Section Table.
- Time/Date Stamp : Kích thước 1 DWORD. Lưu giữ ngày giờ file được tạo ra hay thay bởi chương trình dịch.
- NT Hdr Size : Kích thước 1 WORD. Số lượng các byte còn lại của PE Header sau trường Flags.
- Flags : Kích thước 1 WORD. Là cờ bit miêu tả thuộc tính của File, giá trị cụ thể như sau:
Quote:
Flags bit Mô tả.
0x0000 File chương trình.
0x0002 File thực thi. Nếu bit này không được set thì có nghĩa là file không thể thực thi được do lỗi tại thời điểm dịch hoặc file bị thay đổi do đó không thể load được.
0x0200 Fixed. Chỉ ra rằng nếu file không thể nạp được tại Image Base thì sẽ không nạp file đó lên.
0x2000 File thư viện.
- Lmajor/Lminor : Kích thước mỗi trường là 1 WORD. Chỉ ra vesion của chương trình dịch.
- Entrypoint RVA : Kích thước 1 DWORD. Địa chỉ ảo tương đối của Entry Point. Địa chỉ này tương đối đối với Image Base. Đối với file chương trình thì địa chỉ đầu của đoạn mã, đối với file thư viện thì đây là địa chỉ khởi tạo của các hàm trong thư viện
- Image Base : Kích thước 1 DWORD. Địa chỉ ảo cơ sở của file. Đây sẽ là địa chỉ ảo của byte đầu tiên của file (DOS Header) khi được nạp vào bộ nhớ. Địa chỉ này phải là bội số của 64K.
- Object Align : Kích thước 1 DWORD. Khi file chương trình được nạp vào bộ nhớ mỗi Object (Section) được gán cho một địa chỉ ảo tương đối ( thường là bội số của giá trị này). Giá trị này phải là luỹ thừa của 2 và nằm giữa các giá trị 512 và 256M. Giá trị mặc định là 64K.
- File Align: Kích thước 1 DWORD. Như chúng ta đã biết trong file PE các section nằm ở các vị trí riêng biệt và nó có kích thước là bội của File Align. Như vậy File Align càng lớn thì khả năng file bị lãng phí khoảng trống càng nhiều. File Align là một số luỹ thừa của 2 và nằm giữa 512 và 64K.
- OS Major/Minor : Kích thước mỗi trường là 1 WORD. Version của OS cần thiết để chạy File này.
- User Major/Minor : Kích thước mỗi trường là 1 WORD. Số Version người dùng. Về lý thuyết thì số Version này được chương trình dịch đặt sau mỗi lần biên dịch.
- Subsys Major/Minor : Kích thước mỗi trường là 1 WORD. Số version của Subsystem.
- Image Size : Kích thước 1 DWORD. Kích thước “ảo” của file, tính theo byte, tức là kích thước của file khi được nạp vào trong bộ nhớ. Nó bao gồm tất cả các header và nó phải là bội số của Object Align.
- Header Size : Kích thước 1 WORD. Kích thước của phần Header, bao gồm DOS header, PE Header và Object Table.
- File Checksum : Kích thước 1 WORD. Kiểm tra toàn bộ file. Thương được chương trình dịch gán bằng 0.
- Subsystem : Kích thước 1 WORD.
- DLL Flags : Kích thước 1 WORD. Chỉ ra những yêu cầu đặc biệt đối với Loader.
- Stack Reserve Size : Kích thước 1 DWORD. Kích thước Stack dự trữ cho file này. Bộ nhớ sẽ dự trữ cho Stack kích thước trên, nhưng Stack được sử dụng chỉ là “Stack Commit Size”. Khi thực hiện chương trình trang tiếp sau của Stack sẽ là “trang gác”. Khi chương trình sử dụng stack đến “trang gác” thì trang này sẽ được nối tiếp vào Stack và trang tiếp sau nó sẽ trở thành “trang gác”. Cứ tiếp tục cho đến khi kích thước Stack được sử dụng bằng Reserve Size.
- Stack Commit Size : Kích thước 1 DWORD.
- Heap Reserve size : Kích thước 1 DWORD. Kích thước để dành cho Heap.
- Heap Commit Size : Kích thước 1 DWORD. Kích thước heap được sử dụng.
- Interesting VA/Size : Kích thước 1 DWORD.
- Export Table RVA : Kích thước 1 DWORD. Địa chỉ ảo tương đối của bảng Export. Địa chỉ này tương đối với Image Base.
- Import Table RVA : Kích thước 1 DWORD. Địa chỉ ảo tương đối của bảng Import. Địa chỉ này tương đối với Image Base.
- Resource Table RVA : Kích thước 1 DWORD. Địa chỉ ảo tương đối của bảng Resource. Địa chỉ này tương đối với Image Base.
- Exception Table RVA : Kích thước 1 DWORD. Địa chỉ ảo tương đối của bảng Exception. Địa chỉ này tương đối với Image Base.
- Security Table RVA : Kích thước 1 DWORD. Địa chỉ ảo tương đối của bảng Security . Địa chỉ này tương đối với Image Base.
- Fixup Table RVA : Kích thước 1 DWORD. Địa chỉ ảo tương đối của bảng Fixup . Địa chỉ này tương đối với Image Base.
- Debug Table RVA : Kích thước 1 DWORD. Địa chỉ ảo tương đối của bảng Debug. Địa chỉ này tương đối với Image Base.
- Image Description RVA : Kích thước 1 DWORD.Địa chỉ ảo tương đối của chuỗi các môdun được định nghĩa trong file.
- Machine Specific RVA : Kích thước 1 DWORD. Địa chỉ ảo tương đối của giá trị đặc trưng của Machine. Địa chỉ này tương đối với Image Base.
- Total Export Data Size : Kích thước 1 DWORD. Kích thước dữ liệu Export.
- Total Import Data Size : Kích thước 1 DWORD. Kích thước dữ liệu Import.
- Total Resource Data Size :Kích thước 1 DWORD. Kích thước dữ liệu phần Resource.
- Total Exception Data Size :Kích thước 1 DWORD. Kích thước dữ liệu phần Exception.
- Total Security Data Size :Kích thước 1 DWORD. Kích thước dữ liệu phần Security.
- Total Fixup Data Size :Kích thước 1 DWORD. Kích thước dữ liệu phần Fixup.
- Total Debug Directories :Kích thước 1 DWORD. Số lượng danh mục Debug.
- Total Description Size :Kích thước 1 DWORD. Kích thước dữ liệu phần Description.
- Machine Specific Size :Kích thước 1 DWORD. Kích thước dữ liệu phần Machine Specific.

Tài liệu tham khảo:
- Google
- MSDN
- File đính kèm.

Bản quyền bài viết thuộc về VirusVN. Xin vui lòng ghi rõ nguồn gốc.

Bài tiếp theo: Giới thiệu cấu trúc bảng Import/Export Table.

Link: http://www.virusvn.com/forum/showthread.php?p=11913#post11913