1. Trang chủ
  2. » Luận Văn - Báo Cáo

Tìm hiểu kỹ thuật dịch ngược mã nguồn

46 8,7K 71

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 46
Dung lượng 2,45 MB

Nội dung

Tìm hiểu kỹ thuật dịch ngược mã nguồn

Trang 1

 BÁO CÁO BÀI TẬP LỚN

Môn: Cơ sở an toàn thông tin

Đề tài: tìm hiểu kỹ thuật dịch ngược mã nguồn

Giảng viên: Vũ Thị Vân

Nhóm thực hiện:

Hà Nội, 10/2014

Trang 2

PHÂN CÔNG CÔNG VIỆC

1 Trần Văn Dũng :

- Chương 3: Demo + dịch tài liệu

- Các kỹ thuật dịch ngược mã nguồn phầnmềm

- Làm báo cáo bản doc

- Các công cụ dịch ngược mã nguồn

- Các kỹ thuật dịch ngược mã nguồn phầnmềm

Trang 3

MỤC LỤC

PHÂN CÔNG CÔNG VIỆC 3

MỤC LỤC 4

DANH MỤC CÁC HÌNH VẼ 6

TÓM TẮT NỘI DUNG ĐỀ TÀI 7

LỜI MỞ ĐẦU 8

CHƯƠNG I: DỊCH NGƯỢC MÃ NGUỒN 9

I.1 Tổng quan về dịch ngược mã nguồn 9

I.2 Ứng dụng của dịch ngược mã nguồn 11

I.2.1 Dịch ngược – Bảo mật 11

I.2.2 Malicious Software 11

I.2.3 Dịch ngược giải thuật mã hóa 12

I.2.4 Cracking 13

CHƯƠNG II: DỊCH NGƯỢC MÃ NGUỒN PHẦN MỀM 15

II.1 Cấu trúc PE file trong windows 15

II.1.1 DOS MZ header 16

II.1.2 PE Header 18

II.1.3 Section Table 21

II.2 Các kỹ thuật dịch ngược mã nguồn 22

II.2.1 Kỹ thuật pack, unpack file 22

II.2.2 Kỹ thuật disassembly 27

II.2.3 Kỹ thuật Debugging 31

II.2.4 Kỹ thuật anti anti-disassembly 33

II.2.5 Kỹ thuật anti anti-debugging 36

II.3 Các phần mềm dịch ngược mã nguồn 36

II.3.1 Disassembler và Debugger 36

II.3.1.1 IDA Pro 36

II.3.1.2 OllyDbg 38

II.3.2 Định dạng PE file 43

Trang 4

II.3.2.1 PEBrowse 43

II.3.2.2 Peid 43

II.3.2.3 LordPE 44

KẾT LUẬN 45

CHƯƠNG III: DEMO 46

TÀI LIỆU THAM KHẢO 47

Trang 5

DANH MỤC CÁC HÌNH VẼ

Hình 1: Cấu trúc cơ bản của PE 15

Hình 2: Cấu trúc DOS Header 17

Hình 3: Cấu trúc Dos MZ header 18

Hình 4: Cấu trúc IMAGE_NT_HEADERS 18

Hình 5: Trường NumberOfSections 19

Hình 6: Danh sách các trường trong OptionalHeader 20

Hình 7: Cấu trúc IMAGE_SECTION_HEADER 21

Hình 8: Packed file 23

Hình 9 File thực thi ban đầu chưa được đóng gói 25

Hình 10: File thực thi sau khi bị nén 26

Hình 11: File thực thi sau khi giải nén và nạp vào bộ nhớ 26

Hình 12: File thực thi đầy đủ khi được giải nén thành công 26

Hình 13: Các cửa sổ chính IDA 37

Hình 14: Công cụ IDA pro 38

Hình 15: Cửa sổ chính OllyDBG 39

Hình 16: Các nút chức năng trong ollydbg 41

