Tải bản đầy đủ (.pdf) (75 trang)

tìm hiểu, phân tích virus

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (5.45 MB, 75 trang )

::[ARTeam Tutorial]::
PORTABLE EXECUTABLE FILE FORMAT
Category :


Relates to cracking, unpacking, reverse engineering

Level :


Intermediate

Test OS :


XP Pro SP2

Author :

Goppit

Translated by :

kienmanowar (REA
-
cRaCkErTeAm)


Tool
s Used:


Hexeditor

(any will do)

PEBrowse Pro



PeiD


LordPE

/>-
DLX.ZIP (get DLX
-
b update
also)

HexToText



OllyDbg

http://home.t
-
online.de/home/Ollydbg/odbg110.zip

ResHacker




BaseCalc

included in this archive

and metioned in the text:

Snippet
Cr
eator



First_Thunk
Rebuilder



IIDKing



Cavewriter






1

L i m u :

Bài vi
t n
ày nh
m m c ích i chi u thông tin t nhi u ngu n khác nhau v
à trình bày nó theo m
t
ph ng pháp mà nh ng ng i m i b t u có th ti p c n d d
àng nh
t.M c d
ù bài vi
t c tr
ình bày
m t cách t m trong nhi u ph n, tuy nhi
ên
nó c nh h ng theo m c ích
reverse code
engineering

cho nên các thông tin không c
n thi t s c b qua. B n s nh n th y r ng
trong bài vi
t
này
tôi
ã vay m
n r t nhi u t các b

ài vi
t khác nhau
ã
c công b , ph bi n v
à t
t c
các tác gi

c a nh ng b
ài vi
t ó

ã
c tôi nh c n v i l
òng c
m n sâu s c trong ph n t
ài li
u tham kh o phía
cu
i c a b
ài vi
t n
ày.

PE
là nh d ng file ri
êng c
a Win32. T t c các file có th th c thi c tr
ên Win32


(ngo
i tr các t p
tin VxDs và các file Dll
s 16 bit) u s d ng nh d ng PE. Các file Dlls 32 bit, các file COMs, các i u
khi
n OCX , các ch ng tr
ình
ng d ng nh trong Control Pannel (.CPL files) v
à các
ng d ng .NET t t
c u là nh d ng PE. Th m chí các ch ng tr
ình
i u khi n Kernel mod
e c
a các h i u h
ành NT
c ng s d ng nh d ng PE.

T i sao chúng ta l i c n ph i t
ìm hi
u v nó? Có 2 lý do chính nh sau : Th nh t chúng ta mu n th
êm
các o n code v
ào
trong nh
ng file th c thi (ví d : k thu t
Keygen Injection ho
c th
êm các ch
c n n

g)
và th
hai l
à th
c hi n công vi c unpacking b ng tay
(manual unpacking)
các file th
c thi. H u h t m i s
quan tâm u d n v lý do th hai, ó là vì ngày nay h u nh các ph n m m shareware
nào c
ng u
c Packed
l
i v i m c ích l
à làm gi
m kích th c c a file ng th i cung c p th
êm m
t l p b o v
cho file.

b
ên trong m
t file th c thi
ã b
Packed th
ì các b
ng import tables th 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 packer s
ch
èn thêm
mã l
nh (code)
unpack file trong b
nh v
ào lúc th
c thi và sau ó nh y t i
OEP
(original entry point) ( ây là n i mà
ch ng tr
ình g
c th c s b t u th c thi, thi h
ành.). N
u chúng ta t
ìm
c cách (dump) k t xu t
vùng nh này sau khi mà ch ng trì
nh packer hoàn t
t c quá tr
ình unpacking file th
c thi,


ng th i
thêm vào ó chúng ta c ng c n ph i ch nh s a l i Section v
à b
ng import tables tr c khi m
à
ng d ng
c a chúng ta s run. Làm th nào chúng ta có th th c hi n c i u n
ày n
u nh ch
úng ta không có
hi
u bi t tí t o n
ào v
nh d ng PE file ?

Ch ng tr
ình th
c thi c tôi s d ng l
àm ví d
xuy
ên su
t to
àn b
bài vi t n
ày là
BASECALC.EXE ,
m t ch ng tr
ình r
t h u ích t trang Web c a Fravia, nó cho phép tính toán v

à chuy
n i gi a c
ác s
h
decimal, hex , binary và octal. Ch ng tr
ình này
c tác gi c a nó coded b ng ngôn ng Borland Dephi
2.0 , chính vì th
m
à nó là m
t file lý t ng tôi l y l
àm ví d
minh h a l
àm th
n
ào trình biên d
ch
Borland cho OriginalFirstThunks null
. (Chi ti
t h n s c c p ph n sau).


2

1. C
u trúc c b n (Basic Structure) :

Hình minh h
a d i ây s cho chúng ta th y c c u trúc c b n c a m t PE file.



m c t i thi u nh t th
ì m
t PE file s có 2 Sections : 1 cho o n m
ã
(code) và 1 cho ph
n d li u (data).
M t ch ng tr
ình
ng d ng ch y tr
ên n
n t ng Windows NT có 9 sections c xác nh tr c có t
ên là
.text , .bss , .rdata , .data , .rsrc , .edata , .idata , .pdata , và .debug
. M
t s ch ng tr
ình
ng d ng l i
không c
n t t c nh ng sections này, trong khi các ch ng tr
ình khác có th
c nh ngh a v i nhi u
sections h n phù h p v i s c n thi t ri
êng bi
t c a chúng.

Nh
ng sections m
à hi
n th i ang t n t i v

à xu
t hi n thông d ng nh t trong m t file th c thi l
à
:

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

2.
Data Sections, có nh
ng tên nh
.data, .rdata ho
c .bss (Micro$oft) hay
DATA
(Borland)

3.
Resources Section, có tên là
.rsrc

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


5.
Import Data Section. có tên là
.idata

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

Nh
ng cái t
ên này th
c s l
à không thích h
p khi chúng b l i b i h i u h
ành (OS) và chúng là tài
li
u ph c v cho l i ích c a các l p tr
ình viên. M
t i m quan tr ng khác n a l
à c
u t
rúc c
a môt PE file
trên a là chính xác , úng n gi ng h t nh khi nó c n p vào trong b nh v
ì v
y b n có th xác
nh thông tin chính xác c a file trên a m
à b
n có th s mu n t
ìm ki

m nó khi file c n p vào trong
b nh .

Tuy nhiên nó không
c sao chép l i m t cách chính xác bên trong b nh . Các windows loader s
quy t nh ph n n
ào c
n c ánh x l
ên b
nh v
à b
qua nh ng ph n khác. Ph n d li u m
à không
c ánh x lên c t t i phía cu i c a file sau b t k
ì ph
n n
ào mà s
c ánh x l
ên b
nh ví d
Debug Information.

C ng v y v trí c a m t m c trong file trên a s luôn luôn khác bi t v i v trí c a nó khi c n p v
ào
trong b
nh b i v
ì s
qu n lý b nh o d a tr
ên các trang mà Windows s
d ng. Khi các sections c

