Trao đổi với tôi

http://www.buidao.com

12/2/09

[PE File] Tutorial 0 : General PE files

Tutorial 0 : General PE files

Author: Benina

Đối với lập trình Masm32 , để làm việc trên các file có đuôi .exe, chúng ta cần hiểu cấu trúc của nó . Đây là một đề tài hấp dẫn nhưng cũng ko dễ xơi chút nào. Tôi và các bạn sẽ cùng nhau tiếp cận từng chút từng chút một đề tài này. Đối với lọat tuts này tôi cũng dựa trên các tuts về PE files trên website : http://win32asm.cjb.net/. Tut đầu tiên này, chúng ta hảy tìm hiểu khái quát về PE files . Tut này tôi đã viết lâu rồi và đã đăng trên diễn đàn REA (http://reaonline.net) – một diễn đàn cracker rất nổi tiếng của Việt Nam.

Như các bạn thấy, trên 4rum chúng ta có rất nhiều câu hỏi về unpack [1] như : EP là gì, OEP là gì, RVA, IAT là gì.... Nhưng ko ai nói, ko ai giải thích, và hình như ít ai quan tâm. Có thể có người hiểu thấu đáo, nhưng cũng có các bạn ko có khái niệm gì. Nghe như vịt nghe sấm. Mà cụ thể là tui (hihi). Ko gì phải mắc cỡ, kiến thức kém thì bổ xung thêm. Ko ai chỉ thì tự hoc. Con kiến tha hòai cũng đầy tổ. Nước chảy đá mòn. Đọc hòai cũng hiểu.Vì vậy tui bắt đầu bắt tay ngâm cứu cái gọi là PE mà các bạn thấy nhan nhản trong các 4rum về crack nhưng trong đầu của chúng ta chỉ có vài khái niệm mơ hồ về nó (giống như tui vậy). Tut này chỉ là một chuyến khám phá “đảo châu báo này”.

Kiến thức về PE rất cần thiết để chúng ta vươn cao hơn nữa, nhưng thật sự nó thật khô khan và khó nhai. Đọc các tài liệu về PE thì ko biết đường đâu mà mò. Tùm lum chi địa. Bởi vậy , tui viết bài này, ko phải là một bài tut mà chỉ để chúng ta cùng học và cùng thảo luận. Nếu sai sót gì các bạn chỉ giáo. Còn nếu những điều viết dưới đây đúng thì “lạy chúa, con đi đúng đừơng”.

Các bạn sẽ hỏi: tại sao crack mà cần học về PE?. Học để làm gì vậy trời?. Umh, khi học unpack bằng tay,hay chống các anti-crack, các bạn sẽ cần những kiến thức này các bạn ạ. Và nó còn ứng dụng rất nhiều, gian tà có, chính quy có. Nói tóm lại, theo Benina thì bổ dưỡng nhiều hơn. Biết về nó thì chắc chắn 1 điều là các bạn đã bước vào thế giới huyền bí của máy tính.

Một điều nữa, Benina sẽ dùng 1 số từ tiếng Anh kỹ thuật trong TUT này. Ko dịch ra tiếng Việt để các bạn có thể đọc các TUT về PE files = tiếng Anh cho dễ dàng.

Bây giờ bắt đầu.

PE file là gì?.

PE là từ viết tắt của Portable Executable. Nó là quy tắc định dạng (format) file của Win32. Hay nói rõ hơn nó là format của các chương trình binary (exe, dll, sys, scr) cho MS windows NT, windows 95 và win32s. Nó có thể cũng được dùng cho các file object ( bpl, dpl, cpl, ocx, acm, ax). Định dạng này được thiết kế bởi Microsoft vào năm 1993 được tiêu chuẩn hóa bới Tool Interface Standard Committee (Microsoft, Intel, Borland, Watcom, IBM and others). Dựa trên nền tảng "common object file format" (COFF) được sử dụng cho các file object và executables (thực thi) trên riêng hệ điều hành UNIX và VMS.

"Portable Executable" được chọn lựa chỉ vì mục đích phải có một định dạng file phổ biến (common file format)cho hầu hết các lọai hệ điều hành Windows, hầu hết các lọai CPUs hổ trợ Windows khi chạy. Nó giành được sự ủng hộ tối đa vì nó là một format tương tự như khi sử dụng trong hệ điều hành Windows NT, Windows 95 ,Windows CE và các “con cháu” của nó.

Có nhiều cách để hình dung về PE files như : một cấu trúc dữ liệu trên disk của file PE giống như cấu trúc data của nó trong memory. Tải 1 file thực thi như file exe (1 dạng file PE) vào memory, đầu tiên phần chính thực hiện là vùng nào đó của file PE được mapping (xếp đặt) vào vùng address của memory. Vì vậy, cấu trúc dữ liệu là giống nhau trên disk và memory. Điểm mấu chốt là nếu bạn muốn tìm gì đó trong file PE, bạn có thể đương nhiên là tìm được những thông tin giống như thế sau khi file được load vào trong vùng nhớ. Chú ý quan trọng là PE files ko được mapped tòan thể vào trong vùng nhớ giống như file được mapped vào vùng nhớ một cách đơn giản như là copy từ chổ này đến chổ khác . Thay vào đó, Win32 loader (khi Windows muốn mapping 1 file PE, nó sẽ dùng 1 tiến trình gọi là Win32 Loader hay còn gọi là Windows Loader hoặc PE Loader) nhìn vào file PE và quyết định xem phần nào cần mapping vào trong vùng nhớ. Việc mapping này sẽ là sự xếp đặt thích hợp các “higher offsets” trong file vào “higher memory addresses” tương ứng trong memory. Offset của 1 item trong disk file có thể ko giống offset của nó được tải vào trong vùng nhớ . Tuy nhiên, hầu hết thông tin thể hiện cho phép bạn tạo một chuyển đổi từ offset trên disk thành offset trên memory.

