Tìm hiểu về PE file (phần 2)

Chap 3 : Unikey (tiếp )

IV. Cấu trúc Option
A. Cấu trúc
Phần tiếp theo là phần Option với cấu trúc như sau
( các bạn có thể thấy cấu trúc này trong file winnt.h)

PHP Code:
struct IMAGE_OPTIONAL_HEADER
{
// Các trường chuẩn
WORD  Magic;
BYTE   MajorLinkerVersion;
BYTE   MinorLinkerVersion;
DWORD   SizeOfCode;
DWORD   SizeOfInitializedData;
DWORD   SizeOfUninitializedData;
DWORD   AddressOfEntryPoint;
DWORD   BaseOfCode;
DWORD   BaseOfData;
 

//Các trường mở rộng của hệ điều hành windows NT
DWORD   ImageBase;
DWORD   SectionAlignment;
DWORD   FileAlignment;
WORD  MajorOperatingSystemVersion;
WORD  MinorOperatingSystemVersion;
WORD  MajorImageVersion;
WORD  MinorImageVersion;
WORD  MajorSubsystemVersion;
WORD  MinorSubsystemVersion;
DWORD   Reserved1;
DWORD   SizeOfImage;
DWORD   SizeOfHeaders;
DWORD   CheckSum;
WORD  Subsystem;
WORD  DllCharacteristics;
DWORD   SizeOfStackReserve;
DWORD   SizeOfStackCommit;
DWORD   SizeOfHeapReserve;
DWORD   SizeOfHeapCommit;
DWORD   LoaderFlags;
DWORD   NumberOfRvaAndSizes;
}

B. Sơ lược về cấu trúc này :
+ magic : chả cần biết nó làm gì , nó cũng ko quan trọng lắm đâu…

+ MajorLinkerVersion, MinorLinkerVersion : đây là 2byte , trong các IDE cũ hơn thì nó định nghĩa theo kiểu unsigned char , nhưng dù gì thì cũng ko quan trọng, vì cái ý nghĩa của nó mới là quan trọng, 2 giá trị này chỉ ra phiên bản của linker đã linked nên nó

Chú ý thích về từ link này tí :

và 2 trường MajorLinkerVersion, MinorLinkerVersion sẽ nêu lên phiên bản của linker nói trên,

…………
+MajorOperatingSystemVersion,MinorOperatingSystemVe rsion : 2 trường này nói nên phiên bản của hệ điều hành

Chú ý 2 : ví dụ version 7.01 thì : version này sẽ ko bị mã hóa theo chuẩn float nào cả, mà phần Major sẽ nêu nên số 7 và == 0x7
phần Minor sẽ == 0x1……

C. Các phần quan trọng
Vì tên ở trên cũng có khá rõ rồi , langman mạn phép trình bày thẳng vào các trường quan trọng bắt buộc phải nắm rõ nhé :

1. AddressOfEntryPoint : Nghe tên của trường này ta cũng biết là nó trỏ đến câu lệnh khởi đầu ( nó trỏ vào đâu thì đó là câu lệnh đầu tiên của chương trình được loader của hệ điều hành chạy).

+Nếu là 1 file nguyên thể, ko pack, protect, compress gì cả thì nó sẽ trỏ đến điểm đầu tiên chạy thật của ct. thường là nằm trong section .TEXT ( nếu là sảm phẩm cháu của MS ), CODE (nếu là cháu của Borland). Điểm chạy này được gọi là OEP : Original Entry Point

+Đối với 1 file bị virus quản lý, nó sẽ thêm 1 section .text vào, sau đó cho trường trỏ vào virus body của nó. sau khi nó chiếm được quyển, làm được những việc nó muốn nó mới nhảy đến OEP, ct mới được thực hiện…..
(mình ko có file nào bị nhiễm virus để debug cho bạn xem cả)

+Đối với 1 file bị pack,compress trường này sẽ trỏ đến đến section khác, thường là trỏ đến decompression stub để nhằm giải xả nén ra các các section khác lên bộ nhớ, sau đó mới cho nhảy về OEP, nói chung là nhay đển section khác, sau đó mới trả về OEP, ví dụ :

Các bạn xem ở ví dụ trên với game pikachu, ta thấy có 1 cái section tên là .aspack và trường trỏ đến vùng nhớ này !!! vậy là khi ta bật lên, ta sẽ nhảy ngay đến section này và thực hiện các code của aspack…