n p v
ào
trong b
nh RAM chúng c c n kh p v i 4KB memory Pages, m i section s b t u tr
ên

3

môt Page m
i. M t tr ng trong PE header s thông báo cho h th ng bi t có bao nhi
êu b
nh c n c
ri
êng ra cho vi
c ánh x trong file. B nh o c gi i thích

ph n d i ây.

Thu
t ng b nh o
(virtual memory)
thay th
vi c cho Software truy c p tr c ti p l
ên b
nh v t lý
(physical memory), b
x lý v
à h
i u h
ành t

o ra m t l p vô h
ình (invisible layer) gi
a chúng. B t k
l n n
ào m
t c g ng c t o ra truy c p t i b nh , b vi x lý s tra c u m t page table bi t
xem có nh
ng Process mà a ch b nh v t lý ang th c s c s d ng. Nó s không ph i l
à m
t vi c
làm thi
t th c có m t table entry cho m i byte c a b nh (Page table s
l
n h n t ng b nh v t lý),
vì v
y thay th vi c b vi x lý phân chia b nh thành các trang. i u n
ày có m
t s l i th nh sau :

1.
Nó cho phép s
t o th
ành c
a nh ng không gian a ch ph c t p. M t không gian a ch l
à m
t
page table c cô l p ch
cho phép
truy c p
t

i b nh m
à thích h
p v i ch ng tr
ình hi
n t i
ho c

process. Nó m b o r ng nh ng ch ng tr
ình b
cô l p , cách ly ho
àn toàn v
i các ch ng
trình khác và m
t khi x y ra l i khi n cho m t ch ng tr
ình b
crash th
ì nó s
không th nh
h ng , h y ho i t i không gian a ch c a các ch ng tr
ình khác .

2. Nó cho phép b vi x lý áp t nh ng lu t l nào ó i v i vi c b nh c truy c p th
nào.Nh
ng sections c
òi h
i , y
êu c
u trong PE file b i v
ì nh
ng khu v c khác nhau trong

file
c i x m t cách khác bi t b i ch ng tr
ình qu
n lý b nh khi m t module c n p.
T i th i i m n p , ch ng tr
ình qu
n lý b nh thi t l p nh ng quy n truy c p l
ên các trang b

nh cho các sections khác nhau d a tr
ên nh
ng thi t l p c a chúng trong Section header. i u n
ày
s quy t nh r
õ m
t section
ã cho là có th
c c (readable) , có th ghi c (writeable) hay
có th
th c thi c (executable). i u n
ày có ngh
a l
à m
i section ph i c b t u tr
ên m
t
trang m
i. Tuy nhiên , kích th c tr
ang m
c nh cho h i u h

ành Windows là 4096 bytes
(1000h) và nó s
l
à lãng phí
s p các file th c thi v
ào m
t ranh gi i 4KB Page trên a khi m
à
i u n
ày s
l
àm cho chúng tr
n
ên quá l
n h n m c c n thi t. B i v
ì
i u n
ày, PE header có hai
tr ng align
ment khác nhau là :
Section alignment và file alignment
. Section alignment là cách
các sections c s p trong b nh nh
ã nói
tr
ên. Còn
File Alignment
(s
d ng 512 bytes hay
200h) là cách các section c s p trong file trên a và là kích th c c a n

hi
u sector t i u
quá trình loading (loading process).
3.
Nó cho phép m
t file ánh s trang (paging file) c s d ng tr
ên
c ng l u tr các trang
m t cách t m th i t b nh v t lý khi chúng không c s d ng. L y ví d nh sau, n u m t
ng d ng
ã
c n p nh ng ang trong t
ình tr
ng r nh r i (idle) ,không gian a ch c a nó có
th
c ánh trang b
ên ngoài
a t o ra không gian cho các ng d ng khác c n c n p
vàp trong b
nh RAM. N u nh t
ình hình
o l n , h i u h
ành có th
n p m
t cách d
d
àng
ng d ng u tiên tr l i b nh RAM v
à h
i ph c l i s thi h

ành t
i n i mà nó b ng ng l i . M t
ng d ng c ng có th s d ng nhi u b nh h n là không gian hi n có c a b nh v t lý b i v
ì h


4

th
ng có th s d ng c ng nh là m t n i l u
tr
th c p b t c khi n
ào mà b
nh v t lý không
còn
không gian l u tr .

Khi PE file
ã
c n p v
ào trong b
nh b i windows loader, phi
ên b
n trong b nh này c bi t n
nh là m t
module
. a ch b t u n i mà ánh x file b t u c g i l
à m
t
HMODULE

. M
t module
trong b
nh bi u di n t t c o n m
ã , d
li u v
à toàn b
t
ài nguyên t
m t file th c thi mà i u n
ày là
c n thi t cho s thi h
ành khi mà thu
t ng
Proccess v
c b n tham chi u t i m t không gian a ch cô
l p m
à có th
c s d ng running nh là m t module.
2. The DOS Header :

T t c các file PE b t u b ng DOS Header , v
ùng này chi
m gi 64 bytes u ti
ên c
a file. Nó c
dùng trong tr ng h p ch ng tr
ình c
a b n ch y tr
ên n

n DOS, do ó h i u h
ành DOS có th
nh n
bi
t nó nh là m t file th c thi h p l v
à thi hành DOS stub , ph
n mà
ã
c l u tr tr c ti p sau
Header. H
u h t DOS stub th ng s d ng h
àm 9 c
a ng t int 21h hi n ra m t chu i kí t thông báo
t ng t nh sau :
"This program must be run under Microsoft
Windows"
nh ng nó có th l
à m
t
ch ng tr
ình DOS
ang phát tri n m nh (full-
blown DOS program)
(Nói tóm l
i l
à DOS Stub ch
l
à m
t
ch ng tr

ình DOS EXE nh
hi n th m t thông báo l i th ng là nh trên, chính do header này c t
n m u c a file , ch
o nên các virus DOS có th
lây nhi m
vào PE image chính xác t
i DOS stub
. Tuy
nhiên ch ng tr
ình DOS Stub v
n c
òn
c gi l i v
ì lí do
t ng thích v i các h th ng Windows 16-
bit
)
. Khi xây d
ng m t ng d ng phát tri n tr
ên n
n t ng Windows , ch ng trì
nh linker liên k
t m t stub
program m
c nh có t
ên g
i l
à
WINSTUB.EXE
vào trong file th

c thi c a b n. B n có th ghi
è , ph

quy t cách h
ành s
c a ch ng tr
ình linker m
c nh n
ày b
ng cách thay th m t ch ng tr
ình MS
-
DOS
-
based c
a ri
êng b
n thay cho
WINSTUB và s
d ng
STUB: m
t t
ùy ch
n c a ch ng tr
ình linker khi
liên k
t file th c thi.

DOS Header là m
t c u trúc c nh ngh a trong các file

windows.inc ho
c
winnt.h
(N u nh b n có
m t ch ng tr
ình d
ch h p ng ho c m t tr
ình biên d
ch
ã
c cài t tr
ên máy , b
n s t
ìm th
y các
file này trong th m c \
include
\
). Nó có 19 thành ph
n (members) mà trong ó thành ph n
magic