Hình 17: Các chức năng chính phục vụ debug 42

Hình 18: Phần mềm LordPE 44

Trang 6

TÓM TẮT NỘI DUNG ĐỀ TÀI

Đề tài tìm hiểu kỹ thuật dịch ngược mã nguồn được thực hiện baogồm các nội dung chính sau:

1 Tìm hiểu tổng quan về dịch ngược mã nguồn (khái niệm dịchngược mã nguồn, mục đích dịch ngược mã nguồn…), ứng dụng của dịchngược mã nguồn: dịch ngược bảo mật, dịch ngược giải thuật mã hóa, dịchngược dung trong cracking

2 Tìm hiểu cụ thể về dịch ngược mã nguồn trong phần mềm.Các kỹ thuật dịch ngược mã nguồn phần mềm trong môi trường windows,file và cấu trúc file thực thi trong môi trường windows; các công cụ phổbiến cho dịch ngược mã nguồn phần mềm

3 Demo dịch ngược mã nguồn một phần mềm đơn giản Mụcđích là biết cách sử dụng một số phần mềm dịch ngược, hiểu cơ bản vềdịch ngược mã nguồn nói chung và dịch ngược mã nguồn phần mềm nóiriêng

Trang 7

LỜI MỞ ĐẦU

Kể từ khi máy tính ra đời, nó đã làm thay đổi từng ngày, từng giờcuộc sống con người chúng ta Ngày nay, các hệ thống máy tính có mặttrên mọi ngành, mọi gia đình, mọi quốc gia và giữ một vai trò vô cùngquan trọng

Để đáp ứng nhu cầu ngày càng cao về khoa học máy tính và côngnghệ thông tin, ngày càng có nhiều phần mềm, chương trình… cả có hại và

có lợi cho người sử dụng vi tính Để hiểu rõ và kiểm soát chúng, chúng tacần phải tìm hiểu bản chất phần mềm, chương trình cho máy tính củachúng ta để kịp nâng cấp, chỉnh sửa chúng hay kiểm soát ảnh hưởng củachúng, hạn chế tác động có hại với hệ thống của ta Với đa số các chươngtrình phần mềm hiện nay chúng ta đều không có mã nguồn nên công việctrên thực sự rất khó, từ đó kỹ thuật dịch ngược mã nguồn ra đời, trợ giúprất mạnh mẽ trong việc giải quyết các vấn đề trên

Trong bài báo cáo này chúng em xin trình bày những tìm hiểu về kỹthuật dịch ngược mã nguồn Nội dung báo cáo bao gồm 3 chương lớn:

Chương 1: Tổng quan về dịch ngược mã nguồn

Chương 2: Tìm hiểu dịch ngược mã nguồn phần mềm

Chương 3: Demo dịch ngược mã nguồn

Trang 8

CHƯƠNG I: DỊCH NGƯỢC MÃ NGUỒN

I.1 Tổng quan về dịch ngược mã nguồn

Kĩ thuật dịch ngược là quá trình tìm kiếm thông tin từ kiến thứchoặc thiết kế blue-print từ tất cả những gì do con người làm ra Định nghĩanày ra đời rất lâu trước khi máy tính, hoặc những công nghệ hiện đại khác

ra đời, nó có từ cuộc cách mạng công nhiệp - reverse engineering với ýnghĩa đi ngược lại quá trình chế tạo để tìm hiểu cơ chế hoạt động Tương

tự như nghiên cứu khoa học, người nghiên cứu phải làm việc ngoài

“blueprint” của nguyên tử hoặc là trí óc con người Điểm khác biệt giữadịch ngược và các môn khoa học tự nhiên khác khác là dịch ngược nghiêncứu về những gì do con người tạo ra, chứ không phải những hiện tượng tựnhiên

Kĩ thuật dịch ngược chỉ ra cách để tìm ra những tri thức chưa đầy