Một module (một file sau khi load vào memory nó được gọi là một module) trong memory miêu tả code, data, và resource từ một file exe, nó cần thiết cho một process (process tức là tiến trình, là một đối tượng object của Windows (Windows là một hệ điều hành hướng đối tượng), nó là quá trình thực thi của modules). Các phần khác của một file PE có thể được read, nhưng ko được xếp (mapping) vào vùng nhớ (ví dụ như relocations). Vài phần có thể ko được mapped vào trong memory hòan tòan, ví dụ, khi thông tin gỡ rối (debug) được đặt tại cuối một file. Một vùng trong PE header nói cho hệ thống biết cần bao nhiêu memory để set dự trữ cho việc sắp xếp exe vào memory. Dữ liệu ko được mapped vào memory được đặt cuối file, phần trước dữ liệu đó sẽ được mapped vào trong.

Trên đây là tòan bộ những thông tin mà Benina thu thập được trên Net. Bây giờ chúng ta tóm tắt lại như sau:

Nói tóm lại:

PE là định dạng file đã được tiêu chuẩn hóa dùng cho các hệ điều hành Win32. Khi hệ điều hành muốn thực thi 1 file PE , nó sẽ dùng 1 tiến trình (process) gọi là Windows Loader (hay còn gọi là PE Loader) để tải (hay là xếp đặt (mapping)) file PE vào vùng nhớ (memory). Việc tải này ko đơn giản như là việc copy y nguyên file vào vùng nhớ, mà nó thực sự là xếp đặt (mapping) dữ liệu file vào vùng nhớ. Tức là có thể có 1 số phần trong file PE trên đĩa (disk) sẽ ko được mapping(sắp đặt) vào vùng nhớ.Và cuối cùng , phần mở rộng tên file PE (đuôi của file PE) có dạng như sau: exe, dll, sys, scr, bpl, dpl, cpl, ocx, acm, ax.

Một số vấn đề nói ngòai lề: Các bạn hảy tưởng tượng, khi Win32 Loader tải PE files vào vùng nhớ, chúng ta sẽ nhìn thấy hình ảnh của nó trong memory (hình tròn, hình vuông, hình gì cũng được tùy bạn tưởng tượng J ). Vì vậy, trong các tut về PE chúng ta hay gặp từ IMAGE. Nó sẽ chỉ 1 vùng memory , hay một cấu trúc , thậm chí 1 điểm nào đó trong vùng nhớ chứa file PE đã được loaded. Nói nôm na như thế để chúng ta dễ dàng hiểu được các phần sau này.

[1] Để giải thích về unpack là gì, tôi xin nói qua 1 file bị pack (nén). Để chống lại các cracker, các coder viết ra 1 chương trình packer, nó có nhiệm vụ nén file .exe lại thành 1 file mới cũng có đuôi là .exe ( khác với các file nén thông thường là .zip và .rar). Vì là file .exe nên nó có thể tự động run và khi run nó cũng tự động giải nén file lúc đầu bị pack vào memory. Sau khi giải nén xong, nó chuyển điều khiển control đến vùng memory chứa phần code giải nén và cho thực thi . Điểm đầu tiên trong memory giải nén sẽ thực thi gọi là OEP (Original Entry Point) . Các bạn nên phân biệt OEP và EP. EP là điểm đầu tiên trong memory mà Windows chuyển quyền điều khiển cho file exe thực thi sau khi Windows mapping file .exe vào vùng nhớ . Vậy EP là nói về Entry Point của file sau khi pack xong, còn OEP là Entry Point của file gốc bị pack sau khi được giải nén vào memory.

Các cracker cũng ko chịu thua các coder, để crack được, họ tìm cách xây dựng lại một file .exe từ code sau khi giải nén trong memory. Hành động này gọi là unpack. Vậy unpack tức là sau khi file pack giải nén vào memory và chuyển điều khiển đến OEP thì ta cho chương trình dừng lại tại OEP ( ko thực thi lệnh tại OEP) và copy vùng nhớ giải nén ra thành 1 file .exe. hành động copy này gọi là DUMP. Sau khi dump vùng nhớ ra thành file .exe, file này vẫn chưa run được, ta cần phải fix IAT (IAT là Import Address Table :bảng địa chỉ hàm nhập khẩu), các bạn sẽ tìm hiểu đề tài này sau, các bạn chỉ biết fix IAT tức là sửa chửa bảng quản lý các hàm “nhập khẩu” từ các file thư viện .dll thì file sau khi dump mới run được.

http://masm32vn.com (thanz NTA)

http://h1.ripway.com/benina/

http://benina.250free.com

http://www.fileh.com/masm32/

Benina 21/04/2005

Update 12/02/2006

Mail: benina@walla.com

(Không đồng ý bất kỳ ai sử dụng tài liệu này cho mục đích thương mại nếu ko được phép của tác giả)