lfanew
là áng chú ý.

Trong PE file , ph
n magic
c
a DOS Header ch a giá tr
4Dh, 5Ah

( ó chính là các kí t MZ
, vi
t t
t
c a
Mark Zbikowsky
m
t trong nh ng ng i sáng t o chính c a MS-
DOS), các giá tr
n
ày là d
u hi u

5

thông báo cho chúng ta bi t ây l
à DOS Header h
p l . MZ là 2 bytes u ti
ên mà b
n s nh
ìn th
y trong
b t k
ì m
t PE file nào , khi file ó c m b ng m t ch ng
trình Hex editor. (Xem hinh minh h
a phía
d i).

Nh b n

ã nhìn th
y trong h
ình minh h
a phía tr
ên, b
n th y r ng ph n
lfanview là m
t giá tr DWORD
(t
c l
à m
t Double Word = 4bytes) v
à nó n
m v trí cu i c
ùng c
a DOS Header và ng tr c c a n i
b t u DOS Stub. Nó ch a offset c a PE Header, có liên quan n ph n u file (file beginning).
Windows Loader s
t
ìm ki
m offset n
ày vì v
y nó có th b qua Dos Stub và i tr c ti p t i PE Header.

Hình minh h
a trên
ã giúp ích cho chúng ta r
t
nhi
u khi nó ch cho ta th y r

õ kích th
c c a t ng
ph n t . i u n
ày cho phép chúng ta truy xu
t nh ng thông tin m
à chúng ta quan tâm d
a tr
ên vi
c m
s l ng các bytes t i m b t u c a section ho c m t i m có th nh n bi t c.

Nh chúng ta
ã n
ói
tr
ên, DOS Header chi
m 64 bytes u ti
ên c
a file
ví d
4 hàng u c nh
ìn
th
y trong m t ch ng tr
ình Hex Editor trong hình minh h
a d i ây.Giá tr DWORD cu i cùng tr c
i m b t u DOS Stub ch a nh ng giá tr
00h 01h 00h 00h
. ý n vi c re
verse tr

t t byte , i u n
ày
s giúp chúng ta bi t
00 00 01 00h
là nh
ng offset n i mà PE Header b t u. PE Header b t u v i
ph n signatures c a nó l
à
50h, 45h, 00h, 00h
(Các kí t
PE c i k
èm b
i các giá tr t n c
ùng là 0)

N u t i tr ng Signatu
re c
a PE Header , b n t
ìm th
y m t NE signature ó ch không ph i l
à PE , thì
lúc này b
n ang l
àm vi
c v i môt file NE Windows 16-
bit. C
ng t ng t nh vây, n u b n th y l
à
LE


n m t i Signature field th
ì có ngh
a l
à nó cho ta bi
t ó l
à m
t tr
ình
i u
khi
n thi t b o Window 3.x
(VxD). Còn t i ó l
à m
t
LX
thì
ó là d u hi u c a m t file cho OS/2 2.0

OKi t
m ngh chút xíu !! Chúng ta s ti p t c th o lu n trong ph n ti p theo c a b
ài vi
t này. : )
3. The PE Header :

PE Header là thu
t ng chung i di n cho m t c u trúc c t t
ên là
IMAGE_NT_HEADERS .
C u
trúc này bao g

m nh ng thông tin thi t y u c s d ng b i loader.
IMAGE_NT_HEADERS
có 3
thành ph
n và c nh ngh a trong file
windows.inc
nh sau :


6


Signature
là m
t DWORD ch a nh ng giá tr nh sau
50h, 45h, 00h, 00h
(Các kí t
PE c i k
èm
b i các giá tr t n cùng là 0).
FileHeader

bao g
m 20 bytes ti p theo c a PE file ,nó ch a thông tin v s b trí v t lý v
à nh
ng c
tính c
a file. Ví d : s l ng các sections.

Opti

onalHeader
luôn luôn hi
n di n và c t o th
ành b
i 224 bytes ti p theo . Nó ch a thông tin v s
Logic b
ên trong c
a m t file PE. Ví d :
AddressOfEntryPoint
. Kích th c c a nó c qui nh b i
m t th
ành ph
n c a FileHeader.
Các c
u trúc c a nh ng th
ành ph
n n
ày c
ng c nh ngh a trong file
windows.inc

FileHeader
c nh ngh a gi ng nh h
ình minh h
a d i dây :

H u h t nh ng th
ành ph
n n
ày không còn h

u ích i v i chúng ta nh ng chúng ta ph i thay i th
ành
ph
n
NumberOfSections n
u nh ch
úng ta mu
n th
êm ho
c xóa b t k
ì sections nào trong m
t PE File.
Characteristics
bao g
m các c m
à các c
này xác nh nh ng th hi n chúng ta bi t c PE File m
à
chúng ta làm vi
c l
à m
t file có th th c thi (executable) hay l
à m
t file DLL. Quay tr l i ví d c a
chúng ta trong màn hình HexEditor, chúng ta có th
t
ìm th
y
NumberOfSections b
ng vi c m m t

DWORD và m
t WORD (6 bytes) t ch b t u c a PE Header (T c l
à giá tr
DWORD chính l
à
Signature
còn giá tr
WORD chính l
à
Machine
) (note : tr ng

NumberOfSections
c s d ng b i
viruses
vì nhi
u lí do khác nhau. L y ví d , tr ng n
ày có th
b thay i b ng cách viruses s gia t ng nó
lên th
êm m
t section m i vào PE image và t o n virus body vào section ó

Các h
th ng
Windows NT có th

ch
p nh n t i 96 sections trong m t PE file
. Trên h

th ng s d ng Win95 th
ì không
ki
m tra k ph n section number
).

. Xem hình minh h
a d i ây :


7


i u n
ày có th
c ki m tra l i b ng cách s d ng b t c m t công c PE n
ào. Ví d
: Công c
PEBrowse
Pro


Ho
c s d ng m t công c khá n i ti ng l
à
LorDPE
:




8

Ho
c th m chí n u b n ang s d ng PEiD b n c ng có th ki m nghi m c i u n
ày b
ng cách nh n
vào button là
Subsystem
:


Chú ý
:
PEiD
là m
t công c c c k
ì h
u ích
Ch
c n ng chính c a nó là dùng scan Executable files
và ch
cho chúng ta bi t c lo i Packer mà File này c s d ng cho vi c nén và protect file. Ngoài ra
i kèm v i PEiD l
à m
t Plugin không kém ph n quan tr ng, ó chính l
à
Krypto ANALyser
. Khi b
n s
d ng Plug-

in này
thì nó s cho chúng ta bi t c file ó có s d ng nh ng m t m
ã
(cryptography)
gì.
Ch
ng h n : CRC, MD4, MD5 ho c SHA v v Th m chí công c n
ày c
ng s d ng các danh sách c
ng i dùng nh ngh a v các
Packer signatures.
Tóm l
i PEiD l
à công c
u tiên c s d ng khi
chúng ta b
t tay v
ào công vi
c unpacking.