đủ, những ý tưởng, và cách thiết kế khi những thông tin trên ta không có.Trong một vài trường hợp, người chủ thông tin không muốn chia sẻ Trongtrường hợp khác thông tin đã bị mất hay phá hủy

Không lâu về trước, dịch ngược đã thực sự là một sở thích, đượcthực hiện bởi rất nhiều người (mặc dù nó không được cho là kỹ thuật dịchngược) Hãy nhớ cách mà nhiều người trong những ngày đầu của nhữngthiết bị điện tử, đã rất thích thú tháo những appliances như radio hay tivi ra

để xem nó gồm những gì và cái gì đang xảy ra bên trong? Đó chính là dịchngược Tất nhiên, sự phát triển của các thiết bị điện tử đã làm cho việc nàytrở nên không còn thiết thực Những thiết bị số hiện đại quá bé nhỏ nênngày nay bạn gần như không thể thấy những thứ thú vị chỉ bằng cách openthe box

Trang 9

Trong khái hơn ta xét tới, đó là dịch ngược trong ngành công nghệthông tin hiện nay Như chúng ta đã biết, máy tính không thể hiểu được cácngôn ngữ tự nhiên, ngôn ngữ bậc cao (pascal, C, C++, Java…) mà đều phảiđược biên dịch hoặc thông dịch ra một ngôn ngữ bậc thấp mà máy có thểhiểu được Quá trình đó được gọi như là “dịch xuôi”.

Kỹ thuật dịch ngược là quá trình lấy một biên dịch nhị phân và cốgắng để tái tạo lại (hay hiểu) cách chương trình ban đầu hoạt động Một lậptrình viên ban đầu viết một chương trình, thường là trong một ngôn ngữcấp cao như C ++ hoặc Visual Basic (hoặc God Forbid, Delphi) Bởi vìmáy tính không vốn hiểu những ngôn ngữ đó, mà các đoạn mã do các lậptrình viên viết được lắp ráp thành một định dạng cụ thể, một trong nhữngngôn ngữ một máy tính có thể hiểu Mã này ban đầu được gọi là ngôn ngữmáy Loại mã này rất không phải là rất thân thiện với con người, và thườnglần đòi hỏi rất nhiều kiến thức và tư duy để tìm ra chính xác những gì cáclập trình viên đã nghi và viết

Ngày nay, các phần mềm, các file, tài liệu và đặc biệt là các phầnmềm, để đảm bảo tính bí mật, tính toàn vẹn, gọn nhẹ hay vấn đề bảnquyền… chúng đều được che giấu (đóng gói hay mã hóa) thành một địnhdạng khác để người sử dụng không thể biết mã nguồn Nên việc dịchngược tìm lại mã nguồn trở thành công nghệ rất quan trọng đối với mụcđích riêng của mỗi reverser Đôi khi ta có thể tìm kiếm lỗ hổng bảo mật,

mã độc, đôi khi bạn tò mò cách làm việc của bảo vệ chống sao chép, hay

để tìm cách phá hoại chen malware, virus… hoặc đơn giản là tìm cách để

sử dụng một phần mềm miễn phí v.v

Trang 10

I.2 Ứng dụng của dịch ngược mã nguồn

Kỹ thuật đảo ngược có thể được áp dụng cho rất nhiều lĩnh vực khoahọc máy tính, nhưng đây là một vài loại chung:

I.2.1 Dịch ngược – Bảo mật

Với một số người gắn liền bảo mật và dịch ngược có thể hơi khóhình dung Dịch ngược liên quan đến một vài khía cạnh khác của bảo mật.Như là, dịch ngược được dùng trong nghiên cứu mã hóa - một ngườinghiên cứu dịch ngược một sản phẩm và đánh giá mức độ bảo mật của nó.Dịch ngược còn được sử dụng nhiều trong việc hình dung hoạt động củacác malware, ở cả hai đầu chiến tuyến : bởi cả người phát triển malware vàngười chống lại nó Cuối cùng, dịch ngược rất phổ biến với cracker, nhữngngười dùng nó để phân tích và cả phá bỏ những phương thức bảo vệ phầnmềm