+Ở chế độ bảo vệ Starforce thì trường này sẽ trỏ đến 1 Vitual Address (địa chỉ ảo), vì lúc này code section (.text) vẫn có mặt trên ổ file nhưng lại ko được ánh xạ lên bộ nhớ ảo, mà sẽ được nạp lên trong quá trình thực thi (có thể là nạp đến đâu thực thi đến đấy, có thể là nạp hết , có thể là từng đoạn , còn tùy vào nhiều yếu tố ( sẽ được trình bày ở các phần sau )

Đây là 1 trường cực kì quan trọng, rất có ý nghĩa.

2. ImageBase : Địa chỉ nạp ưu tiên cho PE file. Windows loader sẽ cố gắng ánh xạ file vào vùng nhớ ảo có địa chỉ bắt đầu tại ImageBase. Ở đây langman dùng từ cố gắng và ưu tiên bởi vì nếu “đất đã có chủ” rồi thì windows loader sẽ đành phải dùng vùng lân cận.
99% trường này có giá trị bằng 00400000h điều này giải thích cho tại sao có nhận định ở chap1.
Mở rộng thêm đôi chút : đối với Visual Studio 2005 trở lên, thì giá trị 00400000h ko còn được dùng nhiều nữa .

Ta thấy :
+ OEP trỏ đến đến câu lệnh khởi đầu ( nhưng mà là ở trong file )
+ ImageBase cho ta địa chỉ ánh xạ ưu tiên.
vậy : câu lệnh khởi đầu trên bộ nhớ ảo sẽ có địa chỉ :
OEP + ImageBase
Chúng ta cùng nhau xem lại hình này sẽ thấy ngay điều đó :

 

Chap 4 : Unikey (Tiếp)

C. Các phần quan trọng
3. SectionAlignment
Không gian của các section trong bộ nhớ ảo. Khi file thực thi được ánh xạ lên bộ nhớ ảo thì địa chỉ bắt đầu sẽ là bội số của giá trị này. Giá trị của trường này nhỏ nhất là 0x1000. Đối với các linker của Borland thì thường lấy 0x10000h==64KB (1 segment).

Ví dụ : trường này có giá trị là 0x1000 , thì section tiếp theo (nếu đặt gần nhất) phải bắt đầu tại địa chỉ cũ + 0x1000.

Ví dụ cụ thể hơn :
Giả sử section đầu tiên bắt đầu tiên bắt đầu tại 0x00401000 và có độ rộng là 10byte. Thì section tiếp theo (nếu đặt gần nhất ) sẽ là 0x00402000 ( mặc dù không gian giữ 0x00401000 và 0x00402000 chả sử dụng làm gì cả)
Thực tế thì các section tiếp theo có thể phân bố rời rạc hơn ví dụ tại 0x0040300 hoặc 0x0040900, quan trọng nhất là khoảng cách phải chia hết cho 0x1000
Minh họa:

Các Virus 32 rất chú ý tến trường này phục vụ cho việc tính toán chính xác xem body của nó nằm ở đâu, nhưng chúng cũng ko mấy khi thay đổi trường này

Các bạn chú ý , giá trị trên kia liên quan đến bộ nhớ ảo , ko lại lầm lẫn với trường tiếp theo .

4. FileAlignment : Độ rộng của section trên file sẽ là bội của trường này, cũng có ý nghĩa giống như trường trên nhưng :
+ đây là ở trên file
+ Không gian rỗng ko được sử dụng hoặc ko được định nghĩa (thường thì có giá trị == 0 )

5. SizeOfImage : được hiểu bằng size của tất cả các header + dung lượng thật của các section liên kết với trường SectionAlignment

Ví dụ vui tí : tôi đọc trường này của game pikachu là 950272, sau khi tôi unpack game này thì được 1 file có dung lượng == 950272 byte
………

6. SizeOfHeaders : nghe tên là biết rồi , độ lớn của total header, nó cũng là offset truy cập đến section đầu tiên, (trong file)

……… END ……..

Vâng thưa các bạn, chúng ta tạm dừng việc nghiên cứu PE file format đối với Unikey tại đây. Tất nhiên chúng ta sẽ nghiên cứu tiếp,và loạt tut này vẫn còn nhiều chap, nhưng với đối tượng khác để dễ tiếp cận hơn, và nhiều thú vị hơn

 

Nguồn: langman – Cộng đồng C việt.com

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s