Chúng ta ti
p t c nghi
ên c
u t i
thành ph
n ti p theo l
à
OptionalHeader
, nó chi
m 224 bytes , trong ó

128 bytes cu
i c
ùng s
ch a thông tin v
Data Directory
. Nó c nh ngh a gi ng nh
hình minh h
a
d i ây :


9


AddressOfEntryPoint

RVA ( a ch o t ng i) c a câu l nh u ti
ên mà s
c th c thi khi
ch ng tr
ình PE Loader s
n sàng run PE File

(thông th ng nó tr t i section .text hay CODE)
. N
u
nh b n mu n làm thay i lu n
g c
a th t th c hi n , b n c n ph i thay i l i giá tr trong tr ng n
ày

thành m
t RVA m i và do ó câu l nh t i giá tr RVA m i n
ày s
c th c thi u tiên. Các ch ng
trình Packer th
ng thay th giá tr n
ày b
ng giá tr decompression stub c a chúng, sau ó s thi h
ành s

nh y tr v i m b t u c a ch ng tr
ình
hay còn g
i v i t
ên thông d
ng l
à OEP. M
t l u
ý thêm n
a

ch b o v
StarForce
thì CODE section s không có m t , hi n di n trong file trên a nh ng l i
c ghi l
ên b
nh o tro
ng quá trình th
c thi. V
ì th

m
à giá tr
trong tr ng n
ày là m
t VA (xem th
êm
ph
n ph l c s c c p bên d i). (note : ây th c s l
à m
t tr ng c t y u v
à c
c k
ì quan tr
ng
b i v
ì tr
ng n
ày s
b thay i b i h u h t các ki u lây nhi m virus tr
t
i i m th c thi th c s c a
virus code)

ImageBase


a ch n p c u tiên cho PE File. L y ví d : N u nh giá tr trong tr ng n
ày là
400000h, PE Loader s
c g ng n p file vào trong không gian a ch o m

à b
t u t i 400000h. T
c u tiên ây có ngh a l
à PE Loader không th
n p file t i a ch ó n u nh có m t module n
ào
khác
ã chi
m gi vùng a ch này. 99 % các tr ng h p giá tr c a
ImageBase luôn là 400000h

SectionAlignment


Ph
n li
ên k
t c a các Sections trong b nh . .
Khi f
ile th
c thi c ánh x v
ào
trong b
nh , th
ì m
i section ph i b t u t i m t a ch o m
à là m
t b i s c a giá tr n
ày. Giá tr
c a

tr ng n
ày nh
nh t là 0x1000(4096 bytes), nh ng trình các trình linkers c a Borland th ng s d ng các
giá tr
m c n
h l
n h n, ví d nh là 0x10000(64KB).
L
y ví d nh sau : N u giá tr t i tr ng n
ày là
4096 (1000h), thì m
i section ti p theo s ph i b t u t i v trí mà section tr c ó c ng v i 4096 bytes.
N u section u ti
ên là t
i 401000h và kích th c c a nó l
à 10 bytes, v
y section ti p theo l
à t
i 402000h

10

cho dù là không gian a ch gi a 401000h v
à 402000h s
h u nh không c s d ng.
(note: h
u h t các
Win32 viruses s
d ng tr ng này tính toán v trí chính xác c a virus body nh ng l i không thay i
tr

ng n
ày).

FileAlignment


Ph
n li
ên k
t c a các Section trong file. L y ví d : n u giá tr c th c a tr ng n
ày là
512 (200h), thì m
i section ti p theo s ph i b t u t i v trí mà sections tr c ó c ng v i 200h. N u
section u ti
ên là t
i offets 200h, và có kích th c l
à 10 bytes, v
y th
ì section ti
p theo s c nh v
ta
i ch offet l
à 400h : Không gian gi
a file offsets 522 v
à 1024 là không s
d ng c/ho c không
c nh ngh a.
SizeOfImage
- Toàn b kích th c c a PE image trong b nh . Nó l
à t

ng c a t 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 các headers + section table.Nói tóm l i , giá tr n
ày là b
ng kích
th c file tr i kích th c c t ng h p c a to
àn b
sections
trong file. B
n c ng có th s d ng giá tr
này nh m t file offset c a Section u ti
ên trong PE file.

DataDirectory

M t m ng c
ùa 16
IMAGE_DATA_DIRECTORY
structures, m
i m t ph n có li
ên
quan t
i m t c u trúc d li u quan tr ng trong PE File ch ng h n nh
import address table

. C
u trúc
quan tr
ng n
ày s
c th o lu n chi ti t trong nh ng ph n ti p theo.

Cách b trí m i th c a PE Header có th c quan sát m t cách tr c quan thông qua h
ình
nh minh h a
sau ây trong ch ng tr
ình HexEditor. Chú ý r
ng

DOS Header
và ph
n c a
PE Header
là luôn luôn
cùng kích th c (and shape) khi c quan sát trong ch ng tr
ình HexEditor. Ph
n
DOS Stub
có th

thay i theo kích th c :


11



Bên c nh các công c PE
ã
c c p trên, ch ng tr
ình debug
c a thích
là OllyDbg c
ng có
th
phân tích c PE Headers thông qua vi c hi n th thông tin m t cách y v
à có ý ngh
a. Dùng
OllyDbg load file ví d
c a chúng ta v
ào trong Olly và nh
n
Alt + M ho
c b m v
ào nút
M m c a s
Memory Map
-
c
a s n
ày s
cho chúng
ta th
y c PE File
ã
c n p v

ào trong b
nh .

Ti
p theo b n nh n chu t ph i tr
ên PE Header và ch
n
Dump in CPU
. Sau ó trong c a s Hex window
, l
i nh n chu t ph i m t l n n a v
à ch
n
Special

> PE Header .


Chúng ta s
có c thông tin nh sau :


12


4. The Data Directory :

Tóm t
t l i ph n tr c , chúng ta
ã bi

t c r ng
Data Directory
là 128 bytes cu
i c
ùng c
a
OptionalHeader
, và l
n l t l
à nh
ng th
ành ph
n cu i c
ùng c
a PE Header
IMAGE_NT_HEADERS.

Nh chúng ta
ã t
ng nói,
Data D
irectory
là m
t m ng c a 16 c u trúc
IMAGE_DATA_DIRECTORY

structures, c
m i 8 bytes th
ì m
i ph n l i có li

ên quan v
i m t c u trúc d li u quan tr ng trong PE File.
M i m ng tham chi u t i m t m c
ã
c nh ngh a tr c , ví d nh là import table
. C
u
trúc c
a
Data Directory
có 2 thành ph
n m
à bao g
m thông tin v v trí và kích th c c a c u trúc d li u trong
nh ng i u
ã bàn
n :

VirtualAddress
là m
t a ch o t ng i (relative virtual address) c a c u trúc d li u (xem ph n
sau)

isize

bao g
m kích th c theo bytes c a c u trúc d li u.

16 directories mà nh
ng c u trúc n