I.2.2 Malicious Software

Internet đã thay đổi hoàn toàn nền công nghiệp máy tính về tổng thểlẫn riêng về khía cạnh bảo mật máy tính Malicious software, như virus,worm, bùng nổ quá nhanh trong thế giới nơi mà hàng tỷ người đang kết nốiInternet và sử dụng e-mail Khoảng 10 năm trước, một virus thường copy

nó vào đĩa mềm và đĩa mềm sẽ load nó vào một máy tính khác để lâynhiễm Quá trình lây nhiễm thường rất chậm, và sự chống đỡ cũng đơngiản hơn nhiều bởi cách thức chúng lây nhiễm khá quen thuộc và cần có sựtác động của con người Đó là câu chuyện cũ trong lịch sử Internet đã tạo

ra một liên kết ảo giữa hầu như tất cả các máy tính trên thế giới Ngày nay,rất nhiều loại worm có thể lây một cách tự động tới hàng tỉ máy tính màkhông cần có bất cứ sự tác động nào của con người

Dịch ngược được dùng rộng rãi ở cả hai mặt trong đường dây củamalware Những người phát triển malware thường dùng reversing để xác

Trang 11

định lỗi trong hệ điều hành hoặc trong các phần mềm khác Những lỗi cóthể được sử dụng để thâm nhập vào phần bảo vệ của hệ thống và chấpnhận sự nhiễm độc - thường là trên Internet Bên cạnh sự lây nhiễm, tộiphạm thỉnh thoảng mượn kĩ thuật dịch ngược để xác định lỗi có thể chấpnhận malware thực hiện một kết nối tối những thông tin nhạy cảm hoặchơn nữa có thể điều khiển toàn bộ hệ thống.

Ở chiến tuyến đối nghịch, những người phát triển antivirus softwarekhảo sát và phân tích tất cả malware mà họ có được Họ dùng reversing đểtheo dõi từng bước mà chương trình làm và quyết định tổn thất có thể xảy

ra, mức độ nguy hiểm, và làm cách nào để remove chũng khỏi những hệthống bị nhiễm độc, và những lây nhiễm nào có thể tránh

I.2.3 Dịch ngược giải thuật mã hóa

Mã hóa luôn được cho là công cụ cơ bản của bảo mật: Alice gửi choBob một tin nhắn, và mã hóa tin nhắn đó sử dụng một bí mật chỉ được biếtbởi Bob và cô ấy Giải thuật mã hóa có thể chia ra 2 kiểu: giải thuật hạnchế và giải thuật dựa trên key Giải thuật hạn chế giống như là một vài đứatrẻ chơi với nhau, viết thư cho bạn bằng cách dịch mỗi chữ cái lên hoặcxuống Bí mật của giải thuật hạn chế là chính bản thân nó Một khi quyluật được tìm ra, nó không còn là bí mật nữa Giải thuật hạn chế cung cấprất ít sự bảo vệ bởi kỹ thuật dịch ngược làm cho nó trở nên khó bảo vệđược bí mật giải thuật Một khi reversers có trong tay cách mã hóa hoặcgiải mã, điều còn lại chỉ là thời gian trước khi giải thuật bị khám phá Bởigiải thuật là bí mật, reversing có thể xem là một cách để phá hỏng giảithuật Một cách mã hóa khác, giải thuật mã hóa dựa trên key, bí mật nằm ởkey, một vài giá trị được dùng bởi giải thuật để mã hóa và giải mã thôngtin Trong giải thuật dựa trên key, người dùng mã hóa thông tin bằng key

và giữ nó (và một vài divulged để legitimate recipient, dựa trên giải thuật)

Trang 12

Nó hầu như làm reversing pointless bởi giải thuật coi như đã biết Đểdecipher một thông tin như vậy, chúng ta có thể :

- Tìm kiếm key

- Thử tất cả các phép so sánh có thể cho đến khi có được key

- Tìm một kẽ hở trong giải thuật có thể sử dụng để tìm ra key hoặcthông tin ban đầu Tuy vậy, vẫn có những trường hợp cầnreverse, như là nhữ phương pháp hiện thực giải thuật mã hóa dựatrên key không công khai Mặc dù hầu hết các giải thuật mã hóadựa trên key đều phổ biến, chi tiết của một phương pháp đặc biệtthường có tác động không ngờ trong mức độ bảo mật tổng thểcủa một chương trình

Giải thuật mã hóa thường mỏng manh, và một lỗi nhỏ trong quátrình mã hóa có thể làm mất đi tính bảo mật được bảo vệ bởi giải thuật đó.Con đường duy nhất để thực sự biết chắc khi nào một sản phẩm được mãhóa hoàn thiện là xem toàn bộ source code hoặc, reverse nó

I.2.4 Cracking

Có hai xu hướng công nghệ hiện nay trong lĩnh vực phần mềm, đó làcác phần mềm mã nguồn mở, tức là những deverlopers cung cấp cho mọingười phần mềm và đồng thời cung cấp luôn mã nguồn của phần mềm đó.Mọi người đều có thể sử dụng, chỉnh sửa cho phù hợp với nhu cầu sử dụngcủa mình, miễn là sao cho phải phù hợp với giấy phép của mã nguồn đó

Xu hướng thứ hai, phần mềm cung cấp độc quyền, được nhà sảnxuất nghiên cứu và phân phối, người sử dụng muốn sử dụng các phần mềmnhư vậy buộc phải trả phí bản quyền Mã nguồn của chương trình sẽ khôngđược công khai Và đôi khi phí bản quyền của các nhà deverlopers thậtkhông dễ chịu với tất cả mọi người sử dụng Vậy làm sao để có thể không

Trang 13

cần “trả phí” mà vẫn được sử dụng những phần mềm như vậy Kỹ thuậtdịch ngược mã nguồn giúp các cracker có thể “bẻ khóa” các chương trình,hay tìm ra được thuật toán sinh key cho phần mềm để sinh ra các keygen.

Trang 14

CHƯƠNG II: DỊCH NGƯỢC MÃ NGUỒN PHẦN MỀM

II.1 Cấu trúc PE file trong windows

PE là định dạng riêng của Win32 Hầu hết các file thực thi trênWin32 đều thuộc dạng PE (Trừ các tập tin VxDs và các file DLL 16 bít)

Để có thể thực thi trên máy tính, nội dung file PE được chia thànhcác thành phần và có mối liên hệ mật thiết với nhau Nắm rõ cấu trúc PE sẽgiúp chúng ta hiểu được cơ chế thực thi của một chương trình, từ việc tổchức tới việc load lên bộ nhớ, các tài nguyên sử dụng…

Hơn nữa khi chúng ta muốn sửa đổi một file, ví dụ như thêm vàomột số đoạn mã, chỉnh sửa một số thành phần nhưng vẫn muốn chươngtrình thực thi bình thường Do đó, cần phải nắm rõ cấu trúc PE file, mốiliên hệ giữa các thành phần trong file để có thể nhanh chóng thay đổi file

và thoả mãn yêu cầu đề ra

Hình 1: Cấu trúc cơ bản của PE.

Trang 15

Từ hình vẽ trên, chúng ta thấy cấu trúc PE có thể gồm nhiều section,trong đó tối thiểu cần 2 section: data và code.

Một số section thông dụng hay được gặp ở các chương trình:

Executable Code Section, có tên là text (Micro$oft) hoc là CODE(Borland)

Data Sections, có nhng tên nh data, rdata hoc bss (Micro$oft) hayDATA (Borland)

Resources Section, có tên là rsrc

Export Data Section, có tên là edata

Import Data Section có tên là idata

Debug Information Section, có tên là debug