ày tham chi
u n , b n thân chúng c nh ngh a trong file
window.inc
:


13


L y ví d , chúng ta s d ng ch ng tr
ình LordPE. Trong LordPE , ph
n
Data Directory
cho file ví d
c a chúng ta ch ch a 4 th
ành ph
n (
ã
c tôi khoanh màu trong h
ình v
). 12 th
ành ph
n c
òn l
i
không c s d ng và c i n giá tr l
à 0 :


Nh các b n

ã th
y trong hinh minh h a trên, tr ng import table bao g m thông tin v RVA v
à
kích th c
c
a
IMAGE_IMPORT_DESCRIPTOR

array

the Import Directory. Trong ch ng tr
ình
HexEditor, hình minh h
a bên d i ây ch cho chúng ta th y PE Header v i ph n data directory c tô
nét ngoài b
ng màu . M i m t khu v c c khoanh n
ày bi
u di n
cho m
t c u trúc
IMAGE_DATA_DIRECTORY.
Giá tr
DWORD u ti
ên chính là
VirtualAddress
còn giá tr
cu i
cùng chính là
isize
.


14


Trong hình minh h
a tr
ên, thì Import Table
c tô b ng m
àu h
ng. 4 bytes u ti
ên là RVA 02D000h
(NB reserver oder). Kích th
c c
a
Import Table
là 181Eh bytes. Nh chúng ta
ã nói
tr
ên thì v
trí
c a nh ng data directories t ph n u c a PE Header l
à luôn luôn gi
ng nhau. Ví d : giá tr DWORD
80 bytes t
ph n u c a PE Header luôn luôn l
à RVA c
a Import Table.


xác nh c v trí c a m t directory c bi t, b n xác nh rõ a ch t ng i t data directory.

Sau ó s d ng a ch o xác nh section n
ào directory
trong. M t khi b n phân tích section n
ào
ch
a directory , th
ì Section Header cho section
ó sau ó s

c s d ng tìm ra offset chính xác.
5. The Section Table :

Section Table là thành ph
n ti p theo ngay sau PE Header.Nó l
à m
t m ng c a nh ng c u trúc
IMAGE_SECTION_HEADER
, m
i ph n t s ch a thông tin v m t section trong PE File ví d nh
thu
c tính c a nó v
à offset
o (virtual offset) . Các b n h
ãy nh
l i r ng s l ng các sections chính l
à
thành ph
n th 2 c a FileHeader (6 bytes t ch b t u c a PE Header). N u có 8 sections trong PE File,
thì s
có 8 b n sao c a c u trúc n

ày trong table.M
i m t c u trúc Header (header structure) l
à 40 bytes và
s không có thêm padding gi a chúng (Padding ây có ngh a l
à s
không ch
èn thêm các bytes có giá
tr
00h v
ào).C
u trúc này c nh ngh a trong file
windows.inc
nh sau :


15

Xin nh c l i m t l n n a , không ph i t t c các th
ành ph
n trên u h u ích. Tôi s ch mi
êu t
nh ng
thành ph
n th c s l
à quan tr
ng m
à thôi.

Name1
-

(NB this field is 8 bytes) Tên này ch
l
à là m
t nh
ãn và th
m chí l
à có th
tr ng. Chú ý r ng
ây không ph i l
à m
t chu i ASCII v
ì v
y nó không c n ph i k t thúc b ng vi c th
êm các s
0.

VirtualSize


(DWORD union) Kích th c th t s c a section's data theo bytes. Nó có th nh h n kích
th c c a section trên a (SizeOfRawData) v
à s
l
à nh
ng g
ì mà trình loader
nh rõ
ví trí trong b
nh
cho section này.


VirtualAddress


RVA c
a section. Tr
ình PE loader s
phân tích v
à s
d ng giá tr trong tr ng n
ày khi
nó ánh x
section v
ào trong b
nh . V
ì v
y n u giá tr trong tr ng này là 1000h và PE File c n p t i
i ch 4
00000h , thì section s
c n p t i a ch l
à 401000h.

SizeOfRawData


Kích th c c a section s data trong file trên a, c l
àm tròn lên b
i s ti p theo c a
s li
ên k

t file b i trình biên d ch.

PointerToRawData


(Raw Offset) thành ph
n n
ày th
c s r t h u d ng b i v
ì nó là offset t
v trí b t
u c a file cho t i ph n section s data. N u nó có giá tr là 0 , thì section s data không c ch a trong
file

s không b bó bu c v
ào th
i gian n p (load time). Tr
ình PE Loader s
s d ng giá tr trong

tr ng
này t
ìm ki
m ph n data trong section l
à
âu trong file.

Characteristics
-
Bao g

m các c ví d nh section này có th ch a executable code, initialized data ,
uninitialized data , có th
c ghi ho c c (Xem th
êm ph
n ph l c)

NOTE :

Khi b
n ti n h
ành tìm ki
m m t section c th nào ó , nó có th ph t l to
àn b
PE Header v
à
b t u phân tích section headers b ng cách t
ìm ki
m section name trong c a s ASCII c a ch ng tr
ình
HexEditor c
a b n.

Quay tr
l i ví d c a chúng ta , trong c a
s
HexEditor file c a chúng ta có 8 sections nh chúng ta
ã
nhìn th
y trong section PE Header.



16


Sau khi có c
Section Headers
chúng ta s
t
ìm ki
m các sections.Trong file trên a , m i section b t
u t i m t offset m
à là b
i s l n c a giá tr F
ileAlignment
c t
ìm th
y trong OptionalHeader. Gi a
các section s data s là các byte 00 c th
êm vào.

Khi c n p l
ên RAM , các sections luôn luôn b
t u tr
ên m
t ranh gi i trang (page boundary) v
ì v
y
byte u ti
ên c
a m i section t ng ng v i m t

trang b
nh (memory page). Các trang tr
ên nh
ng b vi
x lý x86 CPU l
à 4KB aligned , trong khi trên IA
-64 là 8KB aligned. Giá tr li
ên k
t (aligment value) n
ày
c l u tr trong
SectionAlignment
, và c
ng c l u trong
OptionalHeader
.
L y m t ví d , n u nh OptionalHeader k t thúc t i file offset 981 v
à FileAlignment là 512, thì section
u ti
ên s
b t u t i byte 1024 . Chú ý r ng b n có th t
ìm nh
ng section thông qua PointerToRawData
ho c l
à VirtualAddress, vì v
y không c n ph i lo ng i b n kho n v alignments.

Trong hình minh h
a tr
ên ,

ImportData Section
(.idata) s
b t u t i offset 0002AC00h (highlighted
pink, NB reverse byte order) t
v trí b t u c a file. Kích th c c a nó , do
ã
c qui nh l
à
DWORD nên nó s l
à 1A00h bytes.

6.
The PE File Sections :

Là nh ng sections ch a n i dung chính c a file, bao g m code, data, resources v
à nh
ng thông tin khác
c a file th c thi. M i section có m t Header v
à m
t body (d li u thô raw data : là d li u ch a c x
lý ho
c ch a c nh
khuôn th
c, nó ch a c s p x p, bi
ên t
p s a ch a ho c ch a c bi u di n
l i d i d ng d truy t
ìm và phân tích). Nh
ng
Section Headers