Cấu trúc các section trên bộ nhớ và trên ổ đĩa là như nhau, tuy nhiênkhi được nạp lên bộ nhớ, các Windows loader sẽ quyết định thứ tự và vị trínạp các phần, do đó vị trí các phần trên ổ đĩa và trên bộ nhớ sẽ có sự khácbiệt

Tiếp theo chúng ta sẽ đi chi tiết hơn về các phần cụ thể trong PE:DOS MZ header, DOS stub, PE header, Section table

II.1.1 DOS MZ header

Tất cả các file PE bắt đầu bằng DOS Header, vùng này chiếm 64bytes đầu tiên của files Vùng này được dùng trong trường hợp chươngtrình chạy trên nền DOS, hệ điều hành DOS nhận biết đây là một file thựcthi hợp lệ và sẽ thực thi nội dung trong phần DOS stub

DOS Header là một cấu trúc được định nghĩa trong file windows.inchoặc winnt.h Cấu trúc này gồm 19 thành phần

Trang 16

Hình 2: Cấu trúc DOS Header

Trong đó chúng ta cần quan tâm tới hai trường:

e_magic: Chữ ký của PE file, giá trị: 4Dh, 5Ah (Ký tự “MZ”, têncủa người sáng lập MS-DOS: Mark Zbikowsky) Giá trị này đánh dấu mộtDOS Header hợp lệ và được phép thực thi tiếp

e_lfanew: là một DWORD nằm ở cuối cùng của DOS Header, làtrường chứa offset của PE Header so với vị trí đầu file

Trang 17

Hình 3: Cấu trúc Dos MZ header

II.1.2 PE Header

PE Header thực chất là cấu trúc IMAGE_NT_HEADERS bao gồmcác thông tin cần thiết cho quá trình loader load file lên bộ nhớ Cấu trúcnày gồm 3 phần được định nghĩa trong windows.inc

Hình 4: Cấu trúc IMAGE_NT_HEADERS

Signature: là 1 DWORD bắt đầu PE Header chứa chữ ký PE: 50h,45h, 00h, 00h

FileHeader: bao gồm 20 bytes tiếp theo của PE Header, phần nàychứa thông tin về sơ đồ bố trí vật lý và các đặc tính của file Trong trườngnày chúng ta cần chú ý tới trường NumberOfSections, đây là trường chứa

số section của file Nếu muốn thêm/xoá section trong PE file, ta cần thayđổi tương ứng trường này

Trang 18

Hình 5: Trường NumberOfSections

OptionalHeader: bao gồm 224 bytes tiếp theo sau FileHeader Cấutrúc này được định nghĩa trong windows.inc, đây là phần chứa thông tin về

sơ đồ logic trong PE file Dưới đây là danh sách các trường trong cấu trúcnày, đồng thời sẽ đưa ra một số chỉ dẫn về thông tin của một số trường cầnquan tâm khi muốn chỉnh sửa file

Trang 19

Hình 6: Danh sách các trường trong OptionalHeader

AddressOfEntryPoint (RVA): địa chỉ ảo tương đối của câu lệnh đầutiên sẽ được thực thi Nếu muốn chương trình bắt đầu từ một địa chỉ khác(để thực thi câu lệnh với mục đích khác) thì cần thay đổi địa chỉ này về địachỉ tương đối của câu lệnh muốn thực thi

ImageBase: Địa chỉ được ưu tiên nạp cho PE file

SectionAlignment: Phần liên kết các section trong bộ nhớ, tức là mộtsection luôn luôn được bắt đầu bằng bội số của sectionAlignment Ví dụ:sectionAlignment là 1000h, section đầu tiên bắt đầu ở vị trí 401000h vàkích thước là 10h, section tiếp theo sẽ bắt đầu tại địa chỉ 402000h

FileAlignment: Phần liên kết các section trong file Tương tự nhưSectionAlignment nhưng áp dụng với file