thì
c ch a trong
Section Table

nh ng nh ng Section Bodies l i không có m t c u trúc file c ng r n. Chúng có th c s p x p h u nh
theo b
t k
ì cách nào khi m
t tr
ình linker mu
n t ch c chúng , v i i u ki n là Header c i n thông
tin y có th gi i m
ã d
li u.


17

M t ch ng tr
ình
ng d ng c thù trên h i u hành Windows NT có 9 sections c nh ngh a tr c
có tên là
.text, .bss, .rdata, .rsrc, .edata, .idata, .pdata và .debug
. M
t vài ch ng tr
ình không c
n ph i
có t t c c các sections n
ày , trong khi m
t s ch ng tr

ình
ng d ng khác l i nh ngh a th
êm nhi
u
sections khác phù h p v i nh ng y
êu c
u ri
êng bi
t c a chúng.

Executable Code Section :

Trong h
i u h
àn Windows NT t
t c các o n m
ã (code segment) t
p trung v
ào m
t sections n l
c g i l
à
.text ho c l
à
CODE
. T
khi h i u h
ành Windows NT chuy
n sang s d ng m t h th ng
qu n lý b nh o d a tr

ên trang, thì có m
t section code l n d dàng h n trong vi c qu n lý i v i h
i u h
ành c
ng nh i v i nh ng ng i phát tri n ng d ng. Section n
ày c
ng ch a i m t nh p
(entry point) mà
ã
c c p ph n tr
ên và b
n
g jump thunk t
able tr
t i IAT (xem th
êm ph
n import
theory)

Data Sections :

Section
.bss
bi
u di n d li u không c kh i t o cho ng d ng , bao g m to
àn b
các bi n
ã
c khai
báo là bi

n t nh trong m t h
àm ho
c l
à m
t module ngu n.

Section
.rdata
bi
u di n d li u ch c ra (read
only) , ví d
nh nh ng chu i,
các
h ng, v
à thông tin
th m c debug.

T t c nh ng bi n khác (ngo i tr nh ng bi n t ng , m
à ch
xu t hi n trên Stack ) c l u tr trong
Section
.data
. ó là nh ng ng d ng ho c l
à nh
ng bi n toà
n c
c module.

Resources Section :


Section
.rsrc
ch
a các thông tin resource cho m t module. 16 bytes u ti
ên bao g
m m t Header gi ng
nh nh ng section khác, nh ng d li u c a Section này h n n a c c u trúc v
ào trong m
t resource
tree và c quan sá
t t
t nh t thông qua vi c s d ng m t ch ng tr
ình resource editor. M
t ch ng tr
ình
khá n
i ti ng ó l
à
ResHacker
, ây là m t ch ng tr
ình mi
n phí cho phép ch nh s a , th
êm m
i, xóa,
thay th
v
à sao chép các Resources :




18


ây là m t ch ng tr
ình r
t m
nh ph c v cho m c ích Cracking v
ì nó s
hi n th m t cách nhanh
chóng các h
p tho i bao g m c nh ng chi ti t v vi c ng kí sai c ng nh các nag screens. M t ng
d ng shareware có th th ng b Cracked ch b ng vi c xóa b resource h p tho i nagscr
een trong
ResHacker.

Export Data Section :

Section
.edata
ch
a Export Directory cho m t ch ng tr
ình
ng d ng ho c file Dll. Khi bi u di n,
section này bao g
m các thông tin v tên và a ch c a nh ng h
àm exported functions. Chúng ta s
nói
ti
p v v n


n
ày sau ,
m t ph n r t quan tr ng ti p theo.

Import Data Section :

Section
.idata
ch
a nh ng thông tin khác nhau v nh ng hàm imported functions bao g m c
Import
Directory
và b
ng
Import Address Table
. Chúng ta c
ng s nói ti p v v n n
ày
ph n sau.

Debug Information Section :

Thông tin Debug c t ban u trong Section
.debug
. nh d ng PE File c ng h tr các file debug
khác nhau (th ng c nh n bi t v i ph n m r ng là .dbg) nh là m t cách th c c a vi c t p h p thông
tin debug t
i m t v trí t p trung. Section debug ch a thông tin debug , nh ng nh ng th m c debug l i
n m trong Section
.rdata

nh
ã
c c p ph n tr
ên. M
i m t th m c s li
ên quan t
i thông tin
Debug trong Section
.debug
.
Base Relocations Section :

Khi mà trì
nh linker t
o ra m t file Exe, nó chu n b m t n i mà t i ó file s c ánh x vào trong b
nh . D a trên i u n
ày, trình linker s
t các các a ch th t c a o n m
ã và nh
ng m c d li u v
ào
trong file th
c thi. N u v
ì b
t c lý do g
ì file th
c thi k
t thúc quá trình n
p m t n i nào ó n u không
trong ph

m vi không gian a ch o , th
ì nh
ng a ch n
ày s
b tr
ình linker
t v
ào trong image không
úng. Thông tin c l u trong Section
.reloc
cho phép trình PE loader fix nh
ng a ch n
ày trong
load
ed image vì v
y chúng s l i chính xác. M t khác, n u tr
ình loader có th
n p file t i nh ng a ch
base address c th a nh n b i tr
ình linker , thì d
li u Section .reloc
là không c
n thi t v
à b
l i.


19

Các m

c trong section .reloc c g i b i Base r
elocation vì s
s d ng c a chúng ph thu c vào a ch
base address c a loaded image. Base Relocation n gi n ch l
à m
t danh sách c a các v trí trong image
mà yêu c
u m t giá tr c

thêm vào chúng. nh d ng c a d
li
u base relocation h i ph c t p . Các
m c base relocation c nén (packed) trong m t chu i c a các ph n d
ài bi
n i. M i ph n di n t
các Relocation thay th
cho m t trang 4KB trong image.

Hãy xem m
t ví d hi u cách h at ng c a base relocation. M t file th c thi c li
ên k
t v i m t a
ch
c s c a 0x10000. T i offset 0x2134 b
ên trong image là m
t con tr ch a a ch c a m t chu i.
Chu
i b t u t i a ch v t lý l
à 0x14002, vì v
y con tr s ch a giá tr là 0x14002. Sau ó b n n p file,

nh ng tr
ình loader quy
t nh r ng n
ó c
n ph i ánh x image b t u t i a ch v t lý l
à 0x60000. S

chênh l
ch gi a tr
ình linker d
a trên a ch n p và a ch n p th c s c g i là delta. Trong tr ng
h p ví d c a chúng ta thì delta là 0x50000 bytes cao trong b nh , nh v y l
à chu
i
(bây gi
t i a ch
là 0x64002). Con tr
t i chu i gi ây không còn ng n a. File th c thi ch a m t base relocation i
di
n cho v trí b nh (memory location) n i mà con tr t i chu i tr v . gi i quy t m t base
relocation , trình loader c
ng thê
m giá tr
delta v
ào giá tr
g c ban u t i a ch base relocation. Trong
tr ng h p c a chúng ta , tr
ình loader s
c ng giá tr delta l
à 0x50000 vào giá tr