SizeOfImage: Toàn bộ kích thước PE file trong bộ nhớ, là tổng củatất cả các headers và sections được liên kết tới SectionAlignment

SizeOfHeaders: Kích thước của tất cả headers và section table, bằngkích thước file trừ đi tổng kích thước của các section trong file

DataDirectory: là một mảng gồm 16 cấu trúcIMAGE_DATA_DIRECTORY, mỗi cấu trúc liên quan tới 1 cấu trúc dữliệu trong PE file

II.1.3 Section Table

Section Table là thành phần ngày sau PE Header, bao gồm mộtmảng những cấu trúc IMAGE_SECTION_HEADER, mỗi phần tử chứathông tin về một section trong PE file Cấu trúc này được định nghĩa trongfile windows.inc như hình dưới đây:

Trang 20

Hình 7: Cấu trúc IMAGE_SECTION_HEADER

Thông tin về một số trường quan trọng:

VirtualSize: Kích thước thật sự của dữ liệu trên section tính theobyte, giá trị này có thể nhỏ hơn kích thước trên ổ đĩa (SizeOfRawData)

VirtualAddress: RVA của section, là giá trị để ánh xạ khi sectionđược load lên bộ nhớ

SizeOfRawData: Kích thước section data trên ổ đĩa

PointerToRawData: là offset từ vị trí đầu file tới section data

Characteristics: đặc tính của section: thực thi, dữ liệu khởi tạo …

II.2 Các kỹ thuật dịch ngược mã nguồn

II.2.1 Kỹ thuật pack, unpack file

Pack file là để che giấu hay nén một tập tin thực thi, các trình nénchương trình sẽ đóng gói chúng lại thành một tập tin thực thi khác Filethực thi này cũng có thể lại được được đóng gói thành một file thực thikhác nữa Chúng ta có thể liên tưởng tới búp bê Matryoshka của nước Nga,

kỹ thuật pack file cũng là như vậy

Một file thực thi bị “đóng gói” vào một file thực thi khác Khi tathực thi file, file thực thi “ngoài” sẽ giải nén (unpack) mọi nội dung file

Trang 21

thực thi “trong” chứa bên trong nó ra bộ nhớ rồi sau đó tiến trình thực thimới thực sự bắt đầu Như vậy, file thực thi “bên trong” mới là file thực thi

“thực sự’

Các trình nén tập tin PE đầu tiên được thiết kế như là một phươngpháp giảm kích thước của một thực thi trên đĩa, thông qua việc nén file đólại Các trình đóng gói (packes) sẽ thực hiện đóng gói nhỏ hơn vào ổ đĩa,nhưng khi chạy sẽ 'giải nén' chính nó vào trong bộ nhớ Một khi các filethực thi được giải nén vào bộ nhớ, tập tin thực thi kèm theo sẽ được thựchiện một cách bình thường

Hình 8: Packed file

Kỹ thuật unpack file

Kỹ thuật unpack file mục đích là tái tạo tập tin thực thi, ở dạng bảngốc của nó, trước khi nó đóng gói Điều này cho phép chúng ta thực hiệnphân tích tĩnh ngay trên dữ liệu được giải nén Đồng thời chúng ta sẽ

Trang 22

không cần các PE file gốc (bị đóng gói) một lần nào nữa, do đó, chúng ta

có thể xoá nó đi Và chúng ta sẽ có được file thực thi như là chúng chưa bịđóng gói

Ở bên trong một file thực thi đã bị nén thì các bảng import tablesthường thường là đã bị thay đổi, làm mất hiệu lực và phần dữ liệu thì luôn