con tr ban u l
à
(0x14002) , và l u k t qu tr l i là (0x64002) vào trong b nh c a con tr .
Vì th
chu i bây gi s có
a ch th c l
à t
i 0x64002 , v y l
à m
i th u t t p .

7. The Export Sections :

Section này có liên quan m
t cách c bi t t i các file Dlls. Ph n thông tin c trích d i ây t
Win32
Programmer s Reference
s
gi i thí
ch t
i sao :

Các hàm có th
c exported b i m t Dll theo hai cách : by name ho c by ordinal only
. M
t s
th
t hay m t ch s l
à m
t s 16-

bit (WORD
sized) mà duy nh
t ch ra m t h
àm trong m
t file Dll
riêng bi
t. Con s n
ày là duy nh
t ch
bên trong file Dll nó tham chi
u t i. Chúng ta s nói v exporting
b ng s th t ph n sau.

N u nh m t hàm c exported b ng t
ên , khi các file Dll khác ho
c các file th c thi mu n g i h
àm này
, chúng s
c
ùng s
d ng t
ên c
a h
àm ho
c ch s c a h
àm tr
ong hàm
GetProcAddress
mà tr
v a ch

c a h
àm trong file Dll c
a nó. T
ài li
u Win32 Programmer s Reference
s
gi i thích th
êm v
ph ng
th
c ho t ng c a h
àm
GetProcAddress
(M
c d
ù trong th
c t thông tin v h
àm này r
t nhi u, không
ch
nh ng t
ài li
u

c vi t b i M$, nh ng thông tin khác s c p sau). Các b n h
ãy chú ý
n nh ng
ph n mà tôi
ã
ánh d u b ng vi n màu :



20


Hàm
GetProcAddress
có th
làm c i u n
ày b
i v
ì các tên và
a ch c a nh ng exported function
c s p x p trong m t c u trúc c nh ngh a r t t t trong
Export Directory
. Chúng ta có th
t
ìm
th
y
Export Directory b
i v
ì chúng ta bi
t nó l
à thành ph
n u ti
ên trong data directory và RVA c
a nó
c ch a t i offset 78h t n i b t u c a PE Header. (Xin xem th
êm ph

n ph
l
c)

C u trúc export c g i l
à
IMAGE_EXPORT_DIRECTORY
. Có 11 thành ph
n trong c u trúc n
ày
nh ng có m t s không quan tr ng :


21


nName

Internal name c a module. Tr ng n
ày th
c s c n thi t b i v
ì tên c
a file có th b thay i
b i ng i s d ng
. N
u i u ó x y ra , tr
ình PE loader s
s d ng Internal name n
ày.


nBase

B
t u c a s th t hay s ch s (Tr ng này c s d ng l y nh ng index trong address-
of
-
function array
xem
bên d i).

NumberOfFunctions
T
ng s các hàm mà c ex
ported b
i module.

NumberOfNames
S
l ng các Symbols c exported b ng
name. Giá tr
n
ày không ph
i l
à s
l ng
c a t t c các hàm/symbols trong module. l y c con s n
ày, b
n c n ph i ki m tra
NumberOfFunctions
.Nó có th

là 0. Trong tr ng h p y, module có th export b ng ordinal only. N u
không có hàm / symbol c exported trong tr ng h p u ti
ên , thì RVA c
a b ng Export table trong
data directory s l
à 0.

AddressOfFunctions
m
t RVA tr t i m t m ng c a các con tr t i các h
àm trong mod
ule

Export
Address Table (EAT)
. s d ng nó theo cách khác, nh ng RVA tr t i các hàm trong module c
gi
l i trong m t m ng và tr ng này tr t i u c a m ng ó.

AddressOfNames

m t RVA tr t i m t m ng các RVA c a tên các hàm c l u trong modu
le

Export Name Table (ENT)
.
AddressOfNameOrdinals

m t RVA tr t i m t m ng 16 bit m
à ch

a các ordinals c a các named

functions

Export Ordinal Table (EOT)
.

22


Nh v y c u trúc
IMAGE_EXPORT_DIRECTORY
tr
t i 3 m ng v
à m
t b ng nh ng chu i kí t
ASC
II. M
ng quan tr ng l
à EAT, vì nó là m
t m ng c a các con tr h
àm mà ch
a a ch c a các
exported functions. Hai m
ng th hai l
à (ENT và EOT) ch
y song song theo th t s p x p t ng d n d a
trên tên c
a các hàm m t phép
tìm ki

m nh phân cho t
ên c
a hà
m có th
c th c hi n v
à s
a k t
qu l
à s
th t c a hàm ó c t
ìm th
y v
ào trong m
t m ng khác.S th t ch n gi n l
à m
t ch s
bên trong EAT i v i hàm ó.

Tr c ây m ng EOT t n t i nh là m t li
ên k
t gi a tên và a ch , nó không th
ch
a nhi u ph n t h n
m ng ENT. Ví d : m i m t t
ên có th
có m t v
à ch
m t a ch t ng ng. i u ng c l i l
à không
úng : m t a ch có th có nhi u tên t ng ng v i nó. N u ó l

à nh
ng h
àm v
i tên bí danh tham
chi
u n c
ùng m
t a ch th
ì ENT
s có nhi u ph n t h n là EOT


23

L y ví d , n u m t file Dll export 40 h
àm , thì nó ph
i có 40 th
ành ph
n trong m ng c tr b i
AddressOfFunctions (EAT) và tr ng NumberOfFunctions ph i ch a 40 giá tr .


t
ìm ki
m m t h
àm t
t
ên c
a nó, H i u h
ành (OS

) u ti
ên s
t
ìm nh
ng giá tr c a
NumberOfFunction

NumberOfNames
trong Export Directory. Ti p theo nó s d o qua các m ng
c tr b i
AddressOfNames (ENT)

AddressOfNameOrdinals (EOT)
m
t cách ng th i, t
ìm
ki
m t
ên c
a h
àm
.
N
u nh tên c a h
àm
c t
ìm th
y trong ENT,
thì
giá tr

t ng ng v i ph n t trong
EOT c trích xu t v
à s
d ng nh là ch m c b
ên trong EAT.
L y ví d , trong file Dll 40 h
àm c
a chúng ta tr
ên chúng ta mu
n t
ìm ki
m h
àm X. N
u chúng ta t
ìm
tên hàm X(gián ti
p thông q
ua con tr
khác) t i ph n t th 39 trong ENT , chúng ta nh
ìn vào ph
n t th
39 c
a EOT v
à th
y 5 giá tr . Sau ó chúng ta xét ph n t th 5 c a EAT t
ìm ki
m RVA c a h
àm X.

N u nh b n

ã s
n có s th t c a m t h
àm , b
n có th t
ìm th
y a ch c a nó b ng cách i tr c ti p
t i EAT. M c dù có c a ch c a m t h
àm thông qua s
th t c a nó th
ì d
dàng h n và nhanh h n
r t nhi u so v i vi c s d ng t
ên c
a h
àm , thì
ng c l i i u b t l i l
à s
g p khó kh n trong vi c qu n lý
module. N u nh file