bị mã hóa Các chương trình đóng gói (hay nén) sẽ chèn thêm mã lệnh đểgiải nén chương trình trong bộ nhớ vào lúc thực thi và sau đó nhảy tới OEP(orginal entry point - Đây là nơi mà chương trình gốc thực sự bắt đầu thựcthi, thi hành) Chúng ta phải tìm được cách để (dump) kết xuất vùng nhớnày sau khi mà chương trình đóng gói hoàn tất được quá trình giải nén tậptin thực thi, đồng thời thêm vào đó chúng ta cũng phải chỉnh sửa lại cácsection và bảng import table trước khi mà ứng dụng của chúng ta sẽ thựcthi

Vậy kỹ thuật giải nén một chương trình ở đây cốt lõi là đi tìm lạiOEP thật của trình thực thi mà chúng ta cần giải nén Và tìm IAT (ImportAddress Table - đây là một bảng của những con trỏ tới các địa chỉ hàm mà

đã được điền vào bởi trình windows loader khi các file Dll được nạp) sau

đó chỉnh sửa bảng này sao cho chỏ tới địa chỉ các hàm của chương trình

“thật” Nếu như tìm được hai mục tiêu trên coi như chúng ta đã giải nénthành công một tập tin đã bị nén

Các bước để giải nén một tập tin đã được nén:

1 Giải nén tập tin thực thi ban đầu vào bộ nhớ

2 Giải quyết tất cả các hàm khai báo của các thực thi ban đầu

3 Thực hiện để chuyển điểm vào gốc của mã thực thi chính(OEP)

4 Chỉnh sửa IAT và giảm kích thước sau khi giải nén

Mã thực thi được tải vào bộ nhớ

Trang 23

Khi mã thực thi được tải vào bộ nhớ, một bộ nạp đọc tiêu đề PE trênđĩa, và cấp phát bộ nhớ cho mỗi phần của thực thi dựa trên tiêu đề đó Bộnạp sau đó sao chép các phần section vào không gian được phân bổ trong

bộ nhớ Đóng gói và giải nén 385 các mã thực thi cùng định dạng tiêu đề

PE để bộ nạp sẽ phân bổ không gian cho các phần, trong đó có thể đếnchương trình gốc, hoặc phần Unpacking Stub có thể tạo ra các phần Phầngiải nén sẽ giải nén mã cho mỗi phần và bản sao nó vào không gian đãđược phân bổ Phương pháp giải nén chính xác được sử dụng phụ thuộcvào các mục tiêu của các trình giải nén, và nó thường được chứa trongphần Unpacking Stub

Xử lý các khai báo

Các tập tin PE không bị nén bao gồm một phần khai báo chức năng,

và một phần lưu trữ địa chỉ của các tên của tất cả các chức năng được khaibáo Bộ nạp Windows đọc các thông tin khai báo, xác định chức năng nào

là cần thiết, và sau đó điền vào các địa chỉ

Bộ nạp Windows không thể đọc thông tin khai báo được đóng gói.Đối với một thực thi đóng gói, phần giải nén sẽ giải quyết vấn đề khai báo.Cách tiếp cận cụ thể phụ thuộc vào cách đóng gói

Phương pháp phổ biến nhất là phần khai báo của giải nén phải cóchức năng LoadLibrary và GetProcAddress Sau khi phần giải nén mã thựcthi gốc, nó đọc thông tin khai báo ban đầu Nó sẽ gọi LoadLibrary cho mỗithư viện, để nạp DLL vào bộ nhớ, và sau đó sẽ sử dụng GetProcAddress để

có được địa chỉ của từng chức năng

The Tail Jump

Sau khi khi phần giải nén hoàn tất, nó phải thực hiện chuyển đếnOEP

Các lệnh thực hiện mà chuyển đến OEP thường được gọi là lệnhnhảy

Một lệnh nhảy là cách đơn giản và phổ biến nhất để chuyển giaothực hiện Kể từ khi nó quá phổ biến, các mã độc hại sẽ cố gắng để chekhuất chức năng này bằng cách sử dụng một lệnh ret hoặc call

Thông qua Hình 9 đến 12 minh họa cho quá trình đóng gói và giảinén, như sau:

Ngày đăng: 27/03/2015, 11:06

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w