Dll c nâng c p / c p nh t v
à s
th t c a các h
àm b
thay i, th
ì các ch
ng
trình khác mà ch
y d a tr
ên file Dll này s

b Break.

Exporting by Ordinal Only :

NumberOfFunctions ph
i ít nh t l
à b
ng v i
NumberOfNames
. Tuy nhiên th
nh tho ng trong m
t s

tr ng h p th
ì
NumberOfNames
l
i ít h n
NumberOfFunctions
. Khi m
t hàm c Exported thông
qua s
th t , nó không có danh sách trong c hai m ng ENT v
à EOT
nó không có tên. Nh
ng h
àm mà
không có tên thì
c Exported thông qua s th t .


L y ví d nh sau , n u ta có 70 hàm nh ng ch có duy nh t 40 m c trong ENT , v y th
ì có ngh
a l
à có 30
hàm trong module mà c Exported b ng s th t . V y bây gi l
àm th
nào chúng ta t
ìm ra nh
ng
hàm ó là g
ì?
i u n
ày không d
d
àng. B
n ph i t
ìm ra b
ng ph ng pháp lo i tr , l y ví d : nh ng m c
trong EAT mà không c tham chi u b i EOT ch a RVAs c a các hàm c Exported b ng s th t .

Ng i l p tr
ình viên có th
ch r
õ s
th t b t u trong m t .def file. L y ví d , các b ng trong h
ình
minh h
a
trên có th
b t u t i 200. mà i phó tr c s c n thi t cho 200 ph n t r ng u ti

ên
trong m
ng , th
ành ph
n
nBase
l u gi giá tr b t u v
à tr
ình loader tr
các s th t t

nó thu c
ch
m c th t trong EAT.

Export Forwarding :

ôi khi các
hàm có v
c Exported t m t file Dll c thù, nh ng trên th c t các h
àm này l
i n m
trong m
t file Dll hoàn toàn khác. i u này c g i l
à Export Forwarding . L
y ví d , trong h i u
hành WinNT , Win2k và WinXP, hàm trong
kernel32.dll

HeapAlloc

c forwarded t h
àm
RtlAllocHeap
c Exported b i
ntdll.dll
. File
NTDLL.DLL
c
ng ch a các API b m sinh mà t ng tác
tr
c ti p v i kernel windows . Forwarding c th c hi n t i th i i m li
ên k
t thông qua m t câu l nh
c bi t trong
.DEF file
.
Forwardi
ng là m
t k thu t m
à Microsoft s
d ng a ra m t t p h p các API thông d ng và che
d u s khác bi t n n t ng gi a h h i u h
ành NT v
i h 9X. Các ng d ng không có c nhi m v
g i các h
àm trong t
p h p các API b m sinh v
ì
i u n
ày s

phá v kh n ng t ng thích gi a Win9x v
à
2K/XP. i u n
ày có th
gi i thích t i sao các file th c thi b Packed có th c unpacked v
à có b
ng
imports c a chúng c xây d ng l i b ng tay tr
ên m
t OS có th không run c tr
ên OS khác b
i h
th
nng API forwarding ho c m t v
ài chi ti
t khác
ã b
ch nh s a.

Khi m
t Symbol (Hàm) c Forwarded RVA c a nó m t cách r
õ ràng không
th
l
à m
t an code ho c
a ch d li u trong module hi n t i. thay th , b ng EAT ch a m t con tr t i m t chu i ASCII c a
file DLL v
à tên hàm mà nó c Forwarded. Trong ví d tr c nó s l
à

NTDLL.RtlAllocHeap
.

24


N u v y th
ì m
c EAT cho m t h
àm tr
t i m t a ch b
ên trong Export Section (ví d
chu i ASCII) thay
vì h
n là tr ra ngo
ài vào m
t file DLL khác, th
ì b
n bi t r ng hàm ó
ã
c forwarded.

8. The Import Section :

Import Section (th ng c bi t d i t
ên
.idata
) bao g
m thông tin v t t c các hàm c imported b i
file th

c thi t các file Dlls. Thông tin này c l u tr trong m t
vài c
u trúc d li u. Ph n quan trong
nh t c a
section này

ImportDirectory

ImportAddressTable
mà chúng ta s
nói n ti p theo ây.
Trong m
t s file th c thi có th c ng có các directories l
à
Bound_Import và Delay_Import.
Delay_Import directory , v
i chúng ta nó không quan tr ng l m nh n
g chúng ta s
c p t i
Bound_Import directory
ph n ti p sau.

Trình Windows loader ch
u trách nhi m v vi c n p t t c các file Dll m
à
ng d ng s d ng v
à ánh x

chúng vào trong không gian a ch process. Nó ph i t
ìm

a ch c a t t c các imported fu
nctions trong
các file Dlls khác nhau c
a chúng v
à s
p t chúng s n sàng s d ng cho các file th c thi c n p.

a ch c a các h
àm bên trong m
t file Dll không ph i l
à nh
ng a ch t nh mà thay i khi các phi
ên
b n c c p nh t hóa c a file Dll c released , v
ì v
y các ng d ng không th c xây d ng s
d ng các a ch h
àm hardcoded. B
i v
ì
ó là m t c ch c phát tri n

cho phép nh ng thay i m
à
không c
n ph i t o ra nhi u s thay i, ch nh s a i v i o n m
ã c
a file th c thi v
ào
lúc chay. i u

này
ã
c ho
àn thành thông qua vi
c s d ng m t Import Address Table (IAT). â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.

B ng vi c s d ng m t b ng con tr ,
trình loader không c
n ph i thay i nh ng a ch c a các imported
functions trong o n m
ã l
nh mà chúng c g i. T t c nh ng th m
à nó ph
i làm là thêm a ch chính
xác vào m
t n i riêng l trong b ng import v
à công vi
c c a nó c ho
àn t
t.


The Imp
ort Directory :

Import Directory
th
c s l
à m
t m ng c a các c u trúc
IMAGE_IMPORT_DESCRIPTOR
. M
i c u
trúc là
20 bytes
và ch
a thông tin v m t DLL m
à PE file c
a chúng ta import
các hàm
vào. L y ví d ,
n u PE file c a chúng ta import các h
àm t
10 file
DLL khác nhau, thì s
có 10 c u trúc
IMAGE_IMPORT_DESCRIPTOR
trong m
ng này. Không có tr ng n
ào ch
cho ta bi t s l ng c a

các c
u trúc trong m ng này. thay th , c u trúc cu i c
ùng s
có các tr ng c i n y các giá tr 0
(zeros).

Cùng v
i
Expo
rt Directory, b
n có th t
ìm th
y
Import Directory
âu b ng vi c quan sát t i Data
Directory
(80 bytes t
ch b t u c a PE Header). Trong ó th
ì thành ph
n u ti
ên và cu
i c
ùng là
quan tr
ng nh t :